专业编程基础技术教程

网站首页 > 基础教程 正文

菜鸟|Egret微信小游戏好友排行榜教程

ccvgpt 2024-10-16 08:25:35 基础教程 6 ℃

写在前面:随着越来越多的新人开始接触白鹭引擎,创作属于自己的游戏。考虑到初学者会遇到一些实际操作问题,我们近期整理推出“菜鸟”系列技术文档,以便更好的让这些开发者们快速上手,Egret大神们可以自动忽略此类内容。

今天我们分享的菜鸟文档将介绍微信小游戏好友排行榜的制作过程,包括创建项目并发布、微信开发者平台添加小游戏、打开开放域功能、主域和开放域通讯,以及ShareCanvas与原生Canvas的布局。

菜鸟|Egret微信小游戏好友排行榜教程

图片来源于微信跳一跳排行榜

微信好友排行榜利用微信关系链数据实现一个简单的排行榜,此文档包含关系链数据、Egret平台数据接口、ShareCanvas离屏画布、原生Canvas布局。

创建项目并发布

创建Egret项目,使用Launcher发布,建议使用您个人AppID(测试用的id限制很多功能,例如分享)

添加小游戏

设置 > 基本设置 > 添加小程序(能够通过审核即可)

打开开放域功能

使用微信开发者工具打开发布的微信小游戏,或在终端运行 egret run--target wxgame ,找到游戏配置文件 game.json,配置如下,其中 openDataContext使小游戏支持了微信开放域功能。

  1. {
  2. "deviceOrientation"
  3. :
  4. "portrait"
  5. ,
  6. "networkTimeout"
  7. :
  8. {
  9. "request"
  10. :
  11. 5000
  12. ,
  13. "connectSocket"
  14. :
  15. 5000
  16. ,
  17. "uploadFile"
  18. :
  19. 5000
  20. ,
  21. "downloadFile"
  22. :
  23. 5000
  24. },
  25. "openDataContext"
  26. :
  27. "openDataContext"
  28. }

ShareCanvas介绍

开放数据域的绘制文件中已经拥有一个通过Canvas API绘制的排行榜 ,SharedCanvas 是主域和开放数据域都可以访问的一个离屏画布,原理如下所示。

index.js文件中,官方已经为我们绘制了一个简单的排行榜demo,渲染出的效果如下图所示:

主域和开放域通讯

开放域已经为我们绘制好了虚拟排行榜,现在只需要让主域打开开放域的排行榜就可以展示在Canvas上了。

首先,创建开放数据域显示对象,离屏画布的显示对象可直接在主域中通过以下的方式进行创建,创建的显示对象为 egre.Bitmap 类型,可直接添加到舞台上。

  1. //在主域中创建开放数据域显示对象
  2. var
  3. platform
  4. =
  5. window
  6. .
  7. platform
  8. ;
  9. this
  10. .
  11. bitmap
  12. =
  13. platform
  14. .
  15. openDataContext
  16. .
  17. createDisplayObject
  18. (
  19. null
  20. ,
  21. this
  22. .
  23. stage
  24. .
  25. stageWidth
  26. ,
  27. this
  28. .
  29. stage
  30. .
  31. stageHeight
  32. );

其次,通过主域与开放数据域的单向数据接口进行通讯,主域可向开放数据域单方向发送消息。

  1. //主域向子域发送数据
  2. plathform
  3. .
  4. openDataContext
  5. .
  6. postMessage
  7. ({
  8. isRanking
  9. :
  10. this
  11. .
  12. isRankClick
  13. ,
  14. text
  15. :
  16. "egret"
  17. ,
  18. year
  19. :
  20. (
  21. new
  22. Date
  23. ()).
  24. getFullYear
  25. (),
  26. command
  27. :
  28. "open"
  29. });

子域可通过监听事件的方式获取到主域发送过来的自定义信息。

  1. //子域接收信息
  2. wx
  3. .
  4. onMessage
  5. ((
  6. data
  7. )
  8. =>
  9. {
  10. if
  11. (
  12. data
  13. .
  14. command
  15. ==
  16. 'open'
  17. )
  18. {
  19. //显示开放域
  20. if
  21. (!
  22. hasCreateScene
  23. )
  24. {
  25. //创建并初始化
  26. hasCreateScene
  27. =
  28. createScene
  29. ();
  30. ...
  31. }
  32. }

最后,开发者便可以在主域中发送数据,请求开放域打开排行榜,子域接收到数据打开排行榜。

扩展

您可以通过修改 index.js文件内的参数改变排行榜样式达到目标效果,可以使用自己的图片放到对应的路径中(总文件大小不要超过4M)。布局建议不要使用固定数字的数值,而是以 stageWidth stageHeight 舞台宽高作为基数,以尽量减少不同手机出现的适配问题。

  1. /**
  2. * 资源加载组,将所需资源地址以及引用名进行注册
  3. * 之后可通过assets引用名方式进行获取
  4. */
  5. var
  6. assets
  7. =
  8. {
  9. icon
  10. :
  11. "openDataContext/assets/icon.png"
  12. ,
  13. box
  14. :
  15. "openDataContext/assets/signIn.png"
  16. ,
  17. panel
  18. :
  19. "openDataContext/assets/bg.png"
  20. ,
  21. button
  22. :
  23. "openDataContext/assets/OK_button.png"
  24. ,
  25. title
  26. :
  27. "openDataContext/assets/rankingtitle.png"
  28. };

排行榜展示

注意:安卓偶尔有不显示数据的BUG,在index.js中给字体加一个颜色即可。

  1. //设置字体
  2. context
  3. .
  4. font
  5. =
  6. fontSize
  7. +
  8. "px Arial"
  9. ;
  10. context
  11. .
  12. fillStyle
  13. =
  14. "#fff"

小结

通过本文您可以对以下问题有更深入的了解

  • 对微信的关系链数据有更深入的理解
  • 平台数据接口的作用和使用
  • 熟悉主域与开放域数据通讯规则
  • 对原生Canvas的布局有所了解

本文关键代码参考

  1. private
  2. isRankClick
  3. :
  4. boolean
  5. =
  6. false
  7. ;
  8. private
  9. bitmap
  10. :
  11. egret
  12. .
  13. Bitmap
  14. ;
  15. /**
  16. * 排行榜遮罩,为了避免点击开放数据域影响到主域,在主域中建立一个遮罩层级来屏蔽点击事件.</br>
  17. * 根据自己的需求来设置遮罩的 alpha 值 0~1.</br>
  18. */
  19. private
  20. rankingListMask
  21. :
  22. egret
  23. .
  24. Shape
  25. ;
  26. //显示微信排行榜
  27. public
  28. obBtnRankingClick
  29. (
  30. e
  31. :
  32. egret
  33. .
  34. TouchEvent
  35. )
  36. {
  37. console
  38. .
  39. log
  40. (
  41. "点击排行榜"
  42. );
  43. let
  44. plathform
  45. :
  46. any
  47. =
  48. window
  49. .
  50. platform
  51. ;
  52. if
  53. (!
  54. this
  55. .
  56. isRankClick
  57. )
  58. {
  59. //处理遮罩,避免开放域数据影响主域
  60. this
  61. .
  62. rankingListMask
  63. =
  64. new
  65. egret
  66. .
  67. Shape
  68. ();
  69. this
  70. .
  71. rankingListMask
  72. .
  73. graphics
  74. .
  75. beginFill
  76. (
  77. 0x000000
  78. ,
  79. 1
  80. );
  81. this
  82. .
  83. rankingListMask
  84. .
  85. graphics
  86. .
  87. drawRect
  88. (
  89. 0
  90. ,
  91. 0
  92. ,
  93. this
  94. .
  95. stage
  96. .
  97. width
  98. ,
  99. this
  100. .
  101. stage
  102. .
  103. height
  104. );
  105. this
  106. .
  107. rankingListMask
  108. .
  109. graphics
  110. .
  111. endFill
  112. ();
  113. this
  114. .
  115. rankingListMask
  116. .
  117. alpha
  118. =
  119. 0.4
  120. ;
  121. //设置为true,以免触摸到下面的按钮
  122. this
  123. .
  124. rankingListMask
  125. .
  126. touchEnabled
  127. =
  128. true
  129. ;
  130. this
  131. .
  132. addChildAt
  133. (
  134. this
  135. .
  136. rankingListMask
  137. ,
  138. 999
  139. );
  140. //让排行榜按钮显示在容器内
  141. this
  142. .
  143. addChild
  144. (
  145. this
  146. .
  147. btn_ranking
  148. );
  149. //显示开放域数据
  150. this
  151. .
  152. bitmap
  153. =
  154. plathform
  155. .
  156. openDataContext
  157. .
  158. createDisplayObject
  159. (
  160. null
  161. ,
  162. this
  163. .
  164. stage
  165. .
  166. stageWidth
  167. ,
  168. this
  169. .
  170. stage
  171. .
  172. stageHeight
  173. );
  174. this
  175. .
  176. addChild
  177. (
  178. this
  179. .
  180. bitmap
  181. );
  182. //主域向子域发送数据
  183. plathform
  184. .
  185. openDataContext
  186. .
  187. postMessage
  188. ({
  189. isRanking
  190. :
  191. this
  192. .
  193. isRankClick
  194. ,
  195. text
  196. :
  197. "egret"
  198. ,
  199. year
  200. :
  201. (
  202. new
  203. Date
  204. ()).
  205. getFullYear
  206. (),
  207. command
  208. :
  209. "open"
  210. });
  211. this
  212. .
  213. isRankClick
  214. =
  215. true
  216. ;
  217. }
  218. else
  219. {
  220. this
  221. .
  222. bitmap
  223. .
  224. parent
  225. &&
  226. this
  227. .
  228. bitmap
  229. .
  230. parent
  231. .
  232. removeChild
  233. (
  234. this
  235. .
  236. bitmap
  237. );
  238. this
  239. .
  240. rankingListMask
  241. .
  242. parent
  243. &&
  244. this
  245. .
  246. rankingListMask
  247. .
  248. parent
  249. .
  250. removeChild
  251. (
  252. this
  253. .
  254. rankingListMask
  255. );
  256. this
  257. .
  258. isRankClick
  259. =
  260. false
  261. ;
  262. plathform
  263. .
  264. openDataContext
  265. .
  266. postMessage
  267. ({
  268. isRanking
  269. :
  270. this
  271. .
  272. isRankClick
  273. ,
  274. text
  275. :
  276. "egret"
  277. ,
  278. year
  279. :
  280. (
  281. new
  282. Date
  283. ()).
  284. getFullYear
  285. (),
  286. command
  287. :
  288. "close"
  289. });
  290. }
  291. }

本文源码链接: https://github.com/shenysun/FriendsList

Tags:

最近发表
标签列表