Предел снарядов в обработке? - PullRequest
0 голосов
/ 31 марта 2020

У меня есть простой эскиз концепции для воссоздания игры Wii Play "Tanks", в которой используется подвижный игрок и щелчок для стрельбы. Я написал класс Bullet, который предоставляет методы void show(), void tick(Wall[] walls) и boolean offScreen(). Я хочу, чтобы класс Игрока был ограничен 5 пулями одновременно. Мое решение - это класс-оболочка для заданного количества пуль. Это dr aws каждый, тикает каждый, и т. Д. c., Но как только пуля находится за пределами экрана (или достаточно близко), она удаляет ее. "стены" - это список стен, которые класс пули обнаруживает и телепортирует за пределы экрана. Вот код для этого бита:

    Bullet[] goodBullets = new Bullet[limit];
    int goodCount = 0;
    for (int i = 0; i < limit; i++) {
      if (bullets[i] == null) {
        continue;
      } else if (bullets[i].offScreen()) {
        continue;
      } else {
        goodBullets[goodCount] = bullets[i];
        goodBullets[goodCount].tick(walls);
        goodCount++;
      }
    }
    bullets = goodBullets;

Я не могу помочь, но чувствую, что это ужасный способ справиться с этим. Есть ли какая-то очевидная вещь, по которой я скучаю?

1 Ответ

0 голосов
/ 31 марта 2020

У меня недостаточно кода, чтобы действительно оценить, является ли это хорошим шаблоном или как его улучшить, но мельком это имеет смысл.

В классе Bullet убедитесь, что вы не не рисовать, обновлять или проверять столкновения с закадровыми пулями. Вместо свойства «offscreen» я часто использую логическое значение «isVisible» (или все, что будет для вас значимым), которое я отключаю, как только объект перестает «существовать», так что я также прекращаю манипулировать им.

В конце концов, тратить хороший процессор на то, чтобы сделать эту пулю go в бесконечность и дальше, не так ли?

Вы правы в том, что можете улучшить if Я вижу здесь.

Хорошей практикой является расчет условий таким образом, чтобы это было утвердительно. Итак, вместо того, чтобы делать:

Check if:
1. bullet is null (then do nothing)
2. bullet is offscreen (then do nothing)
3. then do something

Вы должны просто проверить третий случай вместо:

Check if:
1. bullet isn't null or offscreen

Примерно так:

if (bullet[i] != null && !bullet[i].offScreen()) {
  goodBullets[goodCount] = bullets[i];
  goodBullets[goodCount].tick(walls);
  goodCount++;
}

Остальные logi c нелегко набросать asp и поразмышлять только из этого фрагмента, но я понимаю, что не так просто свести идею программы к абзацу кода - и, во всяком случае, толпа SO, как уточняйте c вопросов, так что "улучшить мои 3 страницы кода" - это обычно тот тип вопроса, который быстро удаляется.

И наконец: для достижения sh этой цели "только 5 пуль" но с некоторой эффективностью я бы подошел к ситуации, используя шаблон проектирования «пул объектов» . Короче говоря, вы можете создать класс, который будет «одалживать» вам пули и возвращать их, когда они не используются.

Получайте удовольствие!

...