Случайное движение угловое

В настоящее время я работаю над игрой, основанной на холсте 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
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
114
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вам понадобится постоянная скорость в определенном направлении в координатах 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
    );

Удачного кодирования! :)

привет, да, он начинает двигаться случайно, но только между западным и северо-западным направлениями. Однако, если бы я добавил getRandomInt (1,8) + x_velocity + Number (ball.attr ("cx")), то же самое с + y_velocity в операторе подписки, мяч сможет двигаться во всех направлениях, кроме того, что он на нем есть какая-то странная "вибрация", похожая на движение.

Maxxx 25.08.2018 12:06

У вас была такая проблема, когда он был установлен как 2? Мне интересно, возникает ли вибрация из-за того, что интервал установлен как 10. Не могли бы вы попробовать проверить это с помощью getRandomInt (1,2)?

Apogee 25.08.2018 12:12

очевидно, уменьшение его до (1,2) замедляет скорость. Но некоторая вибрация все же есть. Но без добавления getRandomInt (1,2) + x_velocity и getRandomInt (1,2) + y_velocity в оператор subscribe мяч не перемещается во всех направлениях, кроме северо-запада.

Maxxx 25.08.2018 12:19

Вибрация случилась с ball.attr("cx", 2 + Number(ball.attr("cx")))?

Apogee 25.08.2018 12:24

нет. Извините, я не понимаю. 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")), мяч движется во всех направлениях, за исключением того, что он вибрирует, чтобы это и неаккуратное движение.

Maxxx 25.08.2018 12:29

Нет, прошу прощения, мне кажется, я ошибся в функции getDirection (). Максимальное значение должно быть 2, а не 1. Я обновлю ответ! this.getRandomInt(0, 2) === 0? -1 : 1;

Apogee 25.08.2018 12:37

Понимаю! Спасибо!

Maxxx 25.08.2018 12:43

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

Maxxx 25.08.2018 13:21

Да, причина в том, что значение direction всегда одинаково для x и y. X и Y всегда будут положительными или отрицательными вместе, что означает, что они всегда будут в северо-западном или юго-восточном направлении. Я обновлю решение, чтобы решить эту проблему. Добавлен: directionX = this.getDirection();directionY = this.getDirection();.

Apogee 25.08.2018 13:28

Другие вопросы по теме