Форум программистов, компьютерный форум CyberForum.ru

SDL ошибка на событии обработки нажатия кнопки мыши - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
22.09.2013, 23:22     SDL ошибка на событии обработки нажатия кнопки мыши #1
Не могу третий день разобраться. Использовал функцию SDL для обработки события нажатия левой кнопки мыши,
но как только компилятор доходит до строки с этой функцией (отметил комментарием), программа почему-то "вылетает"

Файл C_Events.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#pragma once
#include "C_LoadImages.h"
#include "C_DrawScene.h"
#include "C_InitSurfaces.h"
#include "SDL.h"
#include <Windows.h>
class C_Events {
  public:     
      C_Events() : x(0), y(0), w(0), h(0) {}
      C_Events(int xParam, int yParam, int wParam, int hParam)
                 : x(xParam), y(yParam), w(wParam), h(hParam) {
        o_rect_C_Events.x = x;
        o_rect_C_Events.y = y;
        o_rect_C_Events.w = w;
        o_rect_C_Events.h = h;
      }
 
    void buttonEvents(SDL_Event*, int);
    void scene_1_events();
    void scene_2_events();
    void scene_3_events();
    void scene_4_events();
  protected:
    SDL_Event o_SDL_Event_C_SceneElements;
  private:
    SDL_Rect o_rect_C_Events;
    int x, y, w, h;
};
Файл C_Events.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "C_Events.h"
void C_Events::buttonEvents(SDL_Event* o_event_C_Events, int numberOfButton) {
    int x = o_event_C_Events -> button.x;
    int y = o_event_C_Events -> button.y;       
        if(o_event_C_Events -> type == SDL_MOUSEBUTTONDOWN) {  // На данной строке программа прерывается
           if(o_event_C_Events -> button.button == SDL_BUTTON_LEFT)
                if((x > o_rect_C_Events.x) && (x < o_rect_C_Events.x + o_rect_C_Events.w) &&
                   (y > o_rect_C_Events.y) && (y < o_rect_C_Events.y + o_rect_C_Events.h))
                    switch(numberOfButton) {
                    case 0: // button "play"
                        SDL_WM_SetCaption("Play", NULL);                        
                        break;
                    case 1: // button "sound"
                        SDL_WM_SetCaption("Sound", NULL);                       
                        break;
                    case 2: // button "facebook"
                        ShellExecute(NULL, "open", "http://facebook.com",
                                     NULL, NULL, SW_SHOWNORMAL);
                        break;
                    case 3: // button "twitter"
                        ShellExecute(NULL, "open", "http://twitter.com",
                                     NULL, NULL, SW_SHOWNORMAL);
                        break;
                }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2013, 23:22     SDL ошибка на событии обработки нажатия кнопки мыши
Посмотрите здесь:

Эмуляция нажатия клавиш для SDL C++
C++ Ожидание нажатия определенной кнопки
Обработка события нажатия клавиши мыши в консоли C++
C++ SDL, surface, font непонятная ошибка
Эмуляция нажатия мыши в свёрнутом окне C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
coloc
погромист
 Аватар для coloc
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
22.09.2013, 23:28     SDL ошибка на событии обработки нажатия кнопки мыши #2
dimakozyr, что ты передаешь этой функции? Быть может указатель не валидный.
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
22.09.2013, 23:33  [ТС]     SDL ошибка на событии обработки нажатия кнопки мыши #3
Цитата Сообщение от coloc Посмотреть сообщение
dimakozyr, что ты передаешь этой функции? Быть может указатель не валидный.
Функции buttonEvents?

C++
1
o_button_1_play.buttonEvents(&o_SDL_Event_C_SceneElements, 0);
Вот. Первый аргумент типа SDL_Event:
C++
1
SDL_Event o_SDL_Event_C_SceneElements;
а второй int
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.09.2013, 00:16     SDL ошибка на событии обработки нажатия кнопки мыши #4
В отладчике смотрели, какой указатель поступает (валидный, невалидный).
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
23.09.2013, 00:20  [ТС]     SDL ошибка на событии обработки нажатия кнопки мыши #5
Цитата Сообщение от alsav22 Посмотреть сообщение
В отладчике смотрели, какой указатель поступает (валидный, невалидный).
Если честно, никогда с ним не работал. А можете кратко объяснить, как им пользоваться в VS?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.09.2013, 00:40     SDL ошибка на событии обработки нажатия кнопки мыши #6
Делаете точку останова (правой кнопкой щёлкаете на нужной строке), потом запускаете программу (в Debug). В этой точке программа остановится. Дальше можно пошагово перемещаться по коду (F10 - с заходом, F11 - с обходом (функций и пр.)). Если подвести курсор к какой-либо переменной, то появится окошко, в котором можно посмотреть данные этой переменной, в данный момент кода. Это так, кратко.
Миниатюры
SDL ошибка на событии обработки нажатия кнопки мыши  
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
23.09.2013, 01:25  [ТС]     SDL ошибка на событии обработки нажатия кнопки мыши #7
Похоже, ошибка не там, где я думал.
Отладчик выдает эксепшн здесь: SDL_Flip(screen);
А screen наследуется от другого класса
Миниатюры
SDL ошибка на событии обработки нажатия кнопки мыши  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.09.2013, 11:38     SDL ошибка на событии обработки нажатия кнопки мыши #8
У вас что, собственно, не получается? На каком этапе?

Добавлено через 9 часов 24 минуты
Что в коде, который в другой теме выкладывали, не устроило? Там же есть обработка событий мыши. Я его посмотрел. С небольшим исправлением, там, как-бы, всё работает.
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
23.09.2013, 11:50  [ТС]     SDL ошибка на событии обработки нажатия кнопки мыши #9
Цитата Сообщение от alsav22 Посмотреть сообщение
У вас что, собственно, не получается? На каком этапе?
Добавлено через 9 часов 24 минуты
Что в коде, который в другой теме выкладывали, не устроило? Там же есть обработка событий мыши. Я его посмотрел. С небольшим исправлением, там, как-бы, всё работает.
Да, код почти тот-же, только переделал архитектуру. Не получается вот что:
Есть главный метод, который вызывается из main, и запускает остальные методы:
C++
1
2
3
4
5
6
7
8
9
10
void C_GameCicle::startPoint() {
          o_initSDL_C_GameCicle.initSDL();
     o_initSurfaces_C_GameCicle.initSceen();     
       o_loadImagec_C_GameCicle.loadImagesScene_1();       
        o_drawScene_C_GameCicle.drawScene_1();            // Последнее, что отрабатывается
    o_sceneElements_C_GameCicle.scene_1_events();              
    SDL_WM_SetCaption("scene_1_events() is working", NULL);  // Это не отрабатывается
       o_loadImagec_C_GameCicle.quitImagesScene_1();
          o_initSDL_C_GameCicle.quitSDL();        
}
Идет инициализация SDL, загрузка изображений.
Когда изображения заргружаются, экран нужно обновить, чтобы они отобразились.
Я это делаю так "SDL_Flip(screen);", и вот именно здесь почему-то отладчик выдает эксепшн, никак не пойму почему
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.09.2013, 12:37     SDL ошибка на событии обработки нажатия кнопки мыши #10
Цитата Сообщение от dimakozyr Посмотреть сообщение
Да, код почти тот-же, только переделал архитектуру.
Он у вас события мыши обрабатывал? Имеется ввиду код, здесь выложенный: Функция get() не возвращает значение
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
23.09.2013, 13:39  [ТС]     SDL ошибка на событии обработки нажатия кнопки мыши #11
Цитата Сообщение от alsav22 Посмотреть сообщение
Он у вас события мыши обрабатывал? Имеется ввиду код, здесь выложенный: Функция get() не возвращает значение
screen необходим для блиттинга, т.е. отображения на экране изображений. А события мыши - это класс C_Events.
То был тот-же проект, но со старой неправильной архитектурой. Там я получал доступ к "screen" через getScreen(), теперь получаю доступ через наследование protected части класса.

Если сделать screen глобальным и объявить как extern, как вы в прошлой теме подсказали, то при компиляции ошибки выдает, поэтому оставил в proteced части класса.
Миниатюры
SDL ошибка на событии обработки нажатия кнопки мыши  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.09.2013, 13:52     SDL ошибка на событии обработки нажатия кнопки мыши #12
На вопрос не ответили.

Добавлено через 6 минут
Вот в этом коде всё работает с глобальным объектом: http://rusfolder.com/38139908
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
23.09.2013, 13:55  [ТС]     SDL ошибка на событии обработки нажатия кнопки мыши #13
Цитата Сообщение от alsav22 Посмотреть сообщение
Он у вас события мыши обрабатывал? Имеется ввиду код, здесь выложенный: Функция get() не возвращает значение
В смысле в архиве? Это весь код проекта, там бы описан весь функционал, который был на тот момент, включая обработку событий мыши
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.09.2013, 14:00     SDL ошибка на событии обработки нажатия кнопки мыши #14
Цитата Сообщение от dimakozyr Посмотреть сообщение
В смысле в архиве? Это весь код проекта, там бы описан весь функционал, который был на тот момент, включая обработку событий мыши
Я же не спрашиваю: описан он был или нет (это я и сам вижу), а рботала ли обработка событий мыши? Проверяли тот код на это? Я когда выяснял, где там ошибка, на это не смотрел, тема была другая. Поэтому и спрашиваю.
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
23.09.2013, 14:06  [ТС]     SDL ошибка на событии обработки нажатия кнопки мыши #15
Цитата Сообщение от alsav22 Посмотреть сообщение
Поэтому и спрашиваю.
Аа, да обработка работала. Т.е. загружались все изображения стартового экрана: фон, кнопки "начать", "звук", "faccebook" и "twitter". При нажатии на "faccebook" и "twitter", в браузере открывались эти сайты. При нажатии на "начать" и "звук" изменялось название окна программы (для тестирования)

Но потом я что-то изменил и функция SDL_Flip(screen) перестала работать
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.09.2013, 14:13     SDL ошибка на событии обработки нажатия кнопки мыши #16
Цитата Сообщение от dimakozyr Посмотреть сообщение
Аа, да обработка работала.
Вот это странно. Я когда этим кодом занимался, то обратил внимание, что окно никак не реагировало на закрытие, но тогда тема была другая, поэтому не стал разбираться. А вчера посмотрел этот код и убедился, что обработка там не работает.
Новый код давайте. Если вечером будет время, то посмотрю, почему ошибка.
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
23.09.2013, 14:17  [ТС]     SDL ошибка на событии обработки нажатия кнопки мыши #17
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот это странно. Я когда этим кодом занимался, то обратил внимание, что окно никак не реагировало на закрытие
Да, тот код, что я сода загрузил, уже не работал. Самое обидное, что пользуюсь гитом и у меня там была рабочая версия, но вспомнил о ней уже когда удалил репозиторий.

Прикрепил новый код
Вложения
Тип файла: 7z BeaverGame.7z (1.48 Мб, 4 просмотров)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.09.2013, 19:13     SDL ошибка на событии обработки нажатия кнопки мыши #18
Кликните здесь для просмотра всего текста
В данном случае, причина ошибки та же, что и в предыдущей теме. Инициализируется один screen, а метод getScreen() выдаёт другой, неинициализированный, screen. Опять тут два screen: один в объекте класса C_InitSurfaces, который создаётся в классе C_GameCicle, другой в базовой части объекта класса C_SceneElements (производный от C_InitSurfaces), который также создаётся в классе C_GameCicle. Инициализируется тот, что в объекте C_InitSurfaces, а метод базового (для C_SceneElements) класса getScreen(), вызывается в методе scene_1_events() класса C_SceneElements, который и выдаёт неинициализированный screen. Решается передачей в метод scene_1_events() адреса объекта класса C_InitSurfaces, создаваемого в классе C_GameCicle.
Но всех проблем это не решает. Почему-то не выводятся картинки. Причину не понял. Подумал, что может тоже: картинки в одном классе грузятся, а Flip в другом. Пробовал делать Flip прямо в C_GameCicle::startPoint(), не помогло. Плохо я понимаю, куда грузятся картинки, и что делает Flip.
И исправил обработку событий (которые не работали). Причина тоже туманна, но нужно, чтобы метод getEvent()
возвращал указатель, а не объект.
Изменения (может что-то упустил, но компилятор подскажет):
C++
1
SDL_Event* getEvent() { return &o_SDL_Event_C_SceneElements; }
C++
1
void scene_1_events(C_InitSurfaces*);
C++
1
2
3
4
5
6
7
8
9
10
11
12
void C_GameCicle::startPoint() 
{
    o_initSDL_C_GameCicle.initSDL();
    o_initSurfaces_C_GameCicle.initSceen();  
    o_loadImagec_C_GameCicle.loadImagesScene_1();      
    o_drawScene_C_GameCicle.drawScene_1();
    
    o_sceneElements_C_GameCicle.scene_1_events(&o_initSurfaces_C_GameCicle);
    
    o_loadImagec_C_GameCicle.quitImagesScene_1();
    o_initSDL_C_GameCicle.quitSDL();
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void C_SceneElements::scene_1_events(C_InitSurfaces *p) {
    C_Events o_button_1_play    (150, 100, 650, 218);
    C_Events o_button_1_sound   (200, 400, 106, 106);
    C_Events o_button_1_facebook(400, 400, 106, 106);
    C_Events o_button_1_twitter (600, 400, 106, 106);
    o_loadImages_C_SceneElements.loadImagesScene_1();
    int isCicleEnd = 0;
    while(isCicleEnd == 0)
        if(SDL_PollEvent(getEvent())) {
            o_button_1_play.    buttonEvents(getEvent(), 0);
            o_button_1_sound.   buttonEvents(getEvent(), 1);
            o_button_1_facebook.buttonEvents(getEvent(), 2);
            o_button_1_twitter. buttonEvents(getEvent(), 3);
            
            if(getEvent() ->type == SDL_QUIT)
                isCicleEnd = 1;
            //if(getEvent().type = SDL_KEYDOWN &&
              // getEvent().key.keysym.sym == SDLK_ESCAPE)
                //isCicleEnd = 1;
           
            SDL_Flip(p ->getScreen());
        }
    o_loadImages_C_SceneElements.quitImagesScene_1();
}
Архитектура, по-моему, неудачна. Обычно, инициализация и обработка событий, делается в главном классе, в котором и должно всё происходить. Остальные классы вспомогательные. Здесь же всё разбросано, поэтому происходят неувязки.
coloc
погромист
 Аватар для coloc
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
23.09.2013, 19:53     SDL ошибка на событии обработки нажатия кнопки мыши #19
Цитата Сообщение от alsav22 Посмотреть сообщение
Архитектура, по-моему, неудачна. Обычно, инициализация и обработка событий, делается в главном классе, в котором и должно всё происходить. Остальные классы вспомогательные. Здесь же всё разбросано, поэтому происходят неувязки.
Поддерживаю. Нужно делать как можно проще и понятнее.
например, можно вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class CGame
{
    public:
        CGame();
        ~CGame();
        
        int execute();
        
    private:
            bool onInit();
        bool onLoad();
        int  onCleanup(int ret_val);
        void onRender();
        void onEvent();
        void onLogic();
};
И потом уже от этого класса плясать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2013, 23:03     SDL ошибка на событии обработки нажатия кнопки мыши
Еще ссылки по теме:

C++ Координаты точки нажатия мыши.
SDL + C++ = Тормозит событие нажатия кнопки C++
Как вывести текст на экран, используя библиотеку SDL TTF для SDL 2? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
23.09.2013, 23:03  [ТС]     SDL ошибка на событии обработки нажатия кнопки мыши #20
Цитата Сообщение от alsav22 Посмотреть сообщение
причина ошибки та же, что и в предыдущей теме.
Все, теперь точно понял, буду использовать ссылки и указатели.

Цитата Сообщение от alsav22 Посмотреть сообщение
Плохо я понимаю, куда грузятся картинки, и что делает Flip.
Flip обновляет экран. Например, если на экран загружено изображение и не вызвать Flip(screen), где screen - самый нижний слой, на который накладываютя остальные изображения (фон, изображения кнопок и т.д.), то новое изображение не отобразится. Больше и сам по этому поводу не могу сказать, т.к. глубоко не копал.

Цитата Сообщение от alsav22 Посмотреть сообщение
Но всех проблем это не решает. Почему-то не выводятся картинки.
И на этом спасибо, хоть сдвинулся с мертвой точки

Цитата Сообщение от coloc Посмотреть сообщение
Архитектура, по-моему, неудачна.
Цитата Сообщение от coloc Посмотреть сообщение
Поддерживаю. Нужно делать как можно проще и понятнее.
Хотел, чтобы каждый класс выполнял какое-либо одно назначение. А можете посоветовать литературу по архитектуре классов? В разделе "литература" смотрел, но такого не нашел
Yandex
Объявления
23.09.2013, 23:03     SDL ошибка на событии обработки нажатия кнопки мыши
Ответ Создать тему
Опции темы

Текущее время: 00:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru