基于HTML5+WebSocket+JAVA的棋牌游戲開(kāi)發(fā),從入門(mén)到放棄(六)

1 前言

本文是做一款游戲的心路歷程。(不完全是教程)
代碼部署地址 部署的版本不一定是最新的。
其實(shí)已經(jīng)打算放棄了,但還是再堅(jiān)持一下吧。
我們本來(lái)打算新增一些功能,但是新增功能的時(shí)候舉步維艱,可能是時(shí)候把代碼整理整理一下了。

2 思考

我們注意到我們之前的前端代碼,我們把所有的東西都揉成一團(tuán),這對(duì)我們后面新增功能造成極大的不便。
我們重新思考一下我們的前端代碼,我們至少可以把這個(gè)分成3層:

  • 通信:這一層用來(lái)處理webSocket的通信,后面如果我們改變數(shù)據(jù)的交互格式,我們只要在這一層上動(dòng)土即可。
  • 邏輯處理: 用來(lái)處理各種邏輯與事件。
  • 圖像: 用來(lái)處理處理圖像,現(xiàn)在有棋盤(pán)與棋子。

3 實(shí)現(xiàn)

3.1 通信

  var Communicator = {
        createNew : function(host, handler){
            net = {};
            net.handler = handler;
            //鏈接等
            net.parse = function(data){
                //數(shù)據(jù)格式化,后期可以支持多種協(xié)議
            }
            //接收數(shù)據(jù)
            net.webSocket.onmessage = function(event){
                var result = net.parse(event.data);
                if (net.handler && typeof(net.handler) == "function"){
                    net.handler(result);
                }
            }

            net.sendMessage = function(data){
                //發(fā)送數(shù)據(jù),可以格式化數(shù)據(jù)
            }

            return net;
    }

這里我們用到一種叫做回調(diào)的概念,相信c/c++猴子不會(huì)陌生,當(dāng)我們創(chuàng)建這個(gè)通信模塊的時(shí)候,我們穿一個(gè)回調(diào)函數(shù)給他們,“你不用關(guān)心里面是啥,你需要的時(shí)候用他就行”,下面是一個(gè)回調(diào)的簡(jiǎn)單例子。

    doAlert = function(){
        alert("Hello World");
    }

    var Test = {
        createNew : function(handler){
            var test = {};
            test.action = handler;
            test.doActino = function(){
                if (test.action){
                    if (typeof(test.action) == "function"){
                        test.action();
                    }
                }
            }
            return test;
        }
    }

    test = Test.createNew(doAlert);
    test.doActino();

這里我們還用到一種偽類(lèi)的寫(xiě)法,javaScipt是一個(gè)腳本語(yǔ)言,我們可以通過(guò)上面的方式,寫(xiě)出一個(gè)Test的類(lèi),然后通過(guò)createNew實(shí)例化。

3.2 邏輯

邏輯是個(gè)大塊頭,基本上原有的代碼中的各種函數(shù)都在邏輯層,我們需要在邏輯層創(chuàng)建一個(gè)通信模塊。

    gmk.hanlderEvent = function(result){
        if (result.success == false){
            alert("系統(tǒng)異常" + event.data);
        }
        var action = result.model;
        if (action.code == "Start"){
            gmk.startGame(action);
        }else if (action.code == "Chess"){
            gmk.recieveChessMsg(action);
        }
    }

    gmk.communicator = Communicator.createNew(gmk.host, gmk.hanlderEvent);

這里把hanlderEvent傳給ommunicator,當(dāng)commuicator的webSocket觸發(fā)onMessage時(shí),就會(huì)調(diào)用hanlderEvent。

3.3 圖像

圖像是控制canvas顯示的,下面是棋盤(pán)的一個(gè)例子:

var BoardBrush = {
    createNew : function(ct){
        bb = {};
        bb.ct = ct;
        bb.show = function(){
            ct.clearRect(0, 0, 640, 640);
            ct.fillStyle = "#996600";
            ct.fillRect(0, 0, 640, 640);
            ct.fillStyle = "#CCFFFF";
            ct.strokeStyle = "white";
            for (var i = 0; i <= 640; i += 40){
                ct.beginPath();
                ct.moveTo(0, i);
                ct.lineTo(640, i);
                ct.closePath();
                ct.stroke();

                ct.beginPath();
                ct.moveTo(i, 0);
                ct.lineTo(i, 640);
                ct.closePath();
                ct.stroke();
            }
        }
        return bb;
    }
}

4 總結(jié)

重構(gòu)之后,前端的邏輯會(huì)清晰很多,減少了代碼的耦合,對(duì)我們后面的繼續(xù)開(kāi)發(fā)提供了極大的幫助。
最近學(xué)了一些js,感覺(jué)收獲還是挺大的。
代碼
代碼部署地址 部署的版本不一定是最新的。
希望大家批評(píng)指正。

Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容