#javascript #canvas
#javascript #холст
Вопрос:
Я хочу, чтобы мяч падал с гравитацией. Но фон не очистит предыдущий круг. (падающая часть еще не реализована) почему он не удаляет последний нарисованный объект?
let c, ctx;
let met;
let colorArray = ["green", "yellow", "orange", "red"];
window.onload = function(){
c = document.getElementById("boom");
ctx = c.getContext("2d");
c.width = window.innerWidth - 165;
c.height = window.innerHeight;
setup();
draw();
}
function setup(){
met = new Meteor(200, 400, 10, 0, 5);
}
function draw(){
window.requestAnimationFrame(draw);
ctx.fillStyle = colorArray[Math.floor(Math.random() * colorArray.length)];
ctx.fillRect(0, 0, c.width, c.height);
met.draw();
met.fall();
};
class Meteor {
constructor(x, y, r, xSpeed, ySpeed){
this.xPos = x;
this.yPos = y;
this.radius = r;
this.xSpeed = xSpeed;
this.ySpeed = ySpeed;
this.color = "blue";
this.acceleration = 0.5;
}
draw(){
ctx.fillStyle = this.color;
ctx.arc(this.xPos, this.yPos, this.radius, 0, 2 * Math.PI);
//ctx.fill();
ctx.stroke();
}
fall(){
this.yPos = (this.ySpeed);
}
}
Кроме того, если у вас есть какие-либо советы о том, как придать ему гравитацию, пожалуйста, не стесняйтесь сообщать мне. Я уже некоторое время борюсь с этим.
Комментарии:
1. Добавляйте
ctx.beginPath();
перед тем, как рисовать шар. Чтобы имитировать гравитацию, вам нужно увеличить координату y относительно времени:y = v0*t (a*t**2)/2
.2. Эта скрипка показывает, как вы можете использовать гравитацию. Это немного запутанно, я бы посоветовал вам заключить все функции в класс, что сделало бы код более понятным. Обратите внимание, что
ySpeed
теперь вместо масштабирования скорости гравитации на экране, чем представления фактической скорости, формула гравитации вычисляет фактическую скорость.
Ответ №1:
draw()
Добавьте это перед вызовом met.draw()
:
ctx.clearRect(0, 0, window.innerWidth, window.innterHeight)
Это очистит экран от каждого кадра.
Для gravity добавьте dt
параметр в свою функцию рисования, а затем передайте его met.draw()
следующим образом:
function draw(dt){
window.requestAnimationFrame(draw);
ctx.fillStyle = colorArray[Math.floor(Math.random() * colorArray.length)];
ctx.fillRect(0, 0, c.width, c.height);
ctx.clearRect(0, 0, window.innerWidth, window.innterHeight) // Clear screen here
met.draw(dt);
met.fall();
};
Затем в Meteor
классе используйте функцию dt
in draw()
для вычисления вашей позиции y на основе скорости. Здесь dt
будет ваше дельта-время для вычисления.