摘要:前言微信小游戲開(kāi)放了好友關(guān)系鏈,使得小游戲的社交能力得到了加強(qiáng),有助于增加游戲的活躍度。先做一個(gè)統(tǒng)一的事件分發(fā)機(jī)制監(jiān)聽(tīng)微信的觸摸事件接口小結(jié)實(shí)際上是寫了一個(gè)微小的渲染引擎,便于擴(kuò)展,容易理解學(xué)習(xí)。
前言
???????微信小游戲開(kāi)放了好友關(guān)系鏈,使得小游戲的社交能力得到了加強(qiáng),有助于增加游戲的活躍度。出于安全限制,只能在開(kāi)放域使用關(guān)系鏈數(shù)據(jù),但是開(kāi)放域是獨(dú)立的工程,使得包體變大不小,所以筆者寫了一個(gè)簡(jiǎn)單的渲染核心,既保留API一致,占用空間也很少。
節(jié)點(diǎn)樹結(jié)構(gòu)???????先模擬一個(gè)簡(jiǎn)單的節(jié)點(diǎn)樹結(jié)構(gòu),以便使用父子這樣的結(jié)構(gòu)代碼,符合一般的引擎風(fēng)格。
function Node{ this.x = 0 this.y = 0 ... }
通用方法定義:
Node.prototype ={ setPosition(x, y) { this.x = x this.y = y this.isDirty = true }, _updateWorldMatrix(){ this.worldMatrix = this.parent ? matMul(this.localMatrix, this.parent.worldMatrix) : this.localMatrix } ... }渲染核心
function render(){ //重置轉(zhuǎn)換矩陣 context.setTransform(1, 0, 0, 1, 0, 0); //清空畫布 context.clearRect(0, 0, canvas.width, canvas.height); var draw = function (node, bUpdate) { var redraw = node.isDirty || bUpdate if (redraw) { //更新變動(dòng)部分的矩陣 node._updateWorldMatrix() } //Y軸 翻轉(zhuǎn),向下平移一個(gè)畫布高度 context.setTransform(1, 0, 0, -1, 0, canvas.height); if (node.type) { var t = node.worldMatrix context.transform(t[0], t[1], t[3], t[4], t[6], t[7]) context.scale(1, -1); } if (node.bClip) { context.save() //剪裁 ... } if (node.type == "sprite") { //精靈 ... } if (node.type == "label") { //文字 ... } node.children.forEach(v => draw(v, redraw)) if (node.bClip) { //剪裁區(qū)域繪制完,恢復(fù)畫布 context.restore(); } node.isDirty = false } draw(scene) }
以上是實(shí)際繪制的部分,比較多,所以只寫了大概的結(jié)構(gòu),詳細(xì)的請(qǐng)看源碼鏈接。
引擎2d渲染部分原理大概是這樣,看明白后,會(huì)對(duì)游戲引擎的核心部分有更加深入的理解。
由于需要制作排行榜,有些需要滾動(dòng)的,那么要監(jiān)聽(tīng)并分發(fā)觸摸事件,以響應(yīng)用戶行為。
先做一個(gè)統(tǒng)一的事件分發(fā)機(jī)制:
function handleEvent(name, event) { var pt = event.changedTouches[0] scene.forEach(child=>{ if (child.getBoundingBox().contains(pt)){ if (child.listener[name]) { child.listener[name](pt) } } } }
監(jiān)聽(tīng)微信的觸摸事件接口:
wx.onTouchStart(e => handleEvent("onTouchBegan", e)) wx.onTouchMove(e => handleEvent("onTouchMove", e)) wx.onTouchEnd(e => handleEvent("onTouchEnded", e)) wx.onTouchCancel(e => handleEvent("onTouchCancel", e))小結(jié)
???????實(shí)際上是寫了一個(gè)微小的渲染引擎,便于擴(kuò)展,容易理解學(xué)習(xí)。篇幅有限,不能展示所有的細(xì)節(jié)部分,有興趣的可以查看源碼渲染核心demo。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/106413.html
摘要:今天我們分享的菜鳥文檔將介紹微信小游戲好友排行榜的制作過(guò)程,包括創(chuàng)建項(xiàng)目并發(fā)布微信開(kāi)發(fā)者平臺(tái)添加小游戲打開(kāi)開(kāi)放域功能主域和開(kāi)放域通訊,以及與原生的布局。 寫在前面:隨著越來(lái)越多的新人開(kāi)始接觸白鷺引擎,創(chuàng)作屬于自己的游戲??紤]到初學(xué)者會(huì)遇到一些實(shí)際操作問(wèn)題,我們近期整理推出菜鳥系列技術(shù)文檔,以便更好的讓這些開(kāi)發(fā)者們快速上手,Egret大神們可以自動(dòng)忽略此類內(nèi)容。 今天我們分享的菜鳥文檔將...
摘要:概述要做這個(gè)好友排行榜必然要有好友的戰(zhàn)績(jī)比分然后再做排序最后將數(shù)據(jù)呈現(xiàn)在上可以分為下面幾個(gè)步驟保存每個(gè)用戶的分?jǐn)?shù)獲取好友列表并獲取好友的分?jǐn)?shù)渲染排行榜保存每個(gè)用戶的分?jǐn)?shù)保存每個(gè)用戶的分?jǐn)?shù)需要調(diào)用微信的云存儲(chǔ)將用戶的分?jǐn)?shù)持久化的存起來(lái)保存用戶 概述 ? 要做這個(gè)好友排行榜.必然要有好友的戰(zhàn)績(jī)比分,然后再做排序,最后將數(shù)據(jù)呈現(xiàn)在UI上 , 可以分為下面幾個(gè)步驟: 保存每個(gè)用戶的分?jǐn)?shù)...
閱讀 2764·2021-11-22 14:45
閱讀 913·2021-10-15 09:41
閱讀 1073·2021-09-27 13:35
閱讀 3696·2021-09-09 11:56
閱讀 2640·2019-08-30 13:03
閱讀 3203·2019-08-29 16:32
閱讀 3311·2019-08-26 13:49
閱讀 776·2019-08-26 10:35