canvas检测小球碰撞

1 篇文章 0 订阅
0 篇文章 0 订阅

定义一个canvas标签

 <div class="cnavasInfo">
        <canvas
            id="canvas"
            width="800"
            height="500"
        ></canvas>
    </div>

函数以及相关的逻辑处理

export default {
    data() {
        return {
            canvas: null,
            ctx: null,
            arcObj: {}
        };
    },
    mounted() {
        this.canvas = document.getElementById("canvas");
        this.ctx = this.canvas.getContext("2d");
        // this.move();  // 矩形的边缘碰撞函数
        // this.moveArc(); // 绘制碰撞圆形,对象形式
        this.moveRect()
    },
    methods: {
        move() {
            let x = 0;
            let y = 0;
            let width = 100;
            let height = 100;
            let speedX = 2;
            let speedY = 2;
            let ctx = this.ctx;
            ctx.fillStyle = "red";
            ctx.fillRect(x, y, width, height);
            setInterval(() => {
                ctx.clearRect(x, y, this.canvas.width, this.canvas.height);
                x += speedX;
                if (x > this.canvas.width - width) {
                    speedX *= -1;
                } else if (x < 0) {
                    speedX *= -1;
                }
                y += speedY;
                if (y > this.canvas.height - height) {
                    speedY *= -1;
                } else if (y < 0) {
                    speedY *= -1;
                }
                ctx.fillRect(x, y, width, height);
            }, 10);
            // this.requestmove(x,y,width,height,ctx,speedX,speedY);  // 请求帧的动画过程
        },
        requestmove(x, y, width, height, ctx, speedX, speedY) {
            ctx.clearRect(x, y, this.canvas.width, this.canvas.height);
            x += speedX;
            if (x > this.canvas.width - width) {
                speedX *= -1;
            } else if (x < 0) {
                speedX *= -1;
            }
            y += speedY;
            if (y > this.canvas.height - height) {
                speedY *= -1;
            } else if (y < 0) {
                speedY *= -1;
            }
            ctx.fillRect(x, y, width, height);
            window.requestAnimationFrame(
                this.requestmove(x, y, width, height, ctx, speedX, speedY)
            );
        },
        moveArc(x, y, r, speedX, speedY) {
            this.x = x;
            this.y = y;
            this.r = r;
            this.speedX = speedX;
            this.speedY = speedY;
            this.moveUpdata = function() {
                this.x += this.speedX;
                if (this.x > this.canvas.width - this.r) {
                    this.speedX *= -1;
                } else if (this.x < 0) {
                    this.speedX *= -1;
                }
                this.y += this.speedY;
                if (this.y > this.canvas.height - this.r) {
                    this.speedY *= -1;
                } else if (this.y < 0) {
                    this.speedY *= -1;
                }
            };
        },
        moveRect(){
            // 面向对象编程
            function Rect(x,y,width,height,color,speedX,speedY,ctx,canvas) {
                this.x = x;
                this.y = y;
                this.width = width;
                this.height = height;
                this.color = color
                this.speedX = speedX
                this.speedY = speedY
                this.ctxRect = ctx
                this.canvas = canvas
            }
            Rect.prototype.draw = function() {
                this.ctxRect.beginPath();
                this.ctxRect.fillStyle = this.color
                this.ctxRect.fillRect(this.x,this.y,this.width,this.height)
                this.ctxRect.closePath();
            }
            Rect.prototype.move = function() {
                this.x += this.speedX
                if(this.x > this.canvas.width - this.width){
                    this.speedX *= -1
                } else if(this.x < 0){
                    this.speedX *= -1
                }
                this.y += this.speedY
                if(this.y > this.canvas.height - this.height){
                    this.speedY *= -1
                } else if(this.y < 0){
                    this.speedY *= -1
                }
            }
            let rect1 = new Rect(0,100,100,100,'red',2,2,this.ctx,this.canvas)
            let rect2 = new Rect(300,100,100,100,'blue',-2,-2,this.ctx,this.canvas)
            // rect1.draw();
            // rect2.draw()
            let animate = ()=>{
                    this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height)
                    rect1.draw()
                    rect1.move()
                    rect2.draw()
                    rect2.move()
                let rect1Min = rect1.x;
                let rect1Max = rect1.x + rect1.width
                let rect2Min = rect2.x
                let rect2Max = rect2.x + rect2.width
                let min = Math.max(rect1Min,rect2Min)
                let max = Math.min(rect1Max,rect2Max)
                if(min < max){
                    rect1.speedX *= -1;
                    rect1.speedY *= 1;
                    rect2.speedX *= -1
                    rect2.speedY *= 1
                }
                window.requestAnimationFrame(animate)
            } 
            animate()
        }
    }
};

样式控制

#canvas {
    border: 1px solid black;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值