javascript canvas檢測(cè)小球碰撞
本文實(shí)例為大家分享了javascript canvas實(shí)現(xiàn)檢測(cè)小球碰撞的具體代碼,供大家參考,具體內(nèi)容如下
定義一個(gè)canvas標(biāo)簽
<div class='cnavasInfo'> <canvas ></canvas></div>
函數(shù)以及相關(guān)的邏輯處理
export default { data() { return { canvas: null, ctx: null, arcObj: {} }; }, mounted() { this.canvas = document.getElementById('canvas'); this.ctx = this.canvas.getContext('2d'); // this.move(); // 矩形的邊緣碰撞函數(shù) // this.moveArc(); // 繪制碰撞圓形,對(duì)象形式 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); // 請(qǐng)求幀的動(dòng)畫過(guò)程 }, 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(){ // 面向?qū)ο缶幊? 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;}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. jscript與vbscript 操作XML元素屬性的代碼2. 不要在HTML中濫用div3. ASP將數(shù)字轉(zhuǎn)中文數(shù)字(大寫金額)的函數(shù)4. XML在語(yǔ)音合成中的應(yīng)用5. HTML5實(shí)戰(zhàn)與剖析之觸摸事件(touchstart、touchmove和touchend)6. .NET Framework各版本(.NET2.0 3.0 3.5 4.0)區(qū)別7. XML入門的常見問(wèn)題(三)8. 基于PHP做個(gè)圖片防盜鏈9. ASP基礎(chǔ)入門第四篇(腳本變量、函數(shù)、過(guò)程和條件語(yǔ)句)10. php使用正則驗(yàn)證密碼字段的復(fù)雜強(qiáng)度原理詳細(xì)講解 原創(chuàng)
