Как сделать так, чтобы стрельба из нескольких пуль работала правильно, используя цикл for? - PullRequest
0 голосов
/ 02 января 2012

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

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

[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 Ответ

0 голосов
/ 02 января 2012

Вот то, что я предлагал в комментарии. Это было просто списано с моей головы, но оно дает вам общее представление о том, о чем я говорю ..

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.
            }
        }
    }
}
...