2010-05-15 2 views
0

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

답변

0

좋아 보인다,하지만 몇 가지 작은 개선이 내 마음에 와서 :

  • 당신은 스위치 케이스를 사용할 수있는 대신
  • 경우 - 다른-경우는 이벤트 -> 키에 대한 별칭을 만들 수 있습니다. keysym.sym은 읽기 쉽도록 만들어졌습니다.
관련 문제