成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JS寫的不咋地的碰撞檢測(cè)

gotham / 2425人閱讀

摘要:最近在學(xué)習(xí)碰撞檢測(cè)相關(guān)的知識(shí),但說(shuō)實(shí)話,寫的不咋地。因?yàn)檎姹緛?lái)是正方形所以檢測(cè)的不是很準(zhǔn)確。下面來(lái)批評(píng)一下這個(gè)的代碼。碰撞檢測(cè)的代碼因?yàn)榕鲎部梢苑譃檫@四個(gè)角度。因?yàn)槭褂昧藥缀跻恢痹谥嘏?,所以性能不是最好的,但效果基本上?shí)現(xiàn)了。

最近在學(xué)習(xí)碰撞檢測(cè)相關(guān)的知識(shí),但說(shuō)實(shí)話,寫的不咋地。但是因?yàn)楸扇藢W(xué)識(shí)淺薄,所以覺(jué)得基本上還行,但是挺追求我完美的,所以想拿出來(lái)讓大神們批評(píng)批評(píng)。

先來(lái)看一下效果


感覺(jué)哇,真卡,真難受。因?yàn)檎姹緛?lái)是正方形所以檢測(cè)的不是很準(zhǔn)確。

下面來(lái)批評(píng)一下這個(gè)的代碼。

碰撞檢測(cè)的代碼

if((mover.offsetLeft + mover.offsetWidth >= target.offsetLeft) 
    && (mover.offsetTop +  mover.offsetHeight >= target.offsetTop) 
    && (target.offsetLeft + target.offsetWidth >= mover.offsetLeft)  
    && (target.offsetTop +  target.offsetHeight >= mover.offsetTop)  
    )

因?yàn)榕鲎部梢苑譃檫@四個(gè)角度。

1.左上角

2.右上角

3.左下角

4.右下角

5.整體圖示

只要在那個(gè)區(qū)域之內(nèi)就行。

碰撞區(qū)域邊緣的代碼

setInterval(function move(e) {
    boll.style.left = boll.offsetLeft + (this.N * 10) + "px"; //改變小球的位置
    boll.style.top = boll.offsetTop + (this.T * 10)  + "px";
    if(boll.offsetLeft >= sq.offsetWidth - boll.offsetWidth || boll.offsetLeft <= 0 ){ //碰撞左右兩邊
        this.N *= -1; //改變方向(依自己喜好定義)
    }
    if(boll.offsetTop >= sq.offsetHeight - boll.offsetHeight || boll.offsetTop <= 0 ){ //碰撞上下兩邊
        this.T *= -1; //改變方向(依自己喜好定義)
    }   
}.bind(this), 50);

檢測(cè)每一個(gè)小球與其他小球是否碰撞

bollArr = [], //存放小球DOM元素,改變方向用
boll = []; //存放小球,檢測(cè)是否碰撞用
setInterval(function move(e) {
    for (var i = 0; i < bollArr.length; i ++) {
        for (var j = i + 1; j < bollArr.length; j ++) {
            collisionDetection(bollArr[i], bollArr[j], fes[i], fes[j]);
        }
    }
}, 50);

小球構(gòu)造函數(shù)

function Boll() {
    this.backgroundColor = "rgba(35, 215, 65, .3)"; //小球顏色
    this.left = getRandom(400); //小球位置
    this.top = getRandom(400);
    this.N = 1;  //改變小球方向的數(shù)(自己可以精確定義,我就隨便定義了)
    this.T = 1;
    boll.push(this);
}

整體代碼

let sq = document.getElementById("square"), //獲取最外面的框
    bollArr = [], //小球DOM元素集合
    boll = []; //小球?qū)嵗?function Boll() {  //構(gòu)造函數(shù)
    this.backgroundColor = "rgba(35, 215, 65, .3)";
    this.left = getRandom(400);
    this.top = getRandom(400);
    this.N = 1;
    this.T = 1;
    boll.push(this);
}
let boll0 = new Boll(),
    boll1 = new Boll(),
    boll2 = new Boll();
Boll.prototype.createBoll = function() {  //創(chuàng)建小球
    let boll = document.createElement("div");
    boll.style.display = "none";
    boll.style.width =  "60px";
    boll.style.height = "60px";
    boll.style.backgroundColor = this.backgroundColor;
    boll.style.borderRadius = "50%";
    boll.style.position = "absolute";
    boll.style.left = this.left + "px";
    boll.style.top = this.top + "px";
    boll.style.display = "block";
    sq.appendChild(boll);
    bollArr.push(boll);
    setInterval(function move(e) {  //檢測(cè)是否和外面的框碰撞
        boll.style.left = boll.offsetLeft + (this.N * 10) + "px";
        boll.style.top = boll.offsetTop + (this.T * 10)  + "px";
        if(boll.offsetLeft >= sq.offsetWidth - boll.offsetWidth || boll.offsetLeft <= 0 ){
            this.N *= -1;
        }
        if(boll.offsetTop >= sq.offsetHeight - boll.offsetHeight || boll.offsetTop <= 0 ){
            this.T *= -1;
        }   
    }.bind(this), 50);
}
// 碰撞檢測(cè)
function collisionDetection(mover, target, boll, boll2) {
    if((mover.offsetLeft + mover.offsetWidth >= target.offsetLeft) 
        && (mover.offsetTop +  mover.offsetHeight >= target.offsetTop) 
        && (target.offsetLeft + target.offsetWidth >= mover.offsetLeft)  
        && (target.offsetTop +  target.offsetHeight >= mover.offsetTop)  
    ){
         boll.N *= -1;
         boll.T *= -1;
         boll2.N *= -1;
         boll2.T *= -1;
    }
}
boll0.createBoll();
boll1.createBoll();
boll2.createBoll();
// 為每?jī)蓚€(gè)小球檢測(cè)是否碰撞
setInterval(function move(e) {
    for (var i = 0; i < bollArr.length; i ++) {
        for (var j = i + 1; j < bollArr.length; j ++) {
            collisionDetection(bollArr[i], bollArr[j], boll[i], boll[j]);
        }
    }
}, 50);

上面其實(shí)有很多不好和bug,希望看到的大神能批評(píng)幾句。
因?yàn)槭褂昧薿ffset...幾乎一直在重排,所以性能不是最好的,但效果基本上實(shí)現(xiàn)了。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/101008.html

相關(guān)文章

  • vue 百度地圖api進(jìn)行地理解析(解決跨域問(wèn)題)

    摘要:我采用了插件原生百度地圖的二次封裝,但是插件里的紅點(diǎn)標(biāo)記需要用到經(jīng)緯度值。 先扯一會(huì)兒 首先非常感謝大家的閱讀(感謝已加粗),這是我人生中第一次寫技術(shù)文章(以前打字都費(fèi)勁),本人小white一個(gè)(秀一下英語(yǔ)詞匯量),技術(shù)不咋地,就是愛(ài)分享,動(dòng)不動(dòng)還來(lái)個(gè)原創(chuàng),你說(shuō)氣人不~ 閑話少說(shuō),進(jìn)入主題?。?! 重點(diǎn)部分 最近在做一個(gè)基于vue的設(shè)備管理系統(tǒng),其中有一個(gè)需求:需要把設(shè)備所在地的...

    Freeman 評(píng)論0 收藏0
  • 最底層程序員的一點(diǎn)思考

    摘要:作為一名在最底層工作了年的程序員,大的風(fēng)浪沒(méi)見(jiàn)過(guò),游泳池的水倒是喝過(guò)幾口。為什么總有人能比你做的更好善于溝通讓你輕松跨域障礙很大比例的程序員不擅長(zhǎng)溝通,埋頭寫自己的代碼,出了問(wèn)題自己默不作聲,死憋一天。 作為一名在最底層工作了7年的程序員,大的風(fēng)浪沒(méi)見(jiàn)過(guò),游泳池的水倒是喝過(guò)幾口。一路走過(guò)來(lái)支撐著我繼續(xù)前行的是愛(ài)好、工作、還是錢?還是錢??還是??? 寫好代碼是你的工作 作為程序員,你的...

    邱勇 評(píng)論0 收藏0
  • uniapp table 組件

    摘要:最近在搗鼓項(xiàng)目,恰好用到組件,之前寫了個(gè),后面一直都想寫一個(gè)像樣的,可以分享給別人用的組件。自己的水平一般,開發(fā)出來(lái)的組件可能代碼不咋地,還望路過(guò)大神斧正。 uniapp是2019年非常的火爆的一個(gè)Dcloud開發(fā)跨平臺(tái)前端工具,支持ios android wap,小程序,除了android有點(diǎn)卡外,其他暫時(shí)沒(méi)有發(fā)現(xiàn)什么瑕疵。 最近在搗鼓uniapp項(xiàng)目,恰好用到table組件,之前...

    Vultr 評(píng)論0 收藏0
  • 聽說(shuō)你懂個(gè)J?——前端發(fā)展閑聊

    摘要:移動(dòng)端迅猛發(fā)展的前期,和這樣的終端開發(fā)才是這個(gè)社會(huì)的主流,前端開發(fā)受限于網(wǎng)絡(luò)速度和沒(méi)有統(tǒng)一的標(biāo)準(zhǔn),還是不受重視。同時(shí),網(wǎng)絡(luò)的普及,也讓前端也正式邁入了移動(dòng)端的開發(fā)。在可預(yù)見(jiàn)的將來(lái),前端受益于靈活的部署和安裝,在移動(dòng)端開發(fā)中比例會(huì)逐漸加重。 剛好周末和朋友聊起前端從受鄙視到變得重要這個(gè)話題,感慨前端這四年來(lái)的發(fā)展,遂有本文。 1. 前情提要 毋庸諱言,在我剛工作的時(shí)候,前端是還是一個(gè)不受...

    DrizzleX 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<