成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

gotham / 2391人閱讀

摘要:最近在學(xué)習(xí)碰撞檢測(cè)相關(guān)的知識(shí),但說實(shí)話,寫的不咋地。因?yàn)檎姹緛硎钦叫嗡詸z測(cè)的不是很準(zhǔn)確。下面來批評(píng)一下這個(gè)的代碼。碰撞檢測(cè)的代碼因?yàn)榕鲎部梢苑譃檫@四個(gè)角度。因?yàn)槭褂昧藥缀跻恢痹谥嘏牛孕阅懿皇亲詈玫?,但效果基本上?shí)現(xiàn)了。

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

先來看一下效果


感覺哇,真卡,真難受。因?yàn)檎姹緛硎钦叫嗡詸z測(cè)的不是很準(zhǔn)確。

下面來批評(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://systransis.cn/yun/101008.html

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<