Javascript模仿flappyBird

原生JS實現(xiàn)flappyBird

demo.png

項目簡介

使用原生JS申眼,通過ES6練習面向?qū)ο笏枷肼鹘颍O(shè)置重力效果,進行碰撞檢測從而實現(xiàn)Flappybird游戲括尸,

設(shè)計思路

  • 為了實現(xiàn)小鳥的飛行效果巷蚪,使用定時器對天空及陸地進行移動,動態(tài)添加管子實現(xiàn)類似小鳥飛行的效果
  • 游戲中設(shè)計天空移動濒翻,陸地移動屁柏,管道移動,小鳥扇動翅膀有送,因此定時器存在多個淌喻,設(shè)置一個類產(chǎn)生定時器
  • 小鳥的跳動通過設(shè)置重力動態(tài)計算速度,通過改變速度即可實現(xiàn)跳躍及掉落
  • 對碰撞進行檢測

類及其結(jié)構(gòu)

定時器設(shè)置類 {
    開啟定時器start
    停止定時器stop
    定時器運行時執(zhí)行的函數(shù)action
}
//
天空類{
    天空移動函數(shù)action
    //left-- 圖片設(shè)置為二倍寬度雀摘,到達一倍寬度時再將left置零實現(xiàn)移動
}
大地類{
    大地移動函數(shù)action
    //同上
}
小鳥類{
    小鳥翅膀扇動函數(shù)action
    小鳥掉落函數(shù)drop
    小鳥跳躍函數(shù)jump
}
管道類{
    生成管道函數(shù)build
    管道隨機高度函數(shù)setHeight
    管道運動函數(shù)action
}
游戲類{
    初始化init
    //初始上面的所有類
    開始游戲函數(shù)start
    //開啟所有的定時器
    游戲暫停函數(shù)stop
    游戲停止函數(shù)over
    碰撞檢測函數(shù)judge
}

定時器設(shè)置

class SetTime{
    constructor(){
        this.timer = null;
    }
    start(interval){
        if(this.timer){
            console.log('已經(jīng)有定時器存在了');
            return;
        }
        this.timer = setInterval(()=>{
            this.action();
        },interval)  
        
    }
    stop(){
        clearInterval(this.timer);
        //對定時器對象進行重置裸删,否則對象有值start方法無法開啟
        this.timer = null; 
    }
    //行為  如果未定義定位輸出
    action(){
        console.log(undefined);
    }
}
  • start開啟一個定時器,傳入?yún)?shù)為執(zhí)行間隔
  • action為定時器每次要執(zhí)行的行為阵赠,后續(xù)統(tǒng)一設(shè)置

【注】設(shè)置this.timer對定時器加鎖涯塔,防止定時器的多次開啟

? 清楚定時器后對定時器對象置null,否則定時器不能再次開啟

小鳥扇動翅膀

在鳥的類中設(shè)置一個狀態(tài)位,每個狀態(tài)位對應(yīng)一個圖片清蚀,快速替換圖片即可

小鳥掉落函數(shù)

在鳥的類中設(shè)置小鳥的初速度匕荸,每次移動的高度,每次獲取一次賦值即可

通過v = v + a * t h = v + 0.5 *a * t * t

計算新的速度及移動的距離枷邪,對小鳥top進行賦值即可

a及t可以自行設(shè)置每聪,我的設(shè)置為 0.01 20

 drop(){
        //計算出新的速度及移動的距離
        this.h = this.v + 0.5 * this.a * this.t * this.t;
        this.v = this.v + this.a * this.t;
        //對新top進行記錄
        this.top = this.top + this.h;
        //改變鳥的高度
        this.dom.style.top = `${this.top}px`;
        //后續(xù)的碰撞檢測
        this.positionY = parseInt(this.dom.style.top) + this.height /2;
        //當前top值是否碰到了大地?停止:繼續(xù)
        return this.top >= this.distance;
    }

小鳥跳躍函數(shù)

v設(shè)置為一個負值即可

管道生成函數(shù)

設(shè)置一個管道類,在一個固定位置通過定時器產(chǎn)生管道药薯,產(chǎn)生的管道存入數(shù)組中便于管理绑洛,管道的生成有以下幾個要點

  • 長度要隨機
    • 管道間的間隔是一個定制,我設(shè)置為整體高度的30%
    • 設(shè)置一個區(qū)間童本,生成這個區(qū)間內(nèi)的隨機數(shù)真屯,作為一個管道的高度
    • 剩下的管道通過總高度 - 隨機的管道高度 - 管道間隔計算
  • 將每對管道作為對象存入數(shù)組中,方便其移動及后面的碰撞檢測

管道移動函數(shù)

遍歷管道對象數(shù)組穷娱,統(tǒng)一left--即可

碰撞檢測

中心點:矩形寬高的一半

發(fā)生碰撞的條件是

小鳥中心點到管道中心點的橫向距離小于小鳥及管道寬度的和的一半同時

小鳥中心點到管道中心點的縱向距離小于小鳥及管道高度的和的一半


詳細代碼及注釋

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绑蔫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子泵额,更是在濱河造成了極大的恐慌配深,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嫁盲,死亡現(xiàn)場離奇詭異篓叶,居然都是意外死亡,警方通過查閱死者的電腦和手機羞秤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門缸托,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瘾蛋,你說我怎么就攤上這事俐镐。” “怎么了哺哼?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵佩抹,是天一觀的道長。 經(jīng)常有香客問我取董,道長匹摇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任甲葬,我火速辦了婚禮廊勃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘经窖。我一直安慰自己坡垫,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布画侣。 她就那樣靜靜地躺著冰悠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪配乱。 梳的紋絲不亂的頭發(fā)上溉卓,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天皮迟,我揣著相機與錄音,去河邊找鬼桑寨。 笑死伏尼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的尉尾。 我是一名探鬼主播爆阶,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沙咏!你這毒婦竟也來了辨图?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤肢藐,失蹤者是張志新(化名)和其女友劉穎故河,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吆豹,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡鱼的,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瞻讽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸳吸。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡铭拧,死狀恐怖集晚,靈堂內(nèi)的尸體忽然破棺而出锚扎,到底是詐尸還是另有隱情,我是刑警寧澤烦磁,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站哼勇,受9級特大地震影響都伪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜积担,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一陨晶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧帝璧,春花似錦先誉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渴庆,卻和暖如春铃芦,著一層夾襖步出監(jiān)牢的瞬間雅镊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工刃滓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仁烹,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓注盈,卻偏偏與公主長得像晃危,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子老客,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345