1. 程式人生 > >hjr-MUD遊戲(二):HTML5-APP客戶端編寫

hjr-MUD遊戲(二):HTML5-APP客戶端編寫

搭建

用HTML5+APICloud做客戶端,Websocket與Python伺服器Twisted通訊,Sqlite3做資料庫

方案一:用多個HTML頁面

每個頁面作為一個Frame有不同功能,一個底部導航切換多個Frame,結果沒解決多個頁面共用一個WebSocket的問題。

方案二:用一個iframe改變src

聽說iFrame中src不同html路徑可以解決多個html共用一個WebSocket通訊問題,結果每個html頁面單獨的js程式碼與主頁js程式碼衝突,即只能所有程式碼都寫到主頁面,然後用父iFrame控制子iFrame的標籤,這樣又會出很多未知問題。

方案三:每個頁面放到一個DIV中,然後js控制display:none/block

最後只能用這種辦法了,不過一下子各種通訊錯誤找不到標籤問題都沒了,就是一個頁面內容多了點。

        function tab(id)
        {
            $(".panel_slider").css("display", "none");
            $("#"+id).css("display", "block");
        }
        或者
        function randomSwitchBtn(tag)
        {
            if(tag == "world")
            {
                $("#person"
).css("display","none"); $("#world").css("display","block");; } else if(tag == "person") { $("#world").css("display","none"); $("#person").css("display","block"); } }

伺服器資料解析

伺服器傳出的資料都是JSON和[String Object]形式的,需要判斷清楚,可以都進行JSON解析,然後try{},在catch裡用其他方式解析,因為既然報錯了就說明不是Json形式。如下:

        var decodeData;
        //是JSON串解碼,不是則賦值
        try{
            decodeData = JSON.parse(inputJsonData);
        }
        catch(e){
            decodeData = inputJsonData;
        }

佈局

屬性展示和功能按鍵佈局主要用Table,這樣看起來整齊,那種類似控制檯可以不斷滾動出一條條的內容的用div,設定成帶滾動條和自動定位到最新輸出資訊。

樣式

css可以把很多類似的div用同一個class名字,設定共有的樣式,然後在給這些div分別設定id,再給每個id設定如weith,height這樣的私有的樣式。類似下面這樣

/*panel*/
        .panel{border:2px solid #fff;font-size:12px; line-height:24px; word-wrap:break-word; overflow:auto;   word-break:break-all;}            

        /*news panel*/
        #panel_news{width:auto;height:180px;}   
        /*describe panel*/      
        #panel_describe{ width:auto;height:70px;position:relative; top:15px;}

彈窗

想要開啟新視窗可以這樣

<div id="win_thingsShow" style="text-align:center; border:1px red solid; width:60%; height:50%;position: absolute;top:25%;left:20%;display: none;">
    <!--title-->
    <div style="background-color: blue;color: red;">
        <!--close-->
        <span id="win_thingsShow_title"style="margin:auto;color:red;">標題文字</span>
        <span id="win_thingsShow_close"style="margin-left: 95%;color:red;cursor: pointer;"onclick='hideWin()'>X</span>
    </div>
    <!--desc-->
    <div id="win_thingsShow_desc"style="background-color:#0099FF;color: red;">我是描述</div>
    <!--context-->
    <div id="win_thingsShow_context"style="background-color:#0099FF;color: red;">
    </div>
</div>

//js程式碼
   function openWin()
   {
        $("#win_thingsShow").css("display","block")
   }
   function hideWin()
   {
        $("#win_thingsShow").css("display","none")
        $("#win_thingsShow_context").html("");
   }

寬度和高度很多可以用xx%代替具體數值,想要div居中,主要是父DIV’text-aline:center’,該DIV margin:auto,居於底部的話` position: fixed;bottom: 0px; 。

資料的接收設計

做了一個xxxModel和一個xxxProcess,xxx是接受的JSON資料的key,然後用類似於簡單工廠+反射的效果,websocked收到的JSON資料觸發方法,方法裡xxx自動變成的key,然後簡單工廠建立keyModel資料模型物件,和先編寫好keyProcess方法,再反射實現它,js可以這樣實現:

dataModel = new window[type+"Model"](context);//類似與簡單工廠
eval("this."+type+"Process"+"()");//類似於反射

可以try包住上面那兩句話
catch(error) {
alert(type+"Model資料模型不存在");
}


catch(error) {
alert(type+"Process處理程式不存在");
}

然後根據提示再填充資料模型物件與處理方法,每當從伺服器收到新型別的資料都會觸發提示,然後我們再根據提示編寫完善程式。