在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/數(shù)據(jù)庫  HTML/ 蕭井陌直播代碼第一集 注冊(cè)事件代碼的不理解

蕭井陌直播代碼第一集 注冊(cè)事件代碼的不理解

javascript 新手, 最近在看蕭大直播編程, 第一集就有不明白的地方, 在蕭大重構(gòu)的時(shí)候, 在 GuaGame 里面對(duì) event, setInterval 進(jìn)行了一個(gè)注冊(cè)事件, 我不是很懂這個(gè)注冊(cè)事件的原理是怎樣的, 望有看過直播的人能解答一下:

沒重構(gòu)之前的代碼大概是這樣的:

window.addEventListener('keyup', function() {
    var k = event.key
    if (k == 'a') {
        leftDown = false
    }
    else if (k == 'd') {
        rightDown = false
    }
})

setInterval(function() {
    // update x
    if (leftDown) {
        x -= speed
    }
    else if (rightDown) {
        x += speed
    }
    // draw
    context.clearRect(0, 0, canvas.width, canvas.height)
    context.drawImage(img, x, y)
}, 1000/30)

我的理解是:
對(duì) KeyboardEvent 進(jìn)行監(jiān)聽, 如果是按下對(duì)應(yīng)的鍵(比如'a')就執(zhí)行 setInterval函數(shù)來移動(dòng) paddle

重構(gòu)以后這部分代碼變成了這樣:

var g = {
        actions: {},
        keydowns: {},
    }
    window.addEventListener('keydown', function(event){
        g.keydowns[event.key] = true
    })
    window.addEventListener('keyup', function(event){
        g.keydowns[event.key] = false
    })
    // 注冊(cè)事件
    g.registerAction = function(key, callback) {
        g.actions[key] = callback
    }
    // timer
    setInterval(function() {
        // events
        var actions = Object.keys(g.actions)
        for (var i = 0; i < actions.length; i++) {
            var key = actions[i]
            if (g.keydowns[key]) {
                // 如果案件被按下, 調(diào)用注冊(cè)的 actions
                g.actions[key]()
            }
        }
        // update
        g.update()
        context.clearRect(0, 0, g.canvas.width, g.canvas.height)
        // draw
        g.draw()
    }, 1000/30)

不是很理解這個(gè) actionskeydowns兩個(gè)對(duì)象到底是儲(chǔ)存了什么, 這段注冊(cè)事件到底是怎么一個(gè)原理.

若有人能解答, 不勝感激, 謝謝

回答
編輯回答
兮顏

我沒有看過直播,但是這個(gè)例子我想應(yīng)該是這樣理解:
最初的代碼里面,很多硬編碼,主要時(shí)那兩段if-else,如果要加入其他按鍵,比如c鍵、d鍵,會(huì)很麻煩
重構(gòu)之后g.keydowns保存所有預(yù)定義的按鍵的狀態(tài),g.actions里面保存按鍵上綁定的函數(shù),然后在下面的setInterval中接收按鍵的狀態(tài),然后調(diào)用綁定的函數(shù),這樣一來,以后要加入新的按鍵和函數(shù)就會(huì)很容易,只要對(duì)外開放一個(gè)注冊(cè)接口,然后在外面注冊(cè)就行了。
這是一個(gè)比較經(jīng)典的重構(gòu)的例子,martin fowler的書里面講過

2018年2月16日 04:40
編輯回答
溫衫

采用這樣的機(jī)制主要是為了方便定義不同的鍵值進(jìn)行特殊功能綁定時(shí)減少硬編碼,需要注意的是并不是 在一定的條件下 才執(zhí)行 setInterval,而是 setInterval其實(shí)一直在監(jiān)聽,只是大多數(shù)時(shí)候是空轉(zhuǎn),只有在有行為被標(biāo)記為可執(zhí)行時(shí)才真實(shí)執(zhí)行。

2017年6月9日 02:33