В настоящее время я работаю над игрой, основанной на холсте svg, как показано
и что я пытаюсь сделать сейчас, так это позволить мячу перемещаться случайным образом после начала игры, но у меня возникают трудности с кодированием случайного движения.
function createBall() {
const svg = document.getElementById("canvas")!,
ball = new Elem(svg, 'circle') #create the ball
.attr("cx",300).attr("cy",300)
.attr("r",8)
.attr('fill','grey');
Observable.interval(10).takeUntil(Observable.interval(4000)) #10 milliseconds until 4000 milliseconds
.subscribe( () => ball.attr("cx", 2 + Number(ball.attr("cx")))); #I'm having issue here when i subscribe as i can only allow the ball to move to the right at the moment, aside from being random
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я думаю, вам понадобится постоянная скорость в определенном направлении в координатах x и y.
Я предлагаю создать два случайных целых числа для x_velocity и y_velocity. Вы можете попробовать использовать Math.random () и Math.floor ():
function getRandomInt(min, max) {
return Math.floor((Math.random() + min) * Math.floor(max));
}
Затем вам нужно будет определить направление, отрицательное (идти налево) или положительное (идти направо):
function getDirection() {
return this.getRandomInt(0, 2) === 0? -1 : 1;
}
Используйте эти две функции для настройки x_velocity и y_velocity. Теперь мяч должен двигаться влево, вправо, вверх или вниз:
directionX = this.getDirection();
directionY = this.getDirection();
x_velocity = directionX * this.getRandomInt(1,8); // the number will be between -8 and 8 excluding 0
y_velocity = directionY * this.getRandomInt(1,8); // same here
Observable.interval(10).takeUntil(Observable.interval(4000))
.subscribe( () => {
ball.attr("cx", x_velocity + Number(ball.attr("cx"))); // the ball should go towards the left or the right
ball.attr("cy", y_velocity + Number(ball.attr("cy"))); // the ball should go up or down
);
Удачного кодирования! :)
У вас была такая проблема, когда он был установлен как 2? Мне интересно, возникает ли вибрация из-за того, что интервал установлен как 10. Не могли бы вы попробовать проверить это с помощью getRandomInt (1,2)?
очевидно, уменьшение его до (1,2) замедляет скорость. Но некоторая вибрация все же есть. Но без добавления getRandomInt (1,2) + x_velocity и getRandomInt (1,2) + y_velocity в оператор subscribe мяч не перемещается во всех направлениях, кроме северо-запада.
Вибрация случилась с ball.attr("cx", 2 + Number(ball.attr("cx")))?
нет. Извините, я не понимаю. x_velocity + Number (ball.attr ("cx") и y_velocity + Number (ball.attr ("cy") отлично работает, как было предложено). Но он перемещается только на северо-запад с небольшим сдвигом. Это когда я пытался добавить getRandomInt (1,8 ) + x_velocity + Number (ball.attr ("cx")) и getRandomInt (1,8) + y_velocity + Number (ball.attr ("cy")), мяч движется во всех направлениях, за исключением того, что он вибрирует, чтобы это и неаккуратное движение.
Нет, прошу прощения, мне кажется, я ошибся в функции getDirection (). Максимальное значение должно быть 2, а не 1. Я обновлю ответ! this.getRandomInt(0, 2) === 0? -1 : 1;
Понимаю! Спасибо!
привет, извините за вопрос, но есть ли причина, по которой мяч движется только между северо-западом и юго-востоком только сейчас, когда я пытался обновить страницу несколько раз. Похоже, что координаты не складываются с этими недостающими направлениями.
Да, причина в том, что значение direction всегда одинаково для x и y. X и Y всегда будут положительными или отрицательными вместе, что означает, что они всегда будут в северо-западном или юго-восточном направлении. Я обновлю решение, чтобы решить эту проблему. Добавлен: directionX = this.getDirection();directionY = this.getDirection();.
привет, да, он начинает двигаться случайно, но только между западным и северо-западным направлениями. Однако, если бы я добавил getRandomInt (1,8) + x_velocity + Number (ball.attr ("cx")), то же самое с + y_velocity в операторе подписки, мяч сможет двигаться во всех направлениях, кроме того, что он на нем есть какая-то странная "вибрация", похожая на движение.