Я пытаюсь добиться кругового движения влево/вправо внутри моего основного круга. У меня класс Круг и Мяч. Круг отвечает за рисование «круга», куда я помещаю свой Мяч, который движется внутри.
class Circle {
constructor(gameWIdth, gameHeight) {
this.gameHeight = gameHeight;
this.gameWIdth = gameWIdth;
this.circX = 100;
this.circY = 100;
this.radius = 55;
}
draw(context) {
context.beginPath();
context.fillStyle = "white";
context.arc(
this.gameWIdth / 2,
this.gameHeight / 2,
100,
0,
Math.PI * 2,
false
); // outer (filled)
context.arc(
this.gameWIdth / 2,
this.gameHeight / 2,
this.radius,
0,
Math.PI * 2,
true
); // outer (unfills it)
context.fill();
}
}
class Ball {
constructor(gameWIdth, gameHeight) {
this.gameWIdth = gameWIdth;
this.gameHeight = gameHeight;
this.ballX = this.gameWIdth / 2;
this.ballY = this.gameHeight / 2;
this.vx = 0.03;
this.radians = Math.PI * 2;
}
draw() {
context.beginPath();
context.fillStyle = "green";
context.arc(this.ballX, this.ballY - 67, 15, 0, Math.PI * 2, false);
context.fill();
}
update(input) {
if (input.includes("ArrowLeft")) {
this.ballX = this.ballX + Math.cos(this.radians) * -2;
this.ballY = this.ballY + Math.sin(this.radians) * -2;
} else if (input.includes("ArrowRight")) {
this.ballX = this.ballX + Math.cos(this.radians) * 2;
this.ballY = this.ballY + Math.sin(this.radians) * 2;
}
//circular move
this.radians += this.vx;
this.ballX = this.ballX + Math.cos(this.radians) * 2;
this.ballY = this.ballY + Math.sin(this.radians) * 2;
console.info(this.ballX, this.ballY);
}
}
class Input {
constructor() {
this.keys = [];
window.addEventListener("keydown", (e) => {
if (
(e.key === "ArrowLeft" || "ArrowRight") &&
this.keys.indexOf(e.key) === -1
) {
this.keys.push(e.key);
}
console.info(e.key, this.keys);
});
window.addEventListener("keyup", (e) => {
if (e.key === "ArrowLeft" || "ArrowRight") {
this.keys.splice(this.keys.indexOf(e.key), 1);
}
console.info(e.key, this.keys);
});
}
}
class Game {
constructor(context, width, height) {
this.context = context;
this.width = width;
this.height = height;
this.circle = new Circle(canvas.width, canvas.height);
this.ball = new Ball(canvas.width, canvas.height);
this.input = new Input();
}
draw() {
this.circle.draw(context);
this.ball.draw(context);
}
update() {
this.ball.update(this.input.keys);
}
}
const game = new Game(context, canvas.width, canvas.height);
const drawCanvas = () => {
context.fillStyle = "#000";
context.fillRect(0, 0, canvas.width, canvas.height);
};
const animation = () => {
drawCanvas();
game.draw();
game.update();
requestAnimationFrame(animation);
};
animation();
На данный момент я ввожу нажатие стрелки влево и вправо, и я хочу, чтобы мой мяч менял направление в зависимости от нажатия стрелки. я играл с
if (input.includes("ArrowLeft")) {
this.ballX = this.ballX + Math.cos(this.radians) * -2;
this.ballY = this.ballY + Math.sin(this.radians) * -2;
} else if (input.includes("ArrowRight")) {
this.ballX = this.ballX + Math.cos(this.radians) * 2;
this.ballY = this.ballY + Math.sin(this.radians) * 2;
}
где * -2
должен вернуть движение, но это не работает, как я думал
Вот кодыandobx Я понимаю, что это может быть немного сложнее, чем я ожидал
Обычно вы заставляете что-то изменить направление, изменяя его скорость. Здесь я меняю значение this.vx на положительное или отрицательное.
Я также немного изменил расчет положения мяча, я просто использовал числа, такие как 75 и 66, которые кажутся примерно правильными, но вам может понадобиться изменить их для ваших нужд.
update(input) {
if (input.includes("ArrowLeft")) {
if (this.vx > 0) this.vx *= -1;
} else if (input.includes("ArrowRight")) {
if (this.vx < 0) this.vx *= -1;
}
//circular move
this.radians += this.vx;
this.ballX = Math.cos(this.radians) * 75 + this.gameWIdth / 2;
this.ballY = Math.sin(this.radians) * 75 + this.gameHeight / 2 + 66;
}
Добавлять к ballX
и ballY
здесь неправильный подход.
В общем, получение точки на круге, как и положение вашего мяча, выглядит так.
x = centerX + Math.cos(angle) * radius
y = centerY + Math.sin(angle) * radius
В вашем случае меняется только angle
. Так что это единственное, что вам нужно обновить.
update() {
if (input === 'ArrowLeft') {
velocity = -0.03
} else if (input === 'ArrowRight') {
velocity = 0.03
}
angle += velocity
}
draw() {
const x = centerX + Math.cos(angle) * pathRadius
const y = centerY + Math.sin(angle) * pathRadius
ctx.arc(x, y, ballRadius, 0, Math.PI * 2)
}
Хорошо подумать о минимальной информации, которую ваша программа должна отслеживать. Здесь вам нужно только сохранить angle
, а затем вы можете вычислить x
и y
, когда они вам понадобятся.
хм, звучит солидно. проверю это
Я думаю, вы должны изменить знак
this.vx