Я хотел бы создать холст с синим квадратом размером 100x100 пикселей. Разместите квадрат в левой части страницы на расстоянии 50 пикселей от верхнего края. Используя javascript, анимируйте этот квадрат так, чтобы он перемещался на 10 пикселей вправо и на 10 пикселей вниз в секунду. Когда прямоугольник ударяется о край окна или выходит за его пределы, измените направление соответствующей оси.
Следующий холст возвращает синий круг, но мне нужен квадрат 100X100 пикселей вместо круга. Я попробовал rect(50, 50, 50, 50);, но анимация перестала работать
<style type = "text/css">
canvas{
border-style: inset;
background-color: lightgray;
border-radius: 5px;
}
</style>
</head>
<body style = "background-color: gray;" onload = "animate()">
<canvas id = "bouncyBall" width = "500" height = "250">
</canvas>
<script type = "text/javascript">
var animation;
var centerX = 50;
var centerY = 50;
var radius = 20;
var boardX = 500;
var boardY = 250;
var ballDx = 2;
var ballDy = 2;
function drawBall() {
var content = document.getElementById("bouncyBall");
var me = content.getContext("2d");
me.clearRect(0,0,content.width,content.height);
centerX = centerX + ballDx;
centerY = centerY + ballDy;
me.beginPath();
me.arc(centerX,centerY,radius,0,Math.PI*2,false);
me.stroke();
me.fillStyle = "blue";
me.fill();;
me.stroke();
if (centerY > boardY - radius || centerY - radius < 0) {
ballDy = -1*ballDy;
}
if (centerX > boardX - radius || centerX < radius) {
ballDx = -1*ballDx;
}
}
function animate() {
clearInterval(animation);
setInterval(drawBall, 25);
}
</script>
</body>
Спасибо, но квадратная коробка вернулась до того, как коснулась верхней части, а также переполнила нижнюю часть.
Да, спасибо, теперь он работает @ Just code. Также спасибо enxaneta. тоже работает :)
Добро пожаловать: D



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


Вы можете использовать прямоугольник
var animation;
var centerX = 50;
var centerY = 50;
var radius = 0;
var boardX = 500;
var boardY = 250;
var ballDx = 2;
var ballDy = 2;
var width = 100;
var height = 100;
function drawBall() {
var content = document.getElementById("bouncyBall");
var me = content.getContext("2d");
me.clearRect(0,0,content.width,content.height);
centerX = centerX + ballDx;
centerY = centerY + ballDy;
me.beginPath();
me.rect(centerX,centerY,width,height);
me.stroke();
me.fillStyle = "blue";
me.fill();;
me.stroke();
if (centerY > boardY - width || centerY - radius < 0) {
ballDy = -1*ballDy;
}
if (centerX > boardX - height || centerX < radius) {
ballDx = -1*ballDx;
}
}
function animate() {
clearInterval(animation);
setInterval(drawBall, 25);
}
animate();canvas{
border-style: inset;
background-color: lightgray;
border-radius: 5px;
}<canvas id = "bouncyBall" width = "500" height = "250">
</canvas>Пользуюсь me.rect(centerX-radius, centerY-radius,2*radius,2*radius). Таким образом, центр прямоугольника будет в том же месте, что и центр круга. Ширина прямоугольника должна быть равна 2 * радиус.
//var animation;
var centerX = 50;
var centerY = 50;
var radius = 20;
var boardX = 500;
var boardY = 250;
var ballDx = 2;
var ballDy = 2;
function drawBall() {
var content = document.getElementById("bouncyBall");
var me = content.getContext("2d");
me.clearRect(0,0,content.width,content.height);
centerX = centerX + ballDx;
centerY = centerY + ballDy;
/*
me.beginPath();
me.arc(centerX,centerY,radius,0,Math.PI*2,false);
//me.stroke();
me.fillStyle = "blue";
me.fill();
me.stroke();*/
me.beginPath();
me.rect(centerX-radius, centerY-radius,2*radius,2*radius);
me.fillStyle = "blue";
me.fill();
me.stroke();
if (centerY > boardY - radius || centerY - radius < 0) {
ballDy = -1*ballDy;
}
if (centerX > boardX - radius || centerX < radius) {
ballDx = -1*ballDx;
}
}
function animate() {
clearInterval(animate);
setInterval(drawBall, 25);
}
animate() canvas{
border-style: inset;
background-color: lightgray;
border-radius: 5px;
}<canvas id = "bouncyBall" width = "500" height = "250">
</canvas>
вы просто меняете
arcнаrect:me.rect(centerX,centerY,radius,radius);