javascript canvas檢測(cè)小球碰撞
本文實(shí)例為大家分享了javascript canvas實(shí)現(xiàn)檢測(cè)小球碰撞的具體代碼,供大家參考,具體內(nèi)容如下
定義一個(gè)canvas標(biāo)簽
<div class="cnavasInfo"> <canvas id="canvas" width="800" height="500" ></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)畫(huà)過(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í)有所幫助,也希望大家多多支持腳本之家。
- JavaScript碰撞檢測(cè)原理及其實(shí)現(xiàn)代碼
- 基于javascript實(shí)現(xiàn)碰撞檢測(cè)
- javascript實(shí)現(xiàn)拖拽碰撞檢測(cè)
- 原生js實(shí)現(xiàn)碰撞檢測(cè)
- three.js利用射線(xiàn)Raycaster進(jìn)行碰撞檢測(cè)
- JS實(shí)現(xiàn)碰撞檢測(cè)的方法分析
- javascript制作游戲開(kāi)發(fā)碰撞檢測(cè)的封裝代碼
- js實(shí)現(xiàn)碰撞檢測(cè)特效代碼分享
- 原生JS實(shí)現(xiàn)的碰撞檢測(cè)功能示例
- JS/HTML5游戲常用算法之碰撞檢測(cè) 包圍盒檢測(cè)算法詳解【矩形情況】
相關(guān)文章
javascript showModalDialog,open取得父窗口的方法
showModalDialog,open取得父窗口的代碼,需要的朋友可以參考下。2010-03-03
JavaScript類(lèi)型系統(tǒng)之布爾Boolean類(lèi)型詳解
這篇文章主要介紹了JavaScript類(lèi)型系統(tǒng)之布爾Boolean類(lèi)型詳解的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
webpack使用Symbol.toStringTag(Symbol.toStringTag用法)
Symbol.toStringTag是一個(gè)內(nèi)置 symbol,它通常作為對(duì)象的屬性鍵使用,對(duì)應(yīng)的屬性值應(yīng)該為字符串類(lèi)型,這個(gè)字符串用來(lái)表示該對(duì)象的自定義類(lèi)型標(biāo)簽,這篇文章主要介紹了webpack使用Symbol.toStringTag(Symbol.toStringTag用法),需要的朋友可以參考下2024-02-02
優(yōu)雅的使用javascript遞歸畫(huà)一棵結(jié)構(gòu)樹(shù)示例代碼
這篇文章主要給大家介紹了關(guān)于如何優(yōu)雅的使用javascript遞歸畫(huà)一棵結(jié)構(gòu)樹(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用javascript具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
JavaScript中 創(chuàng)建動(dòng)態(tài) QML 對(duì)象的方法
這篇文章主要介紹了 JavaScript中 創(chuàng)建動(dòng)態(tài) QML 對(duì)象,下面文章主要分析了兩中方法,分別是從 QML 字符串創(chuàng)建對(duì)象和動(dòng)態(tài)創(chuàng)建組件以及刪除對(duì)象等方法,具有有一定的參考價(jià)值,需要的小伙伴可以參考一下2021-12-12
layui自定義驗(yàn)證,用ajax查詢(xún)后臺(tái)是否有重復(fù)數(shù)據(jù),form.verify的例子
今天小編就為大家分享一篇layui自定義驗(yàn)證,用ajax查詢(xún)后臺(tái)是否有重復(fù)數(shù)據(jù),form.verify的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09

