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