изучат основы html Canvas API и создадут игру в пинг-понг, используя концепции, которые мы изучим в этой статье.
Котельная плита для статьи

CSS
html, * {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
text-align: center;
}
.grid {
background: lightgreen;
margin: auto;
}
p:nth-child(1) {
padding: 10px 20px;
text-align: center;
font-family: ubuntu;
font-weight: bolder;
font-size: 25px;
text-transform: uppercase;
color: gray;
}
HTML
<canvas class='grid' width="1000" height="500"> </canvas>
ЯВАСКРИПТ
let ctx = document.querySelector("canvas").getContext("2d");
Примечание. В этой статье мы будем работать только с файлом сценария Java.
Основы HTML Canvas API
1. Создание линии

function createLine(x1, y1, x2, y2) {
ctx.lineWidth = 5;
ctx.strokeStyle = "red";
ctx.beginPath();
ctx.moveTo(x1, y1);
ctx.lineTo(x2, y2);
ctx.stroke();
ctx.closePath();
}
createLine(0, 0, 10, 10);
lineWidth: этот параметр определяет толщину линии.
strokeStyle: этот параметр задает пользовательский цвет линии.
moveTo(): когда мы хотим переместиться в точку, не рисуя линию на холсте, мы используем команду перемещения.
lineTo(): когда мы хотим нарисовать линию от текущей позиции до желаемой позиции, мы используем эту функцию.
stroke(): когда мы используем командную строку lineTo(), она не будет отображаться на видимом до тех пор, пока мы не используем команду stroke() в конце.
2. Создание прямоугольника

function createRect(x1, y1, width, height) {
ctx.fillStyle = "red";
ctx.fillRect(x1, y1, width, height);
}
createLine(0, 0, 10, 10);
fillStyle: используется для придания пользовательского цвета создаваемому прямоугольнику.
fillRect(): эта команда используется для создания прямоугольника.
3. Создание круга

function createCircle(cx, cy, radius) {
ctx.fillStyle = "red";
ctx.beginPath();
ctx.arc(cx, cy, radius, 0, 2 * Math.PI);
ctx.stroke();
ctx.fill();
ctx.closePath();
}
createCircle(20, 20, 10);
arc():команда Arc используется для создания дуги, которая принимает координату центра x, координату центра y, радиус, начальный угол и конечный угол в качестве параметра.
🕙 Создадим игру ПИНГ-ПОНГ 🕟
let circle = {
x: 100,
y: 100,
radius: 10,
dx: 2,
dy: 2
}
let rect = {
x: 488,
y: 0,
width: 10,
height: 50,
}
let line = {
init_x: 100,
init_y: 100,
fin_x: 0,
fin_y: 0
}
let ctx = document.querySelector("canvas").getContext("2d");
function draw_circle() {
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height)
ctx.beginPath();
ctx.arc(circle.x , circle.y, circle.radius, 0, Math.PI * 2);
ctx.fillStyle = 'red';
ctx.fill();
ctx.fillStyle = 'blue';
ctx.fillRect(rect.x,rect.y,rect.width,rect.height);
}
function draw_animated_circle() {
draw_circle(circle);
circle.x += circle.dx;
circle.y += circle.dy;
line.init_x = line.fin_x
line.init_y = line.fin_y
line.fin_x = circle.x;
line.fin_y = circle.y;
if(circle.x + circle.radius ==rect.x &&
( circle.y + circle.radius >rect.y &&
circle.y + circle.radius <rect.y +
rect.height + 2 * circle.radius)
) {
circle.dx *= -1;
}
if(circle.x + circle.radius >= ctx.canvas.width ||
circle.x <= circle.radius
) {
if(circle.x + circle.radius >= ctx.canvas.width){
alert("gameover");
window.location.reload();
}
circle.dx *= -1;
}
if(circle.y + circle.radius >= ctx.canvas.height ||
circle.y <= circle.radius
) {
circle.dy *= -1;
}
requestAnimationFrame(draw_animated_circle);
}
function init() {
document.querySelector("body").addEventListener("keydown",
(e) => {
if(e.keyCode == 38 &&rect.y >= 2) {
rect.y -= 10
}
if(e.keyCode == 40 &&
rect.y +rect.height < ctx.canvas.height - 7
) {
rect.y += 10
}
})
draw_animated_circle();
}
init();
requestAnimationFrame : метод сообщает браузеру, что вы хотите выполнить анимацию, и запрашивает, чтобы браузер вызвал указанную функцию для обновления анимации перед следующей перерисовкой. Метод принимает обратный вызов в качестве аргумента, который должен быть вызван перед перерисовкой.
CodePen Ссылка на созданную нами игру в пинг-понг.
Примечание. Используя эти базовые концепции, вы можете создать множество красивых анимаций и многое другое.
Чтобы узнать больше о canvas, вы можете обратиться к документации MDN.