Dans un effort pour m'enseigner la bibliothèque SDL (d'où mon handle de débordement de pile :)), je voulais m'essayer à un changeur latéral. Mon code est complet mais je veux un retour (surtout parce que j'ai une quantité atroce de déclarations if et else pour ce qui semble être une simple logique).Quelqu'un peut-il revoir le code de ma petite application SDL? Vous voulez vous assurer que je n'ai pas fait d'erreur débutant?
Mon "programme" est un défilement latéral C++ dans lequel vous déplacez un seul sprite sur l'écran. Pas de saut, de méchants, de pistolets, de scores, de niveaux ou de quoi que ce soit. Je voulais utiliser cela comme une base sur laquelle construire. Donc je me suis dit que si ma base était mauvaise, je pourrais me retrouver avec des applications futures assez mauvaises. C'est aussi multi-thread. Ensuite, je voudrais que la personne soit animée (de sorte qu'il semble marcher plutôt que de glisser) et que la personne accélère lorsque les boutons de la flèche sont maintenus enfoncés plus longtemps.
Le code est assez long mais voici ma méthode principale. Il y a un lien en bas pour l'ensemble du programme:
#include <iostream>
#include "SDL.h"
#include "game.hpp"
using std::cout;
using std::endl;
const int SCREENW = 200;
const int SCREENH = 200;
const int BPP = 32;
const int FPS = 24;
int event_loop(void* stuff);
int display_loop(void* stuff);
int main(int argc, char** argv) {
SDL_Init(SDL_INIT_EVERYTHING | SDL_INIT_EVENTTHREAD);
SDL_Thread* events_thurd;
SDL_Thread* display_thurd;
SDL_Surface* screen = SDL_SetVideoMode(SCREENW, SCREENH, BPP, SDL_SWSURFACE);
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
SDL_Event event;
Game* thug_aim = new Game(&event, screen, SCREENW, SCREENH, BPP);
events_thurd = SDL_CreateThread(event_loop, (void*)thug_aim);
display_thurd = SDL_CreateThread(display_loop, (void*)thug_aim);
SDL_WaitThread(events_thurd, NULL);
SDL_KillThread(display_thurd);
delete thug_aim;
return 0;
}
int event_loop(void* stuff) {
Game* gamez = (Game*)stuff;
SDL_Event* event = gamez->get_event();
while(1) {
while(SDL_PollEvent(event)) {
if(event->type == SDL_QUIT) {
return 0;
}
else if(event->type == SDL_KEYDOWN) {
if(event->key.keysym.sym == SDLK_LEFT || event->key.keysym.sym == SDLK_RIGHT) {
gamez->move(event->key.keysym.sym);
}
}
else if(event->type == SDL_KEYUP) {
if(event->key.keysym.sym == SDLK_LEFT || event->key.keysym.sym == SDLK_RIGHT) {
gamez->stop_move(event->key.keysym.sym);
}
}
else {
//not an event that concerns this game
}
}
}
}
int display_loop(void* stuff) {
Game* gamez = (Game*)stuff;
double period = 1/FPS * 1000;
Uint32 milli_period = (Uint32)period;
//get some of the attributes from gamez
SDL_Rect* background_rect = gamez->get_background_rect();
SDL_Rect* person_rect = gamez->get_person_rect();
SDL_Surface* screen = gamez->get_screen();
SDL_Surface* background = gamez->get_background();
SDL_Surface* person = gamez->get_person();
Uint32 start, end;
int sleep;
while(1) {
start = SDL_GetTicks();
//blit background
SDL_BlitSurface(background, background_rect, screen, NULL);
//blit person
SDL_BlitSurface(person, NULL, screen, person_rect);
end = SDL_GetTicks();
sleep = milli_period - (end - start);
if(sleep < 0) { sleep = 0; }
SDL_Delay((Uint32)sleep);
if(SDL_Flip(gamez->get_screen()) != 0) {
cout << "error drawing to screen: " << SDL_GetError() << endl;
}
}
}
Voici le lien vers le fichier .zip de tout mon code (s'il vous plaît ignorer quelques-uns des noms de variables ;-)): peut vous prendre un gars De toute façon regarde et dis-moi ce que tu penses? url