2010-12-17 3 views
1

у нас есть (псевдо) такой код:SDL: Задержка до ввода с клавиатуры

GetInput() 
{ 
//insert keyboard stuff here 
} 

Update() 
{ 
//insert rendering stuff here 
} 

void game::loop() 
{ 
game.Update(); 
player.GetInput(); 
} 

Как будет идти об ожидании игрока, чтобы дать вход перед обновлением Что на экране?

ответ

1

Почему бы не переключить заказ (GetInput), затем заблокировать в GetInput и не возвращаться, пока пользователь не введет что-нибудь приемлемое?

+0

Да, но как именно я не могу вернуться, пока пользователь не введет что-то приемлемое? Это сам вопрос. Также я хотел бы добавить, что это «пошаговая» игра, и она требует, чтобы вы сначала показали игроку изображение, а затем попросили их ввести их. :) – Lemmons 2010-12-17 05:54:55

1

Возможно, вы действительно хотите подождать? Не нужно быть навязчивым, но обычно в играх лучше продолжать рисовать материал на экране, ожидая любого типа. Потому что игроки не хотят видеть одну и ту же картину все время.

0

Существует SDL_WaitEvent, который может быть более подходящим для вас.

От http://gpwiki.org/index.php/SDL:Tutorials:Practical_Keyboard_Input

SDL_Event keyevent; //The SDL event that we will poll to get events. 

while (SDL_PollEvent(&keyevent)) //Poll our SDL key event for any keystrokes. 
{ 
    switch(keyevent.type){ 
    case SDL_KEYDOWN: 
     switch(keyevent.key.keysym.sym){ 
     case SDLK_LEFT: 
      charx -= 1; 
      break; 
     case SDLK_RIGHT: 
      ... 

Но лично я не нравится. Я предпочитаю использовать SDL_GetKeyboardState, где я могу проверить, сохранен ли мой ключ или нет.

0

Чтобы сделать игру пошаговой, я рекомендую массив объектов с методами, которые представляют возможности игрока в игре. У вас может быть игровой цикл, вложенный круглый цикл, вложенный цикл поворота и логическое значение, которое выходит из цикла и поворачивает петли, когда игрок выигрывает.

С вашим текущим псевдокодом вы можете использовать переключатель и целое число в методе Update, чтобы приравнять эти вложенные циклы.

Пример Tic Tac Toe AI:

#include "Shared.h" 
#include "Board.h" 

#ifndef AI_H_ 
#define AI_H_ 

class AI{ 
    public: 
    AI(); 
    enum difficulty{Easy, Medium, Hard}; 
    void setAlgorithm(difficulty h); 
    void applyAlgorithm(Board* b, int columns, int rows); 
    private: 
    Board::spot type; 
     difficulty harder; 
    void easy(Board* b, int columns, int rows); 
    void medium(Board* b, int columns, int rows); 
    void hard(Board* b, int columns, int rows); 
}; 

#endif /*AI_H_*/ 

SDL_WaitEvent() смехотворно более эффективен, чем SDL_PollEvent(), если вы не хотите, чтобы заграбастать процессор.

while(!quit){ 
    if(SDL_WaitEvent(&event)){ 
     if(event.type == SDL_QUIT){ 
      quit = true; 
     }else if(event.type == SDL_MOUSEBUTTONDOWN){ 
      if(!menu.isClicked()){ 
       if(menu.handleEvent(&event)){ 
       } 
      } 
     } 
    } 
} 
Смежные вопросы