Как я могу упростить алгоритм появления своего игрового врага? (включенный фрагмент кода)

1

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

Неважно, если они вытесняются за пределы экрана, когда они появляются, все они подходят к нему. Было бы неважно, если этого не произошло, но это было просто легче.

В настоящий момент случайное расположение зомби создается для оси x со random(screenWidth) и y-осью random(screenHeight), и эти значения подаются в функцию spawnLocation которая в зависимости от того, где они относятся к герою, либо увеличились или уменьшились, чтобы отодвинуть их.

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

const state = {
  options: {
    numberOfZombies: 10,
  },
  characters: {
    hero: {
      xPosition: 150,
      yPosition: 150,
    },
  },
};

const screenWidth = 400;
const screenHeight = 400;

const random = range => Math.floor(Math.random() * range);

function createZombies(state) {
  const heroDistance = 10;
  const spawnLocation = (zomPos, heroPos, axisLength) => {
    return zomPos > heroPos
      ? zomPos + axisLength / heroDistance
      : zomPos - axisLength / heroDistance;
  };

  for (let index = 0; index < state.options.numberOfZombies; index += 1) {
    console.log({
      xPosition: spawnLocation(
        random(screenWidth),
        state.characters.hero.xPosition,
        screenWidth,
      ),
      yPosition: spawnLocation(
        random(screenHeight),
        state.characters.hero.yPosition,
        screenHeight,
      ),
    });
  }
}

createZombies(state);
  • 2
    Вы можете попробовать и здесь: codereview.stackexchange.com Кажется более подходящим
  • 0
    Я думал об этом, но я думаю, что уместно спросить, как улучшить код здесь? Это на самом деле не субъективно, если я могу сделать это в несколько строк и легче понять, то каждый должен поделиться этими знаниями.
Показать ещё 1 комментарий
Теги:

1 ответ

3
Лучший ответ

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

let theta = Math.random() * (2 * Math.PI)
let r = Math.random() * variationInR + minimumR

let zombieX = Math.cos(theta) * r + heroX
let zombieY = Math.sin(theta) * r + heroY

Если вы хотите, чтобы они были целыми числами, то сделайте их так. Это порождает зомби равномерно радиально от героя, по крайней мере, от minimumR единиц (расстояние Пифагора). Если вы хотите сохранить поведение на расстоянии в Манхэттене, затем сгенерируйте ваши dX и dY и добавьте их в положение героя.

  • 0
    Отлично, спасибо! Есть небольшая опечатка, она должна быть Math.random ()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню