亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript實現(xiàn)HTML5游戲斷線自動重連的方法

 更新時間:2017年09月18日 14:30:52   投稿:mrr  
這篇文章主要介紹了JavaScript實現(xiàn)HTML5游戲斷線自動重連的方法,需要的朋友可以參考下

斷線重連的需求一斷線重連原理二游戲內(nèi)自動重連不刷新三刷新游戲自動重連重連數(shù)據(jù)Locationreplace重置url重連四實際項目中處理重連機(jī)制最后的總結(jié)斷線重連的需求

尤其是手機(jī)上,會因為網(wǎng)絡(luò)的不穩(wěn)定或者其他原因,導(dǎo)致用戶的socket鏈接斷開。這個時候如果直接讓玩家退出游戲,重新登錄,無疑是非常影響用戶體驗的事情。所以根據(jù)這個需求,就有需要程序來實現(xiàn)斷線后自動重連回去的技術(shù),是用戶能夠再次快速開始游戲進(jìn)行戰(zhàn)斗。

一、斷線重連原理

原來其實很簡單,就是在斷線的時候,根據(jù)用戶的點擊(有些時間短的就不用點擊,默認(rèn)是自動重連回來),程序自動識別,是要刷新重新進(jìn)入游戲還是幫用戶自動重連。客戶端會根據(jù)自動重連標(biāo)記,幫用戶自動做事情。比如自動登陸、選角色、進(jìn)入場景、請求同步后臺數(shù)據(jù)等等。

根據(jù)實現(xiàn)機(jī)制,大致可以分兩種實現(xiàn)方法。主要是游戲內(nèi)自動重連(不刷新)和刷新游戲自動重連,后面會詳細(xì)講兩種實現(xiàn)機(jī)制,以及相關(guān)的利弊。

二、游戲內(nèi)自動重連(不刷新)

這種是比較難的,因為不刷新游戲,那么會因為一段時間的斷開游戲,導(dǎo)致客戶端數(shù)據(jù)跟服務(wù)器數(shù)據(jù)不同步了。比如怪物的位置、獲得的獎勵、進(jìn)度等等。這些需要一開始就設(shè)計好,如果策劃在后期要求加這個,那幾乎是無法實現(xiàn)的,改動太大了。所以假設(shè)要這么多,大概是類似下面的做法。(如果真要詳細(xì),得一篇新的Blog了:)

1. 客戶端和服務(wù)端協(xié)定好那些數(shù)據(jù)需要客戶端自己同步

2. 斷線多久內(nèi)可以自動重連(策劃以及技術(shù)上的實現(xiàn)來互相評估)

3. 服務(wù)端提供自動重連的協(xié)議,同時用戶斷線第一時間不應(yīng)該就銷毀掉相關(guān)數(shù)據(jù)(這里比較復(fù)雜,比如自動戰(zhàn)斗是否要一直在服務(wù)器掛著,以及其他的一些關(guān)聯(lián)操作)

4. 客戶端不刷新游戲,使用新接口重新連接服務(wù)器,自動更新和同步相應(yīng)的數(shù)據(jù)(比如同步怪物位置或者其他人物位置等等)

這種技術(shù)一般用于回合制之類的游戲,一般不涉及戰(zhàn)斗系統(tǒng)。如果arpg的話,只能短暫的時間內(nèi)可以自動重連,不然的話變數(shù)太大?;蛘咝枰鲆恍┳兎N,比如單純場景的怪物之類的刷新下,但是世界boss之類的場景就得重新載入之類的特殊處理。

三、刷新游戲自動重連

我個人感覺這個是簡單粗暴又實用的做法。大部分游戲都適合使用,只要一刷新,游戲的數(shù)據(jù)都沒了,全部重新開始,客戶端只需要根據(jù)標(biāo)記來做一些自動化的操作,容易很多。,同時服務(wù)器也不用更改,穩(wěn)定也不容易出錯。唯一不好的就是用戶體驗會稍微差一些。

重連數(shù)據(jù)

字符串?dāng)?shù)據(jù):

//ip + 用戶標(biāo)識 + 服id + 服名字 (數(shù)據(jù)根據(jù)自己項目情況)
var reload:string = ip + "#" + token + "#" + serverId + "#" +serverName;
//后面的reload字符串都是這里的內(nèi)容

重連標(biāo)識:

reload //字符串

注意:刷新只能刷新自己的頁面。(比如在iframe里面的時候)

Location.replace重置url重連

這種比較簡單,也不會有什么兼容性的問題。就是重連的時候,把之前的登錄用戶以及服務(wù)端地址給記錄起來

通過url來附帶參數(shù),最后再實際使用中解析出來,通過判斷屬性是否重載,

Location 對象的replace()方法:用新的文檔替換當(dāng)前文檔。

通過傳入新的url(其實是原url + 附帶重連數(shù)據(jù))

location.replace(oldUrl + "reload#" + reload);

是必須走url,而且還需要和原來的參數(shù)進(jìn)行兼容處理。在游戲游戲中可能是這樣的url了:

地調(diào)試1

http://localhost:63342/game/index.html?reload=1&host=ws://192.168.0.10:1050/ws&token

cookie 是存儲于訪問者的計算機(jī)中的變量。每當(dāng)同一臺計算機(jī)通過瀏覽器請求某個頁面時,就會發(fā)送這個 cookie。你可以使用 JavaScript 來創(chuàng)建和取回 cookie 的值。

利用cookie的本地存放功能,也比較方便,但是會有些手機(jī)瀏覽器可能會無法讀取到。

document.cookie = "reload#" + reload;

1.使用Html5的window.localStorage

localStorage 屬性允許你訪問一個 local Storage 對象。localStorage 與 sessionStorage 相似。不同之處在于,存儲在 localStorage 里面的數(shù)據(jù)沒有過期時間(expiration time),而存儲在 sessionStorage 里面的數(shù)據(jù)會在瀏覽器會話(browsing session)結(jié)束時被清除,即瀏覽器關(guān)閉時。

應(yīng)該注意的是,無論是 localStorage 還是 sessionStorage 中保存的數(shù)據(jù)都僅限于該頁面的協(xié)議。

既然是H5游戲,當(dāng)然重點是使用這個了,先看下localStorage的API

window.localStorage.setItem("reload", reload);

讀?。?/p>

var reload = window.localStorage.getItem("reload");

1.使用Egret的本地保存

使用Egret會更方便,他進(jìn)行了封裝,H5和打包成本地都可以支持。localStorage.ts

egret.localStorage接口
//保存數(shù)據(jù)
export let getItem:(key:string)=>string;
//刪除數(shù)據(jù)
export let removeItem:(key:string)=>void;
//將所有數(shù)據(jù)清空
export let clear:()=>void;
Web實現(xiàn)類WebLocalStorage.ts
namespace egret.localStorage.web {
function getItem(key:string):string {
return window.localStorage.getItem(key);
}
function setItem(key:string, value:string):boolean {
try{
window.localStorage.setItem(key, value);
return true;
}
catch(e){
egret.$warn(1047, key, value);
return false;
}
}
function removeItem(key:string):void {
window.localStorage.removeItem(key);
}
function clear():void {
window.localStorage.clear();
}
localStorage.getItem = getItem;
localStorage.setItem = setItem;
localStorage.removeItem = removeItem;
localStorage.clear = clear;
}

可以看到內(nèi)部其實也是采用了window.localStorage來進(jìn)行實現(xiàn),同時做了一場處理,最后是通過localStorage接口進(jìn)行賦值給外部調(diào)用。下面是實際使用方法:

//使用egret的本地存放方法做
egret.localStorage.setItem("reload",reload);
//游戲中獲取
var reload:string = egret.localStorage.getItem("reload");

四、實際項目中處理重連機(jī)制

這里的代碼是刷新之后重新進(jìn)入游戲,然后通過之前的數(shù)據(jù)(url或者本地緩存)解析出相應(yīng)的數(shù)據(jù)來進(jìn)行判斷。

解析url

var reload:string = location.href;

本地緩存獲取數(shù)據(jù)

var reload:string = egret.localStorage.getItem("reload");
console.info("reload數(shù)據(jù):" + reload);
if(reload && reload != "")
{
var cooks:string[] = reload.split("#");
console.info("斷線重連刷新過來的");
this.session.isReload = true;
this.session.host = cooks[0];
this.session.token = cooks[1];
this.session.serverId = Number(cooks[2]);
this.session.serverName = cooks[3];
}

通過游戲內(nèi)的變量進(jìn)行判斷處理

if(this.session.isReload)
{
//開始自動重連,走額外的協(xié)議以及自動處理
}
else
{
//走正常的流程
}

最后的總結(jié)

斷線重連這里主要是講了一些思路以及實際項目中的應(yīng)用。代碼算是偽5代碼了,讀者應(yīng)該根據(jù)自己項目實際情況來設(shè)計,做一些相應(yīng)變化,原理是一樣的。

我們有一個項目是有遇到過其中的一個問題,因為一開始沒有考慮自動重連的問題,在客戶端和服務(wù)器都沒這里的考慮。所以沒辦法做到不刷新游戲來進(jìn)行重連(主要是成本太大,又是arpg游戲),最終是選擇了游戲自己刷新來實現(xiàn)的機(jī)制的。當(dāng)然也會遇到一些坑,比如接入一些平臺,只能刷新自己的html,無法刷新平臺的html(游戲內(nèi)嵌),導(dǎo)致平臺的sdk的問題(影響充值、關(guān)注等等)。不過最終都是有通過變通之類的進(jìn)行解決了。

以上所述是小編給大家介紹的JavaScript實現(xiàn)HTML5游戲斷線自動重連的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • javascript實現(xiàn)簡易計算器的代碼

    javascript實現(xiàn)簡易計算器的代碼

    下面小編就為大家?guī)硪黄猨avascript實現(xiàn)簡易計算器的代碼小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • js輸出陰歷、陽歷、年份、月份、周示例代碼

    js輸出陰歷、陽歷、年份、月份、周示例代碼

    本篇文章主要是對js輸出陰歷、陽歷、年份、月份、周示例代碼進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • JavaScript 模式之工廠模式(Factory)應(yīng)用介紹

    JavaScript 模式之工廠模式(Factory)應(yīng)用介紹

    工廠模式也是對象創(chuàng)建模式之一,它通常在類或類的靜態(tài)方法中去實現(xiàn),本文將詳細(xì)介紹JavaScript 工廠模式
    2012-11-11
  • 微信小程序-可移動菜單的實現(xiàn)過程詳解

    微信小程序-可移動菜單的實現(xiàn)過程詳解

    這篇文章主要介紹了微信小程序-可移動菜單的實現(xiàn)過程詳解,我們可以經(jīng)??吹绞謾C(jī)app里有的菜單欄是懸浮在首頁的,用戶可以拖動和點擊菜單欄進(jìn)行交互,今天就教大家利用小程序的控件,,需要的朋友可以參考下
    2019-06-06
  • 微信小程序云開發(fā) 生成帶參小程序碼流程

    微信小程序云開發(fā) 生成帶參小程序碼流程

    這篇文章主要為大家詳細(xì)介紹了微信小程序云開發(fā),生成帶參小程序碼,云函數(shù)網(wǎng)絡(luò)請求,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • js使用心得分享

    js使用心得分享

    這里給大家分享的是本人近期學(xué)習(xí)與使用javascript之后總結(jié)出來的一些經(jīng)驗和心得,雖然目前只有5點,但以后會慢慢更新,希望對大家能有所幫助。
    2015-01-01
  • Openlayers顯示地理位置坐標(biāo)的方法

    Openlayers顯示地理位置坐標(biāo)的方法

    這篇文章主要為大家詳細(xì)介紹了Openlayers顯示地理位置坐標(biāo),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • js之input[type=file]選擇重復(fù)的文件,無法觸發(fā)change事件問題

    js之input[type=file]選擇重復(fù)的文件,無法觸發(fā)change事件問題

    這篇文章主要介紹了js之input[type=file]選擇重復(fù)的文件,無法觸發(fā)change事件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • javascript中關(guān)于執(zhí)行環(huán)境的雜談

    javascript中關(guān)于執(zhí)行環(huán)境的雜談

    如你所知,javascript里執(zhí)行環(huán)境是作為一個最核心的概念存在的。相信廣大FE筒子們對于這個概念不會陌生,它定義了變量或函數(shù)有權(quán)訪問其他數(shù)據(jù)范圍以及其行為。
    2011-08-08
  • 通過實例解析JavaScript常用排序算法

    通過實例解析JavaScript常用排序算法

    這篇文章主要介紹了通過實例解析JavaScript常用排序算法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09

最新評論