poznamy podstawy html Canvas API i stworzymy grę Ping Pong wykorzystując koncepcje, których nauczymy się w tym artykule.

Płyta kotła do artykułu

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>

JAVASCRIPT

let ctx = document.querySelector("canvas").getContext("2d");

Uwaga: w tym artykule będziemy manipulować wyłącznie plikiem skryptu Java.

Podstawy API HTML Canvas

1. Tworzenie linii

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: ten parametr określa grubość linii.

strokeStyle:ten parametr nadaje linii niestandardowy kolor.

moveTo(): ​​Gdy chcemy przejść do punktu bez rysowania linii na płótnie, używamy polecenia przesuwania.

lineTo(): ​​Gdy chcemy narysować linię od aktualnej pozycji do żądanej pozycji, używamy tej funkcji.

stroke():Kiedy użyjemy polecenia lineTo(), linia poleceń nie zostanie narysowana na widocznym obszarze, dopóki na końcu nie użyjemy polecenia Stroke().

2. Tworzenie prostokąta

function createRect(x1, y1, width, height) {
       ctx.fillStyle = "red";
       ctx.fillRect(x1, y1, width, height);
 }
createLine(0, 0, 10, 10);

fillStyle:służy do nadawania niestandardowego koloru tworzonemu prostokątowi.

fillRect():To polecenie służy do tworzenia prostokąta.

3. Tworzenie kręgu

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():Polecenie Łuk służy do tworzenia łuku, którego parametrem jest współrzędna środka x, współrzędna środka y, promień, kąt początkowy i kąt końcowy.

🕙 Stwórzmy grę PING-PONG 🕟

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: metoda informuje przeglądarkę, że chcesz wykonać animację i żąda, aby przeglądarka wywołała określoną funkcję w celu aktualizacji animacji przed kolejnym odświeżeniem. Metoda przyjmuje wywołanie zwrotne jako argument, który ma zostać wywołany przed odświeżeniem.

CodePen Link do stworzonej przez nas gry w ping-ponga.

Uwaga: korzystając z tych podstawowych pojęć, możesz stworzyć wiele pięknych animacji i wiele więcej.

Aby dowiedzieć się więcej o canvasie, zapoznaj się z dokumentacją MDN.