坚持做一件事真的好难~ 决定重新写博客的时候想着一定要坚持一个周一篇,然而....

年后上班老板找我的第一件大事:以后公司的棋牌产品不会有大的动作了;公司PHP(内部用的运营后台)的小姐姐休产假了,我暂时接手她的工作;以后公司会向着其他游戏方向发展,想让我去学习cocos;

写了egret 半年了,伴随着今天最后一个egret棋牌游戏上线,也就宣告着我的egret生涯暂时告一段落了,今天写点东西算是纪念一下吧。

一、因为是做的h5游戏,跑在微信浏览器里面的,所以前端出身的我还是有一点点优势的,尽管我只是个菜鸟。

对于egret 锁屏js休眠的问题,由于egret的这种机制,往往会导致用户在锁屏后(或者切出去之后)再进来就会发现游戏画面渲染出现错乱,可能要等到下个阶段渲染改组件的时候才恢复;

这种问题应该也不算是新鲜事了吧。在浏览器有这样一个事件可以监听当前页面是否处于激活状态:我是判断锁屏到解锁花了多久。一般超过5秒就会让用户刷新一下,重现渲染游戏画面。

Utils.activationDoc = function (status) {
//兼容写法
var hiddenProperty = 'hidden' in document ? 'hidden' :
'webkitHidden' in document ? 'webkitHidden' :
'mozHidden' in document ? 'mozHidden' :
null;
var visibilityChangeEvent = hiddenProperty.replace(/hidden/i, 'visibilitychange');
var hiddenTime = null;
var showTime = null;
var onVisibilityChange = function () {if (!document[hiddenProperty]) {
//激活做点什么
} else {
//非激活做点什么
}
}
document.addEventListener(visibilityChangeEvent, onVisibilityChange);
}

二、关于websocket

一直用不习惯egret提供的socket,所以借鉴了一个小框架大家可以看一看,学习一下,啥也不说了,都在代码里

// TypeScript file
class ReconnectingWebSocket {
//These can be altered by calling code
public debug:boolean = false; //Time to wait before attempting reconnect (after close)
public reconnectInterval:number = 1000;
//Time to wait for WebSocket to open (before aborting and retrying)
public timeoutInterval:number = 2000; //Should only be used to read WebSocket readyState
public readyState:number; //Whether WebSocket was forced to close by this client
private forcedClose:boolean = false;
//Whether WebSocket opening timed out
private timedOut:boolean = false; //List of WebSocket sub-protocols
private protocols:string[] = []; //The underlying WebSocket
private ws:WebSocket;
private url:string; /**
* Setting this to true is the equivalent of setting all instances of ReconnectingWebSocket.debug to true.
*/
public static debugAll = false; //Set up the default 'noop' event handlers
public onopen:(ev:Event) => void = function (event:Event) {};
public onclose:(ev:CloseEvent) => void = function (event:CloseEvent) {};
public onconnecting:() => void = function () {};
public onmessage:(ev:MessageEvent) => void = function (event:MessageEvent) {};
public onerror:(ev:ErrorEvent) => void = function (event:ErrorEvent) {}; constructor(url:string, protocols:string[] = []) {
this.url = url;
this.protocols = protocols;
this.readyState = WebSocket.CONNECTING;
this.connect(false);
} public connect(reconnectAttempt:boolean) {
this.ws = new WebSocket(this.url, this.protocols); this.onconnecting();
this.log('ReconnectingWebSocket', 'attempt-connect', this.url); var localWs = this.ws;
var timeout = setTimeout(() => {
this.log('ReconnectingWebSocket', 'connection-timeout', this.url);
this.timedOut = true;
localWs.close();
this.timedOut = false;
}, this.timeoutInterval); this.ws.onopen = (event:Event) => {
clearTimeout(timeout);
this.log('ReconnectingWebSocket', 'onopen', this.url);
this.readyState = WebSocket.OPEN;
reconnectAttempt = false;
this.onopen(event);
}; this.ws.onclose = (event:CloseEvent) => {
clearTimeout(timeout);
this.ws = null;
if (this.forcedClose) {
this.readyState = WebSocket.CLOSED;
this.onclose(event);
} else {
this.readyState = WebSocket.CONNECTING;
this.onconnecting();
if (!reconnectAttempt && !this.timedOut) {
this.log('ReconnectingWebSocket', 'onclose', this.url);
this.onclose(event);
}
setTimeout(() => {
this.connect(true);
}, this.reconnectInterval);
}
};
this.ws.onmessage = (event) => {
this.log('ReconnectingWebSocket', 'onmessage', this.url, event.data);
this.onmessage(event);
};
this.ws.onerror = (event) => {
this.log('ReconnectingWebSocket', 'onerror', this.url, event);
this.onerror(event);
};
} public send(data:any) {
if (this.ws) {
this.log('ReconnectingWebSocket', 'send', this.url, data);
return this.ws.send(data);
} else {
throw 'INVALID_STATE_ERR : Pausing to reconnect websocket';
}
} /**
* Returns boolean, whether websocket was FORCEFULLY closed.
*/
public close():boolean {
if (this.ws) {
this.forcedClose = true;
this.ws.close();
return true;
}
return false;
} /**
* Additional public API method to refresh the connection if still open (close, re-open).
* For example, if the app suspects bad data / missed heart beats, it can try to refresh.
*
* Returns boolean, whether websocket was closed.
*/
public refresh():boolean {
if (this.ws) {
this.ws.close();
return true;
}
return false;
} private log(...args: any[]) {
if (this.debug || ReconnectingWebSocket.debugAll) {
console.debug.apply(console, args);
}
}
}

最后的egret的更多相关文章

  1. [Egret]优雅的写http

    首先,自从使用链式调用的写法后,就一发不可收拾的喜爱上了这种优雅的方式.不管是写架构还是写模块,我都会不自觉的使用这种最优雅的方式.链式写法既减少了代码量,又非常优雅的. 在使用 egret 的htt ...

  2. egret调用页面js的方法。

    参考文献: http://bbs.egret-labs.org/thread-267-3-1.html http://docs.egret-labs.org/post/manual/threelibs ...

  3. egret GUI 和 egret Wing 是我看到h5 最渣的设计

    一个抄袭FlexLite抄的连自己思想都没有,别人精髓都不懂的垃圾框架.也不学学MornUI,好歹有点自己想法. 先来个最小可用集合吧: 1. egret create legogame --type ...

  4. JS / Egret 单笔手写识别、手势识别

    UnistrokeRecognizer 单笔手写识别.手势识别 UnistrokeRecognizer : https://github.com/RichLiu1023/UnistrokeRecogn ...

  5. 自制-随机生成不重复的数组 --算法,egret平台下的TS code

    感觉这个算法经常会用到,前段时间写过一次,现在push出来.原理是有两个数组,一个数组存放随机数,然后从另一个数组提取相关的数,然后把另一个数组的大小-1,remove掉这个数,unity里也是这个原 ...

  6. Egret白鹭H5小游戏开发入门(二)

    前言: 昨天的文章中简单的介绍了Egret白鹭引擎从安装到基本的使用配置等问题,今天着重介绍H5小游戏开发的起步阶段,如Wing面板的使用,素材的处理,类的说明,开始布局等等. 整体概况: 根据上一篇 ...

  7. egret.Tween、egret.Ease

    循环调用.只能设置boolean,不能设置循环次数. egret.Tween.).call(()=>{ console.log("循环调用"); }) 每次改变时,调用onC ...

  8. Egret白鹭H5小游戏开发入门(三)

    前言: 在上一篇文章中着重介绍了H5小游戏开发的起步阶段,如Wing面板的使用,素材的处理,类的说明等等,那么今天主要是涉及到场景的创建,loading的修改等等的代码编写. 对于这一节,我在讲解的过 ...

  9. Egret白鹭H5小游戏开发入门(一)

    前言: 好久没更新博客了,以前很多都不会,所以常常写博客总结,倒是现在有点点经验了就懒了.在过去的几个月里,在canvas游戏框架方面,撸过了CreateJS,玩得了Egret,又学过PIXI.js. ...

  10. Html5 Egret游戏开发 成语大挑战(九)设置界面和声音管理

    在上一篇中,简单的使用界面元素快速实现了一个游戏中的二级页面,这种直接在游戏页面上做UI的做法并不太好,原因是,UI会让游戏的压力变大,即使它是隐蔽的,如果同样的功能在其它的地方也是一样的,那么就要写 ...

随机推荐

  1. 跳一跳外挂的python实现--OpenCV步步精深

    去我的个人网站看看吧 http://opencvblog.com/跳一跳外挂-python实现/ 都在这里啦

  2. LA 3263 /// 欧拉定理 oj21860

    题目大意: n个端点的一笔画 第n个和第1个重合 即一笔画必定是闭合曲线 输出平面被分成的区域数 欧拉定理 V+F-E=2 即 点数+面数-边数=2 (这里的面数包括了外部) #include < ...

  3. IOS中iframe的滚动条不启作用

    引自:https://www.cnblogs.com/weinan/archive/2013/01/05/2832800.html 问题描述: iframe设置了高度(例如500px).倘若ifram ...

  4. Linux系统搭建Red5服务器

    Linux系统搭建Red5服务器 Red5 是 支持Windows,Linux等多平台的RTMP流媒体服务器,Windows下搭建相对容易,图形界面操作比较简单,Linux服务器的环境下没有图形界面, ...

  5. sql(11) sum

    合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句. GROUP BY 语句GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组.新建表 StudentSS_id G ...

  6. ASCII, Unicode 与 UTF-8

    1,ASCII 由于计算机是美国人发明的,最早只有127个字符,即大小写英文字母.数字.一些符号,被编码到计算机里,这个编码表就是ASCII表.这时每个字符用1 Byte表示. 2,Unicode 当 ...

  7. 关于SecureCRT不能显示输入、换行不正常

    网上绿色破解版的SecureCRT会碰到这种问题,即输入字符不显示在终端.换行后下一行的行首有很大一段退格: 如上,输入的指令不显示:回车后下一行的起始位置不对. 碰到这种问题,在波特率.奇偶校验.停 ...

  8. HTML清楚塌陷问题

    /* 清除浮动塌陷问题 */.clearfix:after { clear: both;} .clearfix:after,.clearfix:before { content: " &qu ...

  9. kubernetes监控和性能分析工具:heapster+influxdb+grafana

    1.部署heapster 下载 heapster 相关 yaml 文件 [root@master dashboard]# wget https://raw.githubusercontent.com/ ...

  10. python使用PIL处理图片后返回给前端的坑

    一.python代码 这里有个坑,之前没有将bytes图片数据转成base64就返回到前端了,但在前端处理的时候,怎么都显示不出图片来,虽然数据拿到了,但bytes被传到前后变str了,所以怎么搞都没 ...