2018-8-3lesson

Aug 25, 2018

2018/8/3

TS 使用enum 出现[ts] Operator ‘==’ cannot be applied to types

[ts] Operator '==' cannot be applied to types 'CheckCleanStep.Idle | CheckCleanStep.Input' and 'CheckCleanStep.Check'.
Typescript 出现和这个issue https://github.com/Microsoft/TypeScript/issues/15835 一样。
目前解决方法是,在判别的时候,强制判别类型

1
2
3
if ((checkStep as CheckCleanStep) == CheckCleanStep.Check) {
//do stuff
}

周末写Typescript 游戏有感

  1. egret TypeScript 游戏在lib 选项,是es5,于是在要用到Map、Set 时,需要给其添加上es6 才能使用。
    由于在最终打包时,只能打为es5,尴尬的一幕出现了:Map 在’for of’ 语句 提示,在es5 中,不能使用literial,没有这玩意(该为es6 新增对象)一样。
    使用’for in’ 出现的问题是该loop 不会进入。
    还有一种备选办法是:Array.from(map.keys()/map.values())
    这样在每次都需要创建新的Array。
    最终我的处理是map.forEach((value, key) => {})

  2. 之前写法是Object => {} 保存数据格式。简直太js,于是全部改为对象处理。啊,啊,,爽。

  3. 需要注意的是Map、Set 在需要正确使用set、add、get、size、delete等。千万千万别map[key] = value;变成使用{} 对象方法了。
  4. egret 中exml 的元件是在this 对象中。
  5. 游戏的好不好玩并不是功能。体现在对游戏的难度分级和结果回馈。
    难度分级就是由简单到复杂,由平缓到陡峭。
    结果肯定明了:分数不能低的难看啊,怎么的,玩个200多分、300分,心里爽啊。20分就难看啦。
  6. 断点修改,好用,for 循环的断点,太好用,简直。
  7. 逻辑、玩法多打注释。毕竟游戏跟需求是天生姻缘。
  8. 合理的建立对象。合理的摆放对象坐标。
  9. 对象初始化。如果知道对象初始化为null,数组初始化个数,则在申明时就给其定义规则。
  10. egret.Sound 这个类,不能被继承!我继承就报错,之后接触多了再看原因。
  11. 声音播放有个大坑。初始化完我就播放,老是会播放惜败,似乎要延时播放才可以。
    其 示例- 声音播放 教程,是初始化完成、界面显示完成后,用户点击播放,那么微信、QQ、网页、模拟器都是播放正常的。
    但是修改成mp3 加载完成立即播放,就也是QQ、模拟器能播放,其他都不能播放了。

nginx 出现permission delay

  1. 原因是控制该nginx 的能力为nobody,权限不够。
    改为user root;能暂时解决该问题。但是安全性不够。
  2. 设置egret 游戏服务器
    1
    2
    3
    4
    5
    6
    7
    server
    {
    listen 80;
    server_name www.lsgood.top lsgood.top;
    root /root/Work/web/;
    index index.html;
    }

web 目录下是popcirle 的文件夹游戏
web/popcircle/index.html
所以最终游戏目录为:http://lsgood.top/popcircle/index.html

egret 打包小游戏的坑

  1. 打包显示index.html “data-scale-mode” 的模式”showAll” 错误,改成”fixedWidth”
  2. 做小游戏,申请wxAppid,在微信选择面板一定要选择游戏,不然会出现提示”app.json”找不到,因为此时换成了”game.json”
  3. VM4477:1 gameThirdScriptError ReferenceError: Boom is not defined
    出现的问题是:egret - scripts - wxgame - wxgame.ts 里面”async onFile(file: plugins.File) {“ 方法最后一句
    1
    2
    3
    4
    if (filename == 'main.js') {
    content += ";window.Main = Main;";
    }
    file.contents = new Buffer(content);

改成:

1
2
3
4
5
6
7
8
if (filename == 'main.js') {
content += ";window.Main = Main;";
["Circle", "GameData",
"GameOverLayer", "GameScene", "Kill"].forEach(v => {
content += `window.${v}=${v};`
});
}
file.contents = new Buffer(content);

添加的为你要加入的新的类名。空的不要添加!

  1. 玩的时候闪屏:index.html 的”data-frame-rate” 改为60桢(之前的是30)
  2. 调用第三方库,小程序找不到,比如particle
    解决方法:在egret - scripts - wxgame - wxgame.ts 里面”async onFile(file: plugins.File) {“ 方法
    对应增加一句,如:
    1
    2
    3
    if (filename == "libs/modules/particle/particle.js" || filename == "libs/modules/particle/particle.min.js") {
    content += ";window.particle = particle;";
    }

表示链接新的库

  1. egret 粒子系统内存问题
    https://xmanyou.com/egretde-li-zi-xi-tong-nei-cun-xie-lou/
    参考的这篇。先删掉再说,嘿嘿。
    在要离开页面的地方:this.particleSys.close(true);
  2. openDataContext 是公共域,开放权限的地方。其他都为主域。
    公共域只允许进数据。platform.js 通过
    1
    2
    const openDataContext = wx.getOpenDataContext();
    openDataContext.postMessage(data);

把data 传进去,然后openDataContext.index.js 接受:

1
2
3
4
5
6
function addOpenDataContextListener () {
wx.onMessage((data) => {
if (data.command == 'open') {}
else if (data.command == 'loadRes') {}
})
}

然后里面去拿数据、展示页面等。
openDataContext 只有postMessage、onMessage、shareCanvas 三个可以和外部交互的功能。
所以另起一个Promise function 走不通;
往postMessage 传入callback 也是不行的:postMessage 只接受基础变量,其他的会被过滤。

这时 wx.getFriendCloudStorage 这个方法只允许在公共域处理拿数据、处理数据、展示数据!
同时记住:get 回来的数据最后一层是string 哟。

wx.setUserCloudStorage 可以在各个地方获取。
我直接写在platform.js 下另起一个

1
2
3
4
5
6
7
8
9
10
11
12
13
setWxStorage(dataStr) {
return new Promise((resolve, reject) => {
wx.setUserCloudStorage({
KVDataList: [{ key: "score", value: dataStr }],
success: res => {
resolve(res);
},
fail: res => {
reject(res);
}
})
});
}

注意,value 一定要是str就可以了。

  1. 头像没有显示出来。不知道为啥。当你选择下一页的时候居然又出来了。先这样吧。
  2. 自己最高分方案是使用本地缓存,然后判别是否有更高分进行setUserCloudStorage。
  3. 由于openDataContext权限问题,那么好友分数排序就只能从getFriendCloudStorage 数据之后进行json 对象化,转换数据格式、然后排序。
    排序使用js 的Array.prototype.sort((n1, n2) => {}) 高阶函数排序。
  4. 当前判别是否是wxgame 还是h5,使用platform.openDataContext == null。

记录微信小游戏打包过程。

个人微信账号,只需填写两个资料:1游戏自审自查报告;2计算机软件著作权登记证书。
游戏自审自查这里采用一个jpg,申明微信小游戏在一开始添加了“健康安全提示语”,且截图小游戏加载页面;其他包括授权、公司名称等;同时还有公司的对此发行软件责任等。
计算机著作权登记证书 是去软件著作权中心申请(plz,去那边申请太慢。如果小游戏还比较小,可以先网上找个著作权ps 凑和,不然要等很久)。

公司账号需要填写4个资料等,很麻烦。这个资料没找齐,没搞。

游戏创作完成后,直接点击顶部的上传,即可上传测试文件。在微信公众号:https://mp.weixin.qq.com 登录之后 - 开发管理 - 开发版本 里面会有最新的开发包。在下拉选项卡中“发布测试” 可以发布一个包含填写的测试人员们内部测试的包。如果点击“提交审核”则直接发布release。接下来就是填写信息然后发布啦。
流量主,这个功能有个门槛,需要用户达到1000个以上才可以申请。

看raywenderlich 网站文章英语对高考英语失利有感

高考一直有个遗憾,前三科手感超出我的预期。英语是最后一科,而我也是班里英语前三,第一位置偶尔也能轮换位置的人,在最后却发挥失常。
有几个原因,其中一个与今天“有感” 有关联。

  1. 前三科太轻松,超过了我的预期,特别是我最不熟练的数学、理综。
    心存侥幸(我的运气一直是爆表的,感觉和住在庵堂旁边有关系),心里稍稍在高考第二天下午放松。
  2. 那天中午也由于太高兴,自己内心有估算的,于是玩起2011年火热的iPod 街霸游戏。
    我确实还是没有长大啊,内心的开心,总得释放,不能与他人语(成绩还要1个月后出来,要低调),那就释放玩游戏;心想“下午正是我最拿手的英语,简单”。
  3. 我一直贯彻“李阳英语”理念,一直拼命的读,没事看看文章。特点是平时的交流都能顺利,我觉得基本能和外国人日常交流。
    虽然脑袋中午放松,成绩也不能低到哪里去,所以出弱势问题,可能:
    贯彻的“李阳英语”理念也有一个弊端,那就是对高考学术型的英语不一样。
    高考学术型,听力比模拟考时正式,听得时候平常心里是不翻译,而是直接内心模拟出场景,高考时,心里紧张(外加中午没休息好),硬是内心一句一句翻译却跟不上读速了;
    笔试部分也由于听力失利(自己感受的出来,蒙的比例比以前多多了),感觉有一点点困顿,不太在状态;心里有点后悔中午没休息好;
    总的来说,有得有失,到现在内心也已翻不出大波浪,时过境迁。要是我更多分,我还会想现在这样么?或许会有那么点不一样吧,也许吧。

掌握知识点的表现

当你能描述出那个知识点,同时将他比喻出来。比如面向过程和面向对象,你就可以这样比喻:同样是煮一杯咖啡,面向过程是讲步骤过程化,每个步骤要干什么,满足什么条件,于是就出来了什么咖啡;面向对象的不同点是,关注的是拆解元素,比如承装的被子,煮咖啡机器,水元素,model 这一很重要的概念。
所以我也能大致确认,大部分的知识点,可以使用我们日常一些元素,环境描述,那么你就真正得到了该知识。

微信分享时,背景声音在回来后没有再播放

找到wxgame 全局搜索var innerAudioContext = wx.createInnerAudioContext();
找到了weapp-adapter.js 下856行,
然后下面添加这两句即可:

1
2
3
4
5
6
wx.onShow(function () {
innerAudioContext.play();
});
wx.onAudioInterruptionEnd(function () {
innerAudioContext.play();
});

这几天终于把微信排行榜的问题搞好啦。非常给力。接下来就是微信分享,别人点击后得到相应礼品、物品值+ 三个可以和外部交互的功能。

这两天看OpenGL 遇到的等等数学知识思考大学为什么没学会,或者说没学 盘点下

遇到的有欧拉角 四元数、笛卡尔坐标、齐次方程组、万向节;
这么些需要建模,知道大概,然后将其映射到目前工业、图形学重要应用的知识,居然在大学只是书里画了个图,黑板上一直写,快考试的时候说会考,仅此而已?
为什么不是老师们代码建模,把形状形态,大致描绘出来?中间会出一些问题,带着问题思考,生动形象点?难道还如授课的教授们当年学习般,只有靠“拼命学”才能“突出重围”么?
教授年纪都比较大,但是前缘的技术也是需要接触的。让更生动的计算机科学和数学结合,让更多人参与到知识的海洋中,而不是一些死记硬背,目的只是“拼命学”“突出重围”的一小部分人得到知识的一小部分;
大部分人都可以参与,可以互相讨论。更多人参与才能带动领域的增强,讨论才能出点子,才能出一些人想不到的思绪。
然而并没用。
如今离开大学,我又重新看这些晦涩难懂的知识。能稍稍理解,如果要进一步理解呢?那就是直接将他们画出来,运用起来。

小游戏登录解密

首先准备小游戏的appid 和appsecret。之后会用到
用户wx.login 的时候得到code;
用户wx.getUserInfo 的时候得到a = {encryptedData:xxx, iv:xxx, userInfo:xxx};
a 里面的userInfo 数据不完善,没有用户ID。其他更多信息。通过去微信服务器得到一个session_key可以解开。
在这个目录里面有该资料:
code 就是登陆时候返回的code。APPID 为小游戏APPID。SECRET 为小游戏的密钥。
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
会返回

1
2
3
4
5
//正常返回的JSON数据包
{
"openid": "OPENID",
"session_key": "SESSIONKEY",
}

然后通过hmac_sha256解密得到数据信息

1
signature = hmac_sha256( post_data, session_key )