重庆迅玛科技有限公司-APP软件开发,手机软件定制开发,网站开发,微信小程序定制,迅玛科技
2022-05-26 11:28:18

源码canvas实现动态矩形碰撞

分享到:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>小球碰撞</title>
<style type="text/css">
#c{
border: 1px solid red;
}
</style>
</head>
<body>
<canvas id="c" width="1400" height="700"></canvas>
</body>
<script type="text/javascript">
var c = document.getElementById("c");
var ctx = c.getContext("2d");
// 定义一个数组,用于存放小球。
var ballArr = []
for(var i = 0;i < 10; i++){
// 创建小球
var b = new Ball();
// 把小球放入数组
ballArr.push(b);    // 把小球放到数组的末尾。
}
// 递归+requestAnimationFrame()方法实现小球运动
function startGame(){
// 清空画布
ctx.clearRect(0,0,c.width,c.height);
// 把数组中的小球画出来
for(var i = 0; i < ballArr.length; i++){
// 绘制小球
ballArr[i].draw();
// 小球移动
ballArr[i].move();
}
requestAnimationFrame(startGame);    // requestAnimationFrame的作用就是重绘
};
startGame()
function Ball(){
// 矩形宽
this.w = randomNum(10,100);
// 矩形高
this.h = randomNum(10,60);
// 矩形左上x
this.x = randomNum(0,c.width - this.w);
// 矩形左上y
this.y = randomNum(0,c.height - this.h);
// 矩形的颜色
this.color = randomColor();
// 矩形的速度
this.speedX = randomNum(-5,5);
this.speedY = randomNum(-5,5);
// 绘制自身
this.draw = function(){
ctx.beginPath();
ctx.fillStyle = this.color;
ctx.fillRect(this.x,this.y,this.w,this.h);
ctx.fill();
};
// 移动
this.move = function(){
if(this.x <= 0 || this.x + this.speedX + this.w > c.width){
this.speedX *= -1;
};
if(this.y <= 0 || this.y + this.speedY + this.h > c.height){
this.speedY *= -1;
};
this.x += this.speedX;
this.y += this.speedY;
// 判断当前的矩形和其他小球有没有相交
for(var i = 0; i < ballArr.length; i++){
// 如果数组中的球不是我自身(当前球)
if(this != ballArr[i]){
if(interect(this,ballArr[i])==true){
// 交换颜色
var tempColor = this.color;
this.color = ballArr[i].color;
ballArr[i].color = tempColor;
// 交换x方向速度
var tempSpeedX = this.speedX;
this.speedX = ballArr[i].speedX;
ballArr[i].speedX = tempSpeedX;
// 交换y方向速度
var tempSpeedY = this.speedY;
this.speedY = ballArr[i].speedY;
ballArr[i].speedY = tempSpeedY;
}
}
}
};
};
// 产生一个范围Wie[min,max]的随机数      
function randomNum(min,max){
// 思路:[20,80]---->[0,60] + 20             Math.floor()向下取整。
var num = Math.floor(Math.random() * (max - min + 1)) + min;
return num;
};
    // 产生一个随机颜色
    function randomColor(){
    var r = randomNum(0,255);
    var g = randomNum(0,255);
    var b = randomNum(0,255);
    
    var c = "rgb("+r+","+g+","+b+")";
    return c;
    };
    
    
    // 判断两个矩形是否相交
    function interect(ball1,ball2){
    if(ball1.x > ball2.x+ball2.w || ball1.y > ball2.y + ball2.h || ball1.x + ball1.w < ball2.x || ball1.y < ball2.y){
    return false;
    }else{
    return true;
    }
    }
</script>
</html>


上一篇:C语言中最难的三个学习点
下一篇:如何高效开发一款微信小程序