HTML5 Javascript Canvas Collision
Tags: javascript, html, canvas, webdev
Published: 2022-02-10 07:47:08

> Читать снизу вверх

> Статья будет дополнятся 

>  //!* новые строки
Вычисляем пересечение двух кругов
[jsfiddle.net](https://jsfiddle.net/Spsoi/a0mdwfsh/11/)
```javascript
function animate() {
    requestAnimationFrame(animate); // каждую секунду отрисовываем
    c.clearRect(0,0, canvas.width, canvas.height); // удаляем предыдуший отрисованный кадр
    circle1.update();
    circle2.x = mouse.x;
    circle2.y = mouse.y;
    circle2.update();

    let distance = getDistance(circle1.x, circle1.y, circle2.x, circle2.y); // !*
    let touch = circle1.radius + circle2.radius;// !*
    console.log( touch); // !*
    if (distance < touch) { // !*
        circle1.color = 'red'; 
    } else { 
        circle1.color = 'black';
    }
    console.log(getDistance(circle1.x, circle1.y, circle2.x, circle2.y)); 

}
```

Вычисляем расстояние курсора до центра первого шара (Чёрный).
[jsfiddle.net](https://jsfiddle.net/Spsoi/a0mdwfsh/10/)
```javascript
function getDistance(x1, y1, x2, y2) { //!* расчёт дистанции до центра первого круга
    let xDistance = x2 -x1; //!*
    let yDistance = y2 -y1; //!*

    let distance = Math.pow(xDistance, 2) + Math.pow(yDistance, 2); //!*// Теорема Пифагора

    return Math.sqrt(distance); //!*// квадратный корень числа
}

function animate() {
    requestAnimationFrame(animate); // каждую секунду отрисовываем
    c.clearRect(0,0, canvas.width, canvas.height); // удаляем предыдущий отрисованный кадр
    circle1.update();
    circle2.x = mouse.x;
    circle2.y = mouse.y;
    circle2.update();

    console.log(getDistance(circle1.x, circle1.y, circle2.x, circle2.y)); //!* 

}

```



Отрисуем второй шарик прям.
[jsfiddle.net](https://jsfiddle.net/Spsoi/a0mdwfsh/8/)

```javascript
let circle1 ;
let circle2 ; //!*
function init() { // точка входа
    //1
    circle1 = new Circle(300, 300, 100, 'black');
    circle2 = new Circle(undefined, undefined, 30, 'red'); //!*
}

function animate() {
    requestAnimationFrame(animate); // каждую секунду отрисовываем
    c.clearRect(0,0, canvas.width, canvas.height); // удаляем предыдущий от рисованный кадр
    circle1.update();
    circle2.x = mouse.x; //!*
    circle2.y = mouse.y; //!*
    circle2.update(); //!*
}
```

Отрисуем шар в центре канваса
[jsfiddle.net](https://jsfiddle.net/Spsoi/a0mdwfsh/2/)

```javascript
canvas = document.querySelector('#canvas');
let c = canvas.getContext('2d');

canvas.width = innerWidth;
canvas.height = innerHeight;

let mouse = {
    x: innerWidth / 2,
    y: innerHeight / 2
}

let colors = [
    '#2185c5',
    '#7ECEFD',
    '#FFF6E5',
    '#FF7F66'
];

document.addEventListener("mousemove", function(event){
    mouse.x = event.clientX;
    mouse.y = event.clientY;
});

addEventListener("resize", function(){ // при изменении окна растягиваем окно canvas
    canvas.width = innerWidth;
    canvas.height = innerHeight;
    // init();
});

function randomIntFromRange(min, max) {
    return Math.floor(Math.random() * (max - min + 1) + min);
}

function randomColor (color){
    return color[Math.floor(Math.random() * color.length)];
}

addEventListener("click", function () { // клик по экрану сбрасывает анимацию
    init();
})


function Circle (x, y, radius, color) { // шарик
    // 2
    this.x =x;
    this.y = y;
    this.radius = radius;
    this.color = color;

    this.update = function() {
        this.draw();
    }

    this.draw = function () {
        c.beginPath();
            c.arc(this.x, this.y, this.radius, 0, Math.PI * 2, false);
            c.fillStyle = this.color;
            c.fill();
            c.stroke();
        c.closePath();
    }
}

let ballArray;
let circle1 ;
function init() { // точка входа
    //1
    circle1 = new Circle(300, 300, 100, 'black');
}

function animate() {
    requestAnimationFrame(animate); // каждую секунду отрисовываем
    c.clearRect(0,0, canvas.width, canvas.height); // удаляем предыдуший отрисованный кадр
    circle1.update();
}

init();
animate();
```

style.css

```css
canvas {
    border: 1px solid #000;
}
```

index.html
```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="style.css">
    <title>Document</title>
</head>
<body>
    <canvas id="canvas" width="300" height="300"></canvas>
    <script  src="canvas.js" ></script>
</body>
</html>
```