SDL 라이브러리 (따라서 스택 오버 플로우 처리 :)를 가르치기 위해 사이드 스크롤러에서 손을 사용하고 싶었습니다. 내 코드는 완전하지만 몇 가지 간단한 피드백을 원한다. (몇 가지 간단한 논리처럼 보이는 if 및 else 문구가 너무 많기 때문에).누군가 내 작은 SDL 앱을 검토 할 수 있습니까? 초보자 실수를하지 않았는지 확인하고 싶습니다.
내 "프로그램"은 화면에서 단일 스프라이트를 움직이는 C++ 사이드 스크롤러입니다. 점프, 나쁜 녀석, 총, 점수, 레벨 또는 아무것도. 나는 이것을 기반으로 구축하려고했다. 그래서 내 기지가 잘못되면 나는 꽤 나쁜 미래의 애플 리케이션으로 끝날 수 있다고 생각했습니다. 또한 멀티 스레드입니다. 다음에는 화살표 버튼을 길게 누르면 사람을 더욱 빠르게 움직일 수있을뿐만 아니라 사람 스프라이트를 애니메이션으로 만들려고합니다 (슬라이딩보다는 걷는 것처럼 보입니다).
코드가 길지만 여기에 내 주요 방법이 있습니다. 여기
#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;
}
}
}
이 (변수 이름의 일부를 무시하세요 ;-)) 내 모든 코드의 .zip 파일에 대한 링크입니다 : 전체 프로그램의 하단에 링크가있다 어쨌든 너희들이 걸릴 수 있습니다 당신이 생각하는 것을보세요.
url