2010-06-12 5 views
3

Может кто-то написать источник для программы, которая просто имеет «игровой цикл», который просто продолжает цикл, пока вы не нажмете Esc, и программа покажет основное изображение. Это источник, который у меня есть прямо сейчас, но я должен использовать SDL_Delay(2000);, чтобы сохранить программу в течение 2 секунд, во время которой программа заморожена.Пример цикла игры C++

#include "SDL.h" 

int main(int argc, char* args[]) { 

    SDL_Surface* hello = NULL; 
    SDL_Surface* screen = NULL; 

    SDL_Init(SDL_INIT_EVERYTHING); 

    screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE); 

    hello = SDL_LoadBMP("hello.bmp"); 

    SDL_BlitSurface(hello, NULL, screen, NULL); 

    SDL_Flip(screen); 

    SDL_Delay(2000); 

    SDL_FreeSurface(hello); 

    SDL_Quit(); 

    return 0; 

} 

Я просто хочу, чтобы программа открывалась до тех пор, пока я не нажму Esc. Я знаю, как работает цикл, я просто не знаю, реализую ли я внутри функции main() или за ее пределами. Я пробовал оба, и оба раза это не удалось. Если бы вы могли помочь мне, что было бы здорово: P

+0

http://gpwiki.org/index.php/SDL:Tutorials:Practical_Keyboard_Input –

+1

Specify * * не удалось, пожалуйста. – Dario

+3

Вы даже пробовали поисковую систему? Есть тысячи обучающих онлайн-приложений, которые точно соответствуют вашим потребностям. –

ответ

2

Пытались что-то вроде

SDL_Event e; 
    while(SDL_WaitEvent(&e)) 
    { 
    if (e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_ESCAPE) break; 
    } 

? Вы можете найти множество учебников и примеров; просто fast-search example.

Добавлена ​​примечание: WaitEvent «замораживает» программу, чтобы вы ничего не могли сделать. Вы просто ждете; может потребоваться другая ожидающая техника (как PollEvent, или WaitEvent снова после инициализации таймера).

+1

Ожидание, пока пользовательский ввод не сделает игровой цикл. –

+1

он делает, если ваша «игра», сначала на самом деле не игра, тогда ей не нужен ровно «игровой цикл», так как пока что ничего не нужно обновлять, и вы (как OP) просто спрашиваете «Покажите изображение, пока не нажмете кнопку», что было моей интерпретацией вопроса OP. Не говоря уже о том, что событие для цикла может быть вызвано таймером - факт, указанный в самом ответе. – ShinTakezou

-3
#include <conio.h> 

... 

while (!kbhit()) 
{ 
    hello = SDL_LoadBMP("hello.bmp"); 

    SDL_BlitSurface(hello, NULL, screen, NULL); 

    SDL_Flip(screen); 
} 

... 
+4

самый худший ответ среди всех остальных.1) он использует специальную библиотеку Windows, в то время как SDL является мультиплатформенным; 2) SDL уже предоставляет свой способ обработки ключевых событий, и смешивание этого способа - baaad; 3) все ключи завершают цикл, не только Esc (OP забыл свою собственную «спецификацию» в вопросе, и это квалифицирует его как нехорошего опрометчика); 4) поскольку общий способ плох, поскольку он не говорит, как узнать, какой ключ был поражен); 5) цикл «строгий» опрос ни за что, и ничего не меняется, загружая «миллион» раз изображение, а не раз навсегда ... cputime eater и eater e ... Мой первый -1 – ShinTakezou

+0

Да, это не предназначено для копирования и вставки ответ, но это быстрый способ получить то, что первоначально хотел ОП. 3, 4 и 5 легко удовлетворить и расширить. – Inverse

+0

Что такое kbhit, как здесь? –

2

Поскольку вы уже используете SDL, вы могли бы использовать SDL_PollEventfunction запустить event loop, проверяя, если нажатие клавиши событие было ESC. Похоже, это будет по линии mySDL_Event.key.keysym.sym == SDLK_ESCAPE.

5

Вот полный и рабочий пример. Вместо использования регуляции времени кадра вы также можете использовать SDL_WaitEvent.

#include <SDL/SDL.h> 
#include <cstdlib> 
#include <iostream> 

using namespace std; 

const Uint32 fps = 40; 
const Uint32 minframetime = 1000/fps; 

int main (int argc, char *argv[]) 
{ 

    if (SDL_Init (SDL_INIT_VIDEO) != 0) 
    { 
    cout << "Error initializing SDL: " << SDL_GetError() << endl; 
    return 1; 
    } 

    atexit (&SDL_Quit); 
    SDL_Surface *screen = SDL_SetVideoMode (640, 480, 32, SDL_DOUBLEBUF); 

    if (screen == NULL) 
    { 
    cout << "Error setting video mode: " << SDL_GetError() << endl; 
    return 1; 
    } 

    SDL_Surface *pic = SDL_LoadBMP ("hello.bmp"); 

    if (pic == NULL) 
    { 
    cout << "Error loading image: " << SDL_GetError() << endl; 
    return 1; 
    } 

    bool running = true; 
    SDL_Event event; 
    Uint32 frametime; 

    while (running) 
    { 

    frametime = SDL_GetTicks(); 

    while (SDL_PollEvent (&event) != 0) 
    { 
     switch (event.type) 
     { 
     case SDL_KEYDOWN: if (event.key.keysym.sym == SDLK_ESCAPE) 
          running = false; 
          break; 
     } 
    } 

    if (SDL_GetTicks() - frametime < minframetime) 
     SDL_Delay (minframetime - (SDL_GetTicks() - frametime)); 

    } 

    SDL_BlitSurface (pic, NULL, screen, NULL); 
    SDL_Flip (screen); 
    SDL_FreeSurface (pic); 
    SDL_Delay (2000); 

    return 0; 

} 
+0

Не будет ли это очень интенсивным? Должна ли быть небольшая задержка в цикле? – AntonioCS

+0

Что случилось с интенсивностью процессора? Если я куплю процессор, я хочу, чтобы игра использовала его.Если бы он сидел при 100% использовании, я бы подумал о покупке более быстрого, чтобы не было узким местом GPU. – rfcoder89

Смежные вопросы