热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

青瓷引擎之纯JavaScript打造HTML5游戏第二弹——《跳跃的方块》Part10(排行榜界面&界面管理)...

继上一次介绍了《神奇的六边形》的完整游戏开发流程后(可点击这里查看),这次将为大家介绍另外一款魔性游戏《跳跃的方块》的完整开发流程。

青瓷引擎之纯Javascript打造HTML5游戏第二弹——《跳跃的方块》Part 10(排行榜界面&界面管理)...

          (点击图片可进入游戏体验)

因内容太多,为方便大家阅读,所以分多次来讲解。

若要一次性查看所有文档,也可点击这里

 

接上回(《跳跃的方块》Part 9

 

(四)排行榜界面

排行榜榜单元素

排行榜的榜单也是一个TableView,所以我们先建立一个榜单元素的控制脚本:RankItem.js。

 1 // define a user behaviour
 2 var RankItem = qc.defineBehaviour('qc.JumpingBrick.RankItem', qc.Behaviour, function() {
 3     // need this behaviour schedule in editor
 4     //this.runInEditor = true;
 5 }, {
 6     positionImg : qc.Serializer.NODE,
 7     positionText : qc.Serializer.NODE,
 8     nameText : qc.Serializer.NODE,
 9     score : qc.Serializer.NODE,
10     head : qc.Serializer.NODE,
11     headBack : qc.Serializer.NODE,
12     scoreBack : qc.Serializer.NODE
13 });
14 
15 RankItem._position = [
16     'first.png',
17     'second.png',
18     'third.png'
19 ];
20 
21 RankItem._textTint = [
22     0xffb16742,
23     0xff2899a7,
24     0xffa5b471,
25     0xff876712
26 ];
27 
28 RankItem._headBack = [
29     'list_head_org.png',
30     'list_head_blu.png',
31     'list_head_green.png',
32     'list_head_yel.png'
33 ];
34 
35 RankItem._infoBack = [
36     'list_bak_org.png',
37     'list_bak_blu.png',
38     'list_bak_green.png',
39     'list_bak_yel.png'
40 ];
41 
42 // Awake is called when the script instance is being loaded.
43 RankItem.prototype.awake = function() {
44 
45 };
46 
47 RankItem.prototype.revoke = function() {
48     var self = this;
49     if (self.headKey) {
50         // 清理资源
51         self.game.assets.unload(self.headKey);
52         self.headKey = null;
53     }
54 };
55 
56 // Update is called every frame, if the behaviour is enabled.
57 RankItem.prototype.refreshData = function(index, data, cache) {
58     // 更新信息
59     var self = this;
60     self.headBack.frame = RankItem._headBack[index <4 ? (index - 1) : 3];
61     self.scoreBack.frame = RankItem._infoBack[index <4 ? (index - 1) : 3];
62     if (index <4) {
63         self.positionImg.visible = true;
64         self.positionImg.frame = RankItem._position[index - 1];
65         self.positionText.visible = false;
66         self.nameText.stroke = new qc.Color(RankItem._textTint[index - 1]);
67         self.score.stroke = new qc.Color(RankItem._textTint[index - 1]);
68     }
69     else {
70         self.positionImg.visible = false;
71         self.positionText.visible = true;
72         self.positionText.text = index.toString();
73         self.nameText.stroke = new qc.Color(RankItem._textTint[3]);
74         self.score.stroke = new qc.Color(RankItem._textTint[3]);
75     }
76 
77     // 载入头像
78     // 获取64 * 64的头像尺寸
79     if (data.headurl) {
80         if (self.headKey) {
81             // 清理资源
82             self.game.assets.unload(self.headKey);
83         }
84         self.headKey = data.headurl;
85         self.game.assets.loadTexture(self.headKey, data.headurl + '64', function(assets) {
86             self.head.texture = assets;
87             if (cache) {
88                 cache.dirty = true;
89             }
90         });        
91     }
92     self.nameText.text = data.name;
93     self.score.text = data.score.toString();
94 };

 

创建榜单预制:sort_score.bin。并和脚本进行关联:

青瓷引擎之纯Javascript打造HTML5游戏第二弹——《跳跃的方块》Part 10(排行榜界面&界面管理)... 

 

 其中mask使用Pixel模式,使用自己的本身图片的透明通道作为子节点的透明通道,设置如下:

 青瓷引擎之纯Javascript打造HTML5游戏第二弹——《跳跃的方块》Part 10(排行榜界面&界面管理)...

排行榜界面

  • 管理脚本 使用ViewTable来管理榜单节点,需要提供TableViewAdapter来提供数据。创建一个Announcement.js,用来提供数据并管理界面。内容如下:
  1 /**
  2  * 排行榜界面
  3  */
  4 var Announcement = qc.defineBehaviour('qc.JumpingBrick.Announcement', com.qici.extraUI.TableViewAdapter, function() {
  5 
  6 }, {
  7     closeButton: qc.Serializer.NODE,
  8     showPanel : qc.Serializer.NODE,
  9     myDesc : qc.Serializer.NODE,
 10     myPosition : qc.Serializer.NODE,
 11     myHeadPanel : qc.Serializer.NODE,
 12     myHead : qc.Serializer.NODE,
 13     myName : qc.Serializer.NODE,
 14     myScore : qc.Serializer.NODE
 15 });
 16 
 17 Announcement.prototype.awake = function() {
 18     var self = this,
 19         data = JumpingBrick.data;
 20     self.addListener(self.closeButton.onClick, self.returnToGameOver, self);
 21     self.addListener(self.gameObject.onClick, self.returnToGameOver, self);
 22     self.addListener(self.showPanel.onClick, function() {}, self);
 23     self.addListener(data.onRankUpdate, self.receiveRankData, self);
 24 };
 25 
 26 /**
 27  * 返回游戏结算界面
 28  */
 29 Announcement.prototype.returnToGameOver = function() {
 30     var self = this;
 31     if (self.headKey) {
 32         self.game.assets.unload(self.headKey);
 33     }
 34     JumpingBrick.uiManager.switchStateTo(qc.JumpingBrick.UIManager.GameOver);
 35 };
 36 
 37 // 请求排行榜数据
 38 Announcement.prototype.updateRank = function() {
 39     var data = JumpingBrick.data;
 40     data.queryRank();
 41 };
 42 
 43 /**
 44  * 收到排行榜数据
 45  */
 46 Announcement.prototype.receiveRankData = function(data) {
 47     var self = this;
 48     // 更新自己的信息
 49     var selfData = data.selfRank;
 50     if (!selfData) {
 51         self.myPosition.text = '请登录游戏后查看';
 52         self.myHeadPanel.visible = false;
 53         self.myName.visible = false;
 54         self.myScore.visible = false;
 55         self.myDesc.visible = false;
 56     }
 57     else {
 58         self.myPosition.text = selfData.ranking ? selfData.ranking.toString() : '未上榜';
 59         self.myHeadPanel.visible = true;
 60         self.myDesc.visible = true;
 61 
 62         // 获取64 * 64的头像尺寸
 63         if (selfData.headurl) {
 64             if (self.headKey) {
 65                 self.game.assets.unload(self.headKey);
 66             }
 67             self.headKey = selfData.headurl;
 68             self.game.assets.loadTexture(self.headKey, selfData.headurl + '64', function(assets) {
 69                 self.myHead.texture = assets;
 70             });        
 71         }
 72         self.myName.text = selfData.name;
 73         self.myScore.text = selfData.scorers.toString();
 74     }
 75 
 76     var rankTop = data.rankTop;
 77     self.rankTop = rankTop;
 78 
 79     self.dispatchDataChange();
 80 };
 81 
 82 
 83 /**
 84  * 获取表格大小,x、y同时只能有一个为Infinity
 85  */
 86 Announcement.prototype.getTableSize = function() {
 87     return { x: 1, y: this.rankTop ? this.rankTop.length : 0 };
 88 };
 89 
 90 /**
 91  * 根据在Table中的点返回对应的单元格
 92  * @param  {number} x - x轴坐标
 93  * @param  {number} y - y轴坐标
 94  */
 95 Announcement.prototype.findCellWithPos = function(x, y) {
 96     return {
 97         x: Math.floor(x / 540),
 98         y: Math.floor(y / 90)
 99     };
100 };
101 
102 /**
103  * 获取节点的显示位置
104  */
105 Announcement.prototype.getCellRect = function(col, row) {
106     return new qc.Rectangle(col * 540, row * 90, 540, 90);
107 };
108 
109 /**
110  * 节点处于不可见时,回收节点,
111  * @param  {qc.Node} cell - 节点
112  * @param  {number} col - 所在列
113  * @param  {number} row - 所在行
114  */
115 Announcement.prototype.revokeCell = function(cell, col, row) {
116     cell.getScript('qc.JumpingBrick.RankItem').revoke();
117 };
118 
119 /**
120  * 节点处于可见时,创建节点,
121  * @param  {qc.Node} cell - 节点
122  * @param  {number} col - 所在列
123  * @param  {number} row - 所在行
124  */
125 Announcement.prototype.createCell = function(cell, col, row) {
126     if (this.rankTop) {
127         cell.getScript('qc.JumpingBrick.RankItem').refreshData(row + 1, this.rankTop[row]);
128     }
129 };

 

  • 排行榜根节点 排行榜界面是一个固定大小的窗口,如果还是按游戏的方式以高度为准,可能在有些设备上就会超出屏幕区域。 所以,为了排行榜,需要再建立一个UIRoot,命名为announcement,Manual Type类型为Expand,建议的宽高还是设计使用的(640, 960)。 如图所示:

青瓷引擎之纯Javascript打造HTML5游戏第二弹——《跳跃的方块》Part 10(排行榜界面&界面管理)...

 

 为了适应屏幕旋转,还是需要为announcement节点添加一个锁屏的组件。如图所示:

青瓷引擎之纯Javascript打造HTML5游戏第二弹——《跳跃的方块》Part 10(排行榜界面&界面管理)...

 

  • 界面展示及脚本关联 在锁屏组件下开始拼界面,并将Announcement.js加到announcement节点上。如图所示: 

 青瓷引擎之纯Javascript打造HTML5游戏第二弹——《跳跃的方块》Part 10(排行榜界面&界面管理)...

其中tableView的脚本挂载scrollView节点上,配置如下:

青瓷引擎之纯Javascript打造HTML5游戏第二弹——《跳跃的方块》Part 10(排行榜界面&界面管理)... 

 

五)界面管理

基本界面都已经做好,将这些界面节点同UIManager关联起来,设置如图所示:

青瓷引擎之纯Javascript打造HTML5游戏第二弹——《跳跃的方块》Part 10(排行榜界面&界面管理)... 

 

这样界面部分也就都完成了。

 

结束语

到这里,所有的游戏功能开发已经全部完成了。总体的开发思路和时间安排是这样:

  1. 从设计方案出发,提炼配置。
  2. 优先完成主体玩法,尽早进行玩法迭代。
  3. 再逐步完善数据处理和界面逻辑。

 

感谢各位坚持看到最后,《跳跃的方块》到此就分享完了。若对工程示例或引擎的使用有任何问题,请一定告诉我们,我们会不断努力,继续完善。以后还将陆续分享其他好游戏的开发经验,望大家继续关注,谢谢!

 

其他相关链接

开源免费的HTML5游戏引擎——青瓷引擎(QICI Engine) 1.0正式版发布了!

JS开发HTML5游戏《神奇的六边形》(一)

青瓷引擎之纯Javascript打造HTML5游戏第二弹——《跳跃的方块》Part 1

 
 


推荐阅读
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 在编写业务代码时,常常会遇到复杂的业务逻辑导致代码冗长混乱的情况。为了解决这个问题,可以利用中间件模式来简化代码逻辑。中间件模式可以帮助我们更好地设计架构和代码,提高代码质量。本文介绍了中间件模式的基本概念和用法。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
author-avatar
msf6688
PHP小白,请大神 们多多关照!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有