Войти
ПрограммированиеФорумОбщее

Работа с мышкой в SDL проблема с SDL_Event

#0
11:52, 4 июля 2010

Вопрос: правильно ли передавать внутрь функций событие мышки SDL_Event event?
или же надо каждый раз надо писать нечто:

int mouse_x = 0;
int mouse_y = 0;
SDL_PumpEvents();
if(SDL_BUTTON(1) & SDL_GetMouseState(&mouse_x, &mouse_y))
{
   //Тут если передаем в меню то выбирается кнопка меню по нажатию например Запуск игры.
}

Етот кусок кода используется в данный момент несколько раз, и судя по всему происходит задержка в ожидании нажатия мышки.
При нажатии на обьект приходится не нажимать на кнопку мышки а прям зажимать ее чтоб произошло действие.
Думаю ето из-за многократного использования ф-ций SDL_PumpEvents();


//Код главной ф-ции (сокращенный):

while(!done)
    {
        while(SDL_PollEvent(&event))
        {
            switch(event.type)
            {
                case SDL_QUIT:
                    done = true;
                    break;
            }
        }
        switch(menu)
        {
            case 'm': //Menu
                loadMenu();                     <-сюда event
                break;

            case 'r': //Game
                loadGame();                    <-сюда event
                break;

            case 'e':
                menu.exit();
                return 0;
                break;

            default: break;
        }

        SDL_GL_SwapBuffers();
    }
#1
13:05, 4 июля 2010

Во первых, SDL_PumpEvents() собирает все события. которые произошли в течение игрового цикла в очередь событий.
SDL_PollEvent сама вызывает SDL_PumpEvents(), поэтому вызывать её вручную не обязательно.
Что означает конструкция

 while(SDL_PollEvent(&event))
        {
            switch(event.type)
            {
                case SDL_QUIT:
                    done = true;
                    break;
            }
        }

При вызове SDL_PollEvent берётся очередное событие из очереди, удаляется из очереди и заносится в параметр event, переданный по ссылке.

Просто вызывай SDL_PollEvent, и все данные о мыши ты получишь так:

switch (event.type) {
            case SDL_MOUSEMOTION:
                event.motion.x // Координаты мыши
                event.motion.y // Координаты мыши
            break;

            case SDL_MOUSEBUTTONDOWN:
              event.button.button // Кнопки мыши. Константы: SDL_BUTTON_LEFT, SDL_BUTTON_MIDDLE, SDL_BUTTON_RIGHT, SDL_BUTTON_WHEELUP, SDL_BUTTON_WHEELDOWN
            break;
}

#2
14:55, 4 июля 2010

Что означает конструкция
while(SDL_PollEvent(&event))
        {
            switch(event.type)
            {
                case SDL_QUIT:
                    done = true;
                    break;
            }
        }

Так как в игре не важен ФПС , игра является клоном Bubble Breaker на Windows Mobile 6 (понравилась)
цикл ждет пока будет какое либо действие от пользователя.

Тоесть без проблем могу использовать event так?

switch(menu)
        {
            case 'm': //Menu
                loadMenu(event);                     //ссылка 
                break;
               ...
        }
int loadMenu(&event)
{
     if((event.button.button == SDL_BUTTON_LEFT) & (event.button.type == SDL_MOUSEBUTTONDOWN))
    {
           if((event.button.x > 0) & (event.button.x < 100))
               if((event.button.y >0) & (event.button.y <30))
                  {
                          //Например ф-ция выхода из игры или запуска
                  }
     }
}
#3
15:43, 4 июля 2010

Да, но вся работа с переменной event должна находиться в цикле
while(SDL_PollEvent(&event)) {
    ...     
}

И ещё, обязательно нужно проверять тип события:
switch (event.type){
case SDL_MOUSEMOTION:
case SDL_MOUSEBUTTONDOWN:
}

Потому, что в очередь ставятся все события, в т.ч. события клавиатуры, поэтому прежде чем работать с данными события, нужно убедиться, что оно нужного нам типа.

ПрограммированиеФорумОбщее

Тема в архиве.