Заставить объект независимо перемещаться в SDL (как при выстреле из пистолета)

#c #sdl

#c #sdl

Вопрос:

Я следил за руководствами lazyfoos по SDL, и я сильно модифицировал его код, чтобы создать что-то вроде игры с кораблями, которая перемещается. Я пытаюсь заставить корабль стрелять, но я абсолютно не представляю, как это сделать. У меня есть корабль, его движения и фактическое применение изображения в классе, и мне интересно, есть ли у кого-нибудь какие-либо методы или определенные способы, которые эффективны для того, чтобы заставить корабль стрелять, заставляя кадр двигаться независимо, а затем исчезать, когда он уходит с экрана. Я знаю, что даю своего рода расплывчатое объяснение, но я не хочу, чтобы мне давали все ответы, просто небольшой пример кода и указание в правильном направлении.

Ответ №1:

Создайте класс для хранения снаряда со всей необходимой информацией в нем, например, такой:

 struct Projectile
{
    Vector2 position;
    Vector2 velocity;
    shared_ptr<Image> graphic;
    Time time_until_my_destruction;
    bool dead;

    void update(Time time_delta) {
        if(!dead) {
            position  = velocity * time_delta;
            time_until_my_destruction -= time_delta;
            if(time_until_my_destruction < 0.0) dead = true;
        }
    }

    void draw(DrawDest amp; dest) const {
        graphic->draw(dest, position);
    }

    bool checkCollision(const GameObject amp; object) const {
        return object.area().contains(position);
    }
};
  

Очевидно, что этот класс не является полным, вы, вероятно, захотите внести изменения в уровни доступа и написать некоторые конструкторы и другие вещи, но это должно дать вам основную идею.

Создайте контейнер из них. Когда корабль сработает, поместите один в контейнер. Каждый кадр вызывайте update, рисуйте, проверяйте, не разрядился ли снаряд, и проверяйте наличие столкновений с игровыми объектами. Если происходит столкновение, нанесите урон или что-то еще. Если объект мертв, удалите его из контейнера.

Комментарии:

1. Проблема в том, что я не могу определить местоположение корабля, который является его собственным отдельным классом, и мне это нужно, чтобы я мог, по крайней мере, сделать так, чтобы это выглядело так, как будто выстрел исходит из корабля

2. @Stan: Почему вы не можете добавить функцию getPosition() к классу ship?

3. Другой вариант — заставить корабль сам генерировать снаряд, используя свое собственное местоположение в качестве начального местоположения, что имеет смысл с точки зрения объектно-ориентированного программирования, поскольку это именно то, что произошло бы в реальной жизни.

4. Ваш корабль должен создавать все снаряды, а ваш класс Projectile должен иметь статический метод типа: Projectile::New (Position, Velocity); Затем внутри вашего класса ship есть метод Fire или аналогичный, который вызывает Projectile::New, передавая его положение и скорость.

5. @MetaCipher: Не уверен, зачем вам статический метод. Просто создайте конструктор с теми же аргументами.

Ответ №2:

Я могу только абсолютно рекомендовать учебные пособия по программированию игр Аарона, в них используются C и SDL.