C++ ciclo di gioco esempio
Domanda
Qualcuno può scrivere un sorgente di un programma che ha un "ciclo di gioco", che continua il ciclo fino a quando si preme Esc, e il programma mostra una immagine di base.Heres la fonte che ho adesso, ma devo usare SDL_Delay(2000);
per mantenere il programma in vita per 2 secondi, durante i quali il programma è bloccato.
#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;
}
Voglio solo il programma da aprire fino a quando premo il tasto Esc.Io so come il loop funziona, solo che non so se ho implementare all'interno del main()
funzione, o al di fuori di esso.Ho provato entrambi, e per due volte non è riuscito.Se si potesse aiutarmi sarebbe fantastico :P
Soluzione
Provato con qualcosa di simile
SDL_Event e;
while( SDL_WaitEvent(&e) )
{
if (e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_ESCAPE) break;
}
?Si possono trovare molti tutorial e con l'esempio, là fuori;solo un fast-esempio di ricerca.
Aggiunta di una nota:WaitEvent "congela" il programma in modo che non si può fare nulla ..devi solo aspettare;altri in attesa tecniche può essere desiderato (come PollEvent, o WaitEvent di nuovo dopo il initializtion di un timer).
Altri suggerimenti
Ecco un esempio completo e funzionante. Invece di usare un regolamento frame-tempo è anche possibile utilizzare 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;
}
Dal momento che si sta già utilizzando SDL, si potrebbe utilizzare la funzione SDL_PollEvent
per eseguire un evento ciclo , il controllo per vedere se l'evento premere il tasto ESC è stato. Sembra che questo sarebbe lungo le linee di mySDL_Event.key.keysym.sym == SDLK_ESCAPE
.
#include <conio.h>
...
while (!kbhit())
{
hello = SDL_LoadBMP("hello.bmp");
SDL_BlitSurface(hello, NULL, screen, NULL);
SDL_Flip(screen);
}
...