У меня есть геройский персонаж в середине экрана, и я хочу всплывать вокруг него зомби в случайных позициях, но на некотором расстоянии от него. 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);
Создайте случайный угол и радиус, а затем преобразуйте эти значения в декартовы координаты.
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
и добавьте их в положение героя.