Неограниченное количество пуль
Я пытаюсь сделать шутер на C# с SFML.NET, но я не представляю, как сделать возможность стрелять более чем из одной пули, потому что теперь у меня есть только один нулевой объект класса пули, и когда игрок нажимает пробел ключ этот объект получает ссылку на новый маркер.
Итак, у меня есть Bullet-класс, нуль-объект
public static Bullet bullet = null;
и состояние
if (Keyboard.IsKeyPressed(Keyboard.Key.Space))
{
if(bullet == null)
bullet = new Bullet(t, p.rect.Left, p.rect.Top, p.reverse);
}
Когда пуля достигает стены или объект пули противника приравнивается к нулю. Проблема заключается в том, чтобы заставить стрелять больше пуль, прежде чем эта пуля достигнет стены или врага (и исчезнет). Я думаю, что это не очень хорошее решение для создания нулевых объектов для каждой возможной пули, потому что тогда у нас ограниченное количество возможных пуль.
3 ответа
Я бы не предложил создавать список пуль, а скорее массив патронов.
Когда клавиша нажата, вы можете добавить еще одну пулю в массив и запустить логику обновления для всех пуль в массиве.
Это также позволит вам вернуться к началу, чтобы повторно использовать память вместо бесконечного увеличения списка.
Так, например, в вашем keyPressedEvent:
If space on keyboard is pressed
Increment bulletCounter
if(bulletCounter > length of bullets array)
set bulletCounter = 0;
Set bullets[bulletCounter] = new Bullet(parameters)
Вы должны изучить основы игрового программирования. Для этой ситуации вы бы использовали массив, содержащий N количество пуль.
Bullet равняется нулю только один раз, и здесь не нужно использовать статические значения... удалите if(bullet == null) и замените public static Bullet bullet = null; со списком пуль; Примерно так должно работать:
List<Bullet> bullets = new List<Bullet>();
Событие KeyPressed
if(Keyboard.IsKeyPressed(Keyboard.Key.Space))
{
bullets.Add(new Bullet(t, p.rect.Left, p.rect.Top, p.reverse));
}
Вместо установки пули в ноль, когда она попадает в стену, избавьтесь от / избавьтесь от нее, возможно, от пуль. Удалите (). Нет смысла держать это правильно? Надеюсь, это приведет вас туда, куда вам нужно.
Изменить: на самом деле может быть разумно ограничить количество пуль, которые могут быть созданы путем создания массива вместо списка, как упомянул другой человек. Что делать, если клавиша пробела застряла?
Bullet[] bullets = new Bullet[1000];
Может быть, что-то подобное...