示例:canvas小球碰撞
最后更新于:2022-04-02 03:24:25
[TOC]
## 示例
main.js
```
// 设置画布
// const canvas = document.querySelector('canvas');
// const ctx = canvas.getContext('2d');
// const width = canvas.width = window.innerWidth;
// const height = canvas.height = window.innerHeight;
// // 生成随机数的函数
// function random(min,max) {
// const num = Math.floor(Math.random() * (max - min)) + min;
// return num;
// }
const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
const width =canvas.width= window.innerWidth;
const height =canvas.height= window.innerHeight;
console.log(width);
console.log(height);
function random(min,max){
return Math.floor(Math.random()*(max-min)+min);
}
function randomColor(){
return `rgb(${random(0,255)},${random(0,255)},${random(0,255)})`
}
function Ball(x,y,valx,valy,color,size){
this.x=x
this.y=y // x,y 标识圆心
this.valx=valx
this.valy=valy // 水平,垂直的速度
this.color=color // 小球颜色
this.size=size // 小球的半径
}
Ball.prototype.draw=function(){
ctx.beginPath()
ctx.fillStyle=this.color
ctx.arc(this.x,this.y,this.size,0,2*Math.PI);
ctx.fill();
}
Ball.prototype.collisionDetect = function() {
for (let j = 0; j < balls.length; j++) {
if (this !== balls[j]) {
const dx = this.x - balls[j].x;
const dy = this.y - balls[j].y;
const distance = Math.sqrt(dx * dx + dy * dy);
if (distance < this.size + balls[j].size) {
balls[j].color = this.color = randomColor();
//两球反向
balls[j].valx=-balls[j].valx
balls[j].valy=-balls[j].valy
this.valx=-this.valx
this.valy=-this.valy
}
}
}
}
//检查小球的 x 坐标是否大于画布的宽度(小球会从右边缘离开)。
// 检查小球的 x 坐标是否小于0(小球会从左边缘离开)。
// 检查小球的 y 坐标是否大于画布的高度(小球会从下边缘离开)。
// 检查小球的 y 坐标是否小于0(小球会从上边缘离开)。
Ball.prototype.update=function(){
// 碰撞检测
if((this.x+this.size) >= width){
this.valx=-(this.valx)
}
if((this.x-this.size)<=0){
this.valx=-(this.valx)
}
// 碰撞检测
if((this.y+this.size) >= height){
this.valy=-(this.valy)
}
if((this.y-this.size)<=0){
this.valy=-(this.valy)
}
this.x+=this.valx
this.y+=this.valy
}
let balls = [];
while (balls.length < 25) {
let size = random(10, 20);
let ball = new Ball(
// 为避免绘制错误,球至少离画布边缘球本身一倍宽度的距离
random(0 + size, width - size),
random(0 + size, height - size),
random(-7, 7),
random(-7, 7),
randomColor(),
size
);
balls.push(ball);
}
function loop() {
ctx.fillStyle = 'rgba(0, 0, 0, 0.25)';
ctx.fillRect(0, 0, width, height);
for (let i = 0; i < balls.length; i++) {
balls[i].draw();
balls[i].update();
balls[i].collisionDetect();
}
requestAnimationFrame(loop);
}
loop()
```
';