2012-01-02 1 views
0

Я работаю над прототипом для shmup-игры на C++, используя SDL ... Сейчас я просто пытаюсь заставить основы работать без использования классов. Теперь у меня есть так, что он стреляет несколькими пулями, но он ведет себя странно, что, по моему мнению, связано с тем, как сбрасывается счетчик ... Пули появятся и исчезнут, а некоторые будут мигать в исходном месте, которое они снимали , и иногда будет задержка до того, как можно будет снова выстрелить, даже если предел не на экране ... И иногда персонаж игрока внезапно прыгает вправо и может двигаться только вверх и вниз. Как исправить это, чтобы он плавно стрелял? Я включил весь соответствующий код ...Как сделать стрельбу несколькими пулями правильно, используя цикл for?

[edit] Обратите внимание, что я намерен очистить его и перенести все это в класс, как только я получу это. Это простой прототип, поэтому я могут иметь основы игры, запрограммированной в.

[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? Я считаю, что в ваших поисках простоты вы усложнили ситуацию. ИМО вы должны создать простой класс bullet, а затем просто 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

Да, идея состоит в том, чтобы создать пулевую автономию, которая очищает ваш игровой цикл и позволяет вам беспокоиться о других вещах. –

Смежные вопросы