Случайное движение угловое - PullRequest
0 голосов
/ 25 августа 2018

В настоящее время я работаю над игрой, основанной на svg canvas, как показано

enter image description here

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

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
}

1 Ответ

0 голосов
/ 25 августа 2018

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

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

...