VUE+WebPack游戲設(shè)計:實現(xiàn)盒子動畫和鍵盤特效

繼上一節(jié)我們已經(jīng)在畫面上完成了數(shù)字盒子的繪制,現(xiàn)在我們就啟動游戲主循環(huán)产镐,在主循環(huán)中驅(qū)動游戲流程倡蝙,在此九串,我們先實現(xiàn)盒子從上往下落的效果。在gamescenecomponent.vue中添加一下代碼:

<script>
 export default {
   data () {
     return {
     fallingSpeed: 0.8,
     ticksPerNewBox: 80
     ....
     }

代碼中添加的兩個變量將用來控制數(shù)字盒子下落的速度。createjs庫給我們提供一種有效的動畫實現(xiàn)機制猪钮,它會導(dǎo)出一個Ticker類品山,該類提供了一個接口setFPS, 例如通過調(diào)用createjs.Ticker.setFPS(40), 那么createjs就能對頁面在一秒內(nèi)進行40次刷新,每次刷新時會發(fā)出一個'tick'消息烤低,我們只要監(jiān)聽這個消息肘交,并提供會調(diào)函數(shù),那么createjs就會在一秒內(nèi)回調(diào)我們的函數(shù)40次扑馁,在該函數(shù)中涯呻,我們再通過createjs提供的其他接口繪制頁面就能實現(xiàn)動畫效果了。因此我們繼續(xù)添加相關(guān)代碼:

methods: {
     init () {
       this.createjs = window.createjs
       this.canvas = document.getElementById('canvas')
       this.stage = new this.createjs.Stage(this.canvas)
       this.createjs.Ticker.setFPS(40)
       this.createjs.Ticker.addEventListener('tick', this.tick)
     },
     tick (e) {
       this.stage.update()
       if (!e.paused) {
         this.moveObjects()
         var ticksCount = this.createjs.Ticker.getTicks(true)
         if (ticksCount % this.ticksPerNewBox === 0) {
           this.generateNumberBox()
         }
       }
     },
     moveObjects () {
       for (var i = 0, len = this.numberBoxes.length; i < len; i++) {
         var box = this.numberBoxes[i]
         box.y += this.fallingSpeed
       }
     },
     ....
}

在初始化函數(shù)init中腻要,我們讓createjs一秒內(nèi)回調(diào)我們提供的tick回調(diào)函數(shù)40次魄懂,createjs不斷的回調(diào)我們的tick函數(shù),這個情況實質(zhì)上構(gòu)成了游戲的主循環(huán)闯第,在上一個游戲神廟逃亡中市栗,我們是通過一個for循環(huán)來實現(xiàn)游戲主循環(huán)的,這里我們通過createjs的定時回調(diào)機制實現(xiàn)游戲的主循環(huán)咳短。

在tick函數(shù)被回調(diào)時填帽,createjs會給它傳遞一個參數(shù),我們通過讀取這個參數(shù)的paused值用于判斷游戲是否處于暫停狀態(tài)咙好,如果不是篡腌,那么我們調(diào)用moveObjects,移動頁面上各個成員的位置,這種移動就構(gòu)成了一種動畫效果勾效,由于頁面里的成員都是數(shù)字盒子嘹悼,因此調(diào)用moveObjects將實現(xiàn)數(shù)字盒子從上往下落的效果。

通過getTicks接口层宫,我們能獲得當前函數(shù)被回調(diào)了多少次杨伙,如果回調(diào)的次數(shù)正好是80的倍數(shù),也就是this.ticksPerNewBox的值的倍數(shù)時萌腿,我們通過this.generateNumberBox()在頁面上繪制新的數(shù)字盒子限匣。

moveObjects()接口的實現(xiàn)邏輯是,遍歷當前所有數(shù)字盒子毁菱,分別把他們的y坐標加上this.fallingSpeed,也就是0.8, 于是每次頁面刷新時米死,頁面上的數(shù)字盒子坐標總往下挪動0.8個單位。以上所有代碼完成后贮庞,加載頁面得到效果如下:

這里寫圖片描述

可以看到有很多數(shù)字盒子在單位時間內(nèi)從頂部紛紛往下落峦筒。

接下來我們需要完成的,是在底部添加一個數(shù)字鍵盤窗慎,游戲的玩法是物喷,玩家在底部數(shù)字鍵盤點擊選取兩個值后,如果兩個值的乘機與盒子中的數(shù)值相等,那么盒子就會被爆破掉脯丝。首先在template標簽中添加以下代碼:

<template>
  <div>
    <canvas id="canvas" width="300" height="480">
    </canvas>
    <div id="control-box">
      <a class="control" v-for="n in 12" :data-value="n" href=# @click="controlClicked">
      {{n}}
      </a>
    </div>
  </div>
</template>

我們通過VUE的v-for指令商膊,循環(huán)生成12個下面代碼所描述的DOM元素:

<a class="control" data-value="1" href="#" @click="controlClicked"></a>

這些元素將在頁面上被繪制成兩排數(shù)字鍵盤,接著再style標簽區(qū)域添加樣式代碼:

<style scoped>
  #canvas {
    background: #333; 
  }
  #control-box {
    width: 100%;
    overflow: auto;
    position: absolute;
    bottom: 0;
  }

  .control {
    display: block;
    float: left;
    width: 50px;
    height: 50px;
    background: gray;
    text-align: center;
    line-height: 50px;
    font-size: 24px;
    font-family: impact;
  }

  .control.active {
    background: white;
    color: red;
  }
</style>

代碼完成后宠进,加載如瀏覽器晕拆,你可以看到如下效果:


這里寫圖片描述

現(xiàn)在點擊鍵盤的話,頁面是沒有反應(yīng)的材蹬,接下來我們添加鍵盤點擊后的響應(yīng)函數(shù)实幕,在script標簽中添加如下代碼:

export default {
   data () {
     return {
     ....
     calculationText: null,
     controlHeight: 100,
     inputs: [],
     result: 1
    }
  },
  methods: {
     init () {
       this.createjs = window.createjs
       this.canvas = document.getElementById('canvas')
       this.stage = new this.createjs.Stage(this.canvas)
       this.createjs.Ticker.setFPS(40)
       this.createjs.Ticker.addEventListener('tick', this.tick)

       this.calculationText = new this.createjs.Text('1X1=1', '18px Impact', 'White')
       this.calculationText.textAlign = 'center'
       this.calculationText.x = this.gameWidth / 2
       this.calculationText.y = this.gameHeight - this.controlHeight - 30
       this.stage.addChild(this.calculationText)
     },
     updateText (string) {
       this.calculationText.text = string
     },
     controlClicked (e) {
       var value = e.target.dataset.value
       var string = this.addInput(value)
       this.updateText(string)
     },
     addInput (value) {
       if (this.inputs.length >= 2) {
         this.clearInputs()
       }

       this.inputs.push(value)
       this.result *= value
       return this.inputs.join('X') + '=' + this.result
     },
     clearInputs () {
       this.inputs.length = 0
       this.result = 1
     },
     ....
     }
}

calculationText是顯示在頁面上的字符串對象,在init函數(shù)里初始化后加入到stage容器中堤器,當鍵盤的按鍵被點擊時昆庇,由于我們通過@click指令進行綁定的緣故,一旦按鍵點擊后闸溃,controlClicked函數(shù)會被調(diào)用整吆,該函數(shù)調(diào)用時會把點擊事件對象當做參數(shù)傳給我們,通過該對象的target成員辉川,我們就能獲得按鍵的DOM對象表蝙,注意我們在前面實現(xiàn)的12個按鍵對象時,在里面添加一個屬性叫data-value,該屬性的值就是按鍵在頁面上顯示的值乓旗,通過e.target.dataset就是在讀取data-value屬性府蛇,e.target.dataset.value就是獲得data-value對應(yīng)的屬性值。

讀取到按鍵的data-value屬性值后屿愚,我們就知道用戶點擊了哪個按鍵汇跨,并獲得了按鍵的數(shù)值,然后把該數(shù)值傳遞給addInput函數(shù)妆距,這個函數(shù)的作用是把用戶點擊的按鈕值構(gòu)建成一個字符串穷遂,加入用戶點擊了按鈕"1"和"2",那么addInput就會構(gòu)造出字符串"1X2=2",接著調(diào)用updateText把該字符串顯示到頁面上,完成這些代碼后毅厚,加載頁面塞颁,可以看到如下效果:

這里寫圖片描述

再下一節(jié),我們將在此基礎(chǔ)上完成盒子被爆破的效果吸耿,并實現(xiàn)界面美化,最后使得我們的游戲變得像本節(jié)剛開始介紹時得樣子酷窥。

更詳細的講解和代碼調(diào)試演示過程咽安,請點擊鏈接

更多技術(shù)信息,包括操作系統(tǒng)蓬推,編譯器妆棒,面試算法,機器學(xué)習,人工智能糕珊,請關(guān)照我的公眾號:


這里寫圖片描述
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末动分,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子红选,更是在濱河造成了極大的恐慌澜公,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喇肋,死亡現(xiàn)場離奇詭異坟乾,居然都是意外死亡,警方通過查閱死者的電腦和手機蝶防,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門甚侣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人间学,你說我怎么就攤上這事殷费。” “怎么了低葫?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵详羡,是天一觀的道長。 經(jīng)常有香客問我氮采,道長殷绍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任鹊漠,我火速辦了婚禮主到,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘躯概。我一直安慰自己登钥,他們只是感情好,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布娶靡。 她就那樣靜靜地躺著牧牢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姿锭。 梳的紋絲不亂的頭發(fā)上塔鳍,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機與錄音呻此,去河邊找鬼轮纫。 笑死,一個胖子當著我的面吹牛焚鲜,可吹牛的內(nèi)容都是我干的掌唾。 我是一名探鬼主播放前,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼糯彬!你這毒婦竟也來了凭语?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤撩扒,失蹤者是張志新(化名)和其女友劉穎似扔,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體却舀,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡虫几,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了挽拔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辆脸。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖螃诅,靈堂內(nèi)的尸體忽然破棺而出啡氢,到底是詐尸還是另有隱情,我是刑警寧澤术裸,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布倘是,位于F島的核電站,受9級特大地震影響袭艺,放射性物質(zhì)發(fā)生泄漏搀崭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一猾编、第九天 我趴在偏房一處隱蔽的房頂上張望瘤睹。 院中可真熱鬧,春花似錦答倡、人聲如沸轰传。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽获茬。三九已至,卻和暖如春倔既,著一層夾襖步出監(jiān)牢的瞬間恕曲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工渤涌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留码俩,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓歼捏,卻偏偏與公主長得像稿存,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瞳秽,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容