2012-01-02 4 views
0

SDL을 사용하여 C++에서 shmup 게임을위한 프로토 타입을 작성 중입니다 ... 지금은 클래스를 사용하지 않고 기본 작업을 수행하려고합니다. 이제 여러개의 총알을 쏘지 만 카운터가 리셋되는 방식 때문에 믿을 수없는 이상한 행동을합니다 ... 총알이 나타나고 사라지고 일부는 총알이 발사 된 지점에서 계속 깜박입니다 , 제한이 스크린 상에 있지 않더라도 어떤 것이 다시 쏠 수 있기 전에 때때로 지연이있을 것입니다 ... 그리고 때로는 플레이어 캐릭터가 갑자기 오른쪽으로 점프하고 오직 위아래로 움직일 수 있습니다. 어떻게하면 부드럽게 쏘을 수 있을까요? 나는 모든 관련 코드를 포함 시켰습니다 ...for 루프를 사용하여 여러 글 머리 기호를 올바르게 촬영하는 방법은 무엇입니까?

[편집] 내가 정리해 내면 모든 것을 정리하고 클래스로 옮기기를 원한다는 것을 명심하십시오. 이것은 단순한 프로토 타입이므로

[edit2] ePos는 적의 위치이고, pPos는 플레이어의 위치입니다.

//global 
SDL_Surface *bullet[10] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; 
bool shot[10]; 
int shotCount = 0; 
SDL_Rect bPos[10]; 

//event handler 
case SDLK_z: printf("SHOT!"); shot[shotCount] = true; ++shotCount; break; 

//main function 
for(int i = 0; i <= 9; i++) 
{ 
    shot[i] = false; 
    bullet[i] = IMG_Load("bullet.png"); 
} 

//game loop 
for(int i = 0; i <= shotCount; i++) 
{  
    if(shot[i] == false) 
    { 
     bPos[i].x = pPos.x; 
     bPos[i].y = pPos.y; 
    } 
    if(shot[i] == true) 
    { 
     bPos[i].y -= 8; 
     SDL_BlitSurface(bullet[i], NULL, screen, &bPos[i]); 

     if((bPos[i].y + 16 == ePos.y + 16) || (bPos[i].x + 16 == ePos.x + 16)) 
     { 
      shot[i] = false; 
     } 
     else if(bPos[i].y == 0) 
     { 
      shot[i] = false; 
     } 
    } 
} 

if(shotCount >= 9) { shotCount = 0; } 
+1

코드가 충분하지 않습니다. ePos 란 무엇입니까? 나는 단순함을 추구하면서 물건을 더 복잡하게 만들었다 고 생각합니다. IMO를 사용하면 간단한 글 머리 기호 클래스를 만든 다음 게임 루프에서 Bullet :: update()를 작성해야합니다. –

+0

좋아요. 지금 모든 것을 클래스로 이동하는 중입니다. for 루프와 배열을 계속 사용해야합니까? 아니면 새 연산자와 삭제 연산자를 사용해야합니까? – user1122136

답변

0

다음은 내가 코멘트에서 제안한 것과 같습니다. 그것은 단지 내 머리 꼭대기에서 쓰여졌지만 내가 말하는 것에 대한 일반적인 생각을 제공합니다.

class GameObject 
{ 
    public: 
     int x; 
     int y; 
     int width; 
     int height; 
     int direction; 
     int speed; 

    GameObject() 
    { 
     x = 0; 
     y = 0; 
     width = 0; 
     height = 0; 
     direction = 0; 
     speed = 0; 
    } 

    void update() 
    { 
     // Change the location of the object. 
    } 

    bool collidesWidth(GameObject *o) 
    { 
     // Test if the bullet collides with Enemy. 
     // If it does, make it invisible and return true 
    } 
} 

GameObject bullet[10]; 
GameObject enemy[5]; 

while(true) 
{ 
    for(int x=0; x<=10;x++) 
    { 
     bullet[x].update(); 
     for(int y=0;y<=5;y++) 
     { 
      if(bullet[x].collidesWith(&enemy[y]) 
      { 
       // Make explosion, etc, etc. 
      } 
     } 
    } 
} 
+0

아 ... 고맙습니다. 지금까지 작동하는 것처럼 보입니다 ... 나는 이것을 보았을 때 이미 수업을 작성했지만 실제로 총알을 처리하는 방법은 확실하지 않았습니다. – user1122136

+0

그래, 아이디어는 총알을 게임 루프를 정리하고 다른 것들에 대해 걱정할 수 있도록 자율적으로 만드는 것입니다. –

관련 문제