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

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

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

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

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

(四)排行榜界面

排行榜榜单元素

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

 // define a user behaviour
var RankItem = qc.defineBehaviour('qc.JumpingBrick.RankItem', qc.Behaviour, function() {
// need this behaviour schedule in editor
//this.runInEditor = true;
}, {
positionImg : qc.Serializer.NODE,
positionText : qc.Serializer.NODE,
nameText : qc.Serializer.NODE,
score : qc.Serializer.NODE,
head : qc.Serializer.NODE,
headBack : qc.Serializer.NODE,
scoreBack : qc.Serializer.NODE
}); RankItem._position = [
'first.png',
'second.png',
'third.png'
]; RankItem._textTint = [
0xffb16742,
0xff2899a7,
0xffa5b471,
0xff876712
]; RankItem._headBack = [
'list_head_org.png',
'list_head_blu.png',
'list_head_green.png',
'list_head_yel.png'
]; RankItem._infoBack = [
'list_bak_org.png',
'list_bak_blu.png',
'list_bak_green.png',
'list_bak_yel.png'
]; // Awake is called when the script instance is being loaded.
RankItem.prototype.awake = function() { }; RankItem.prototype.revoke = function() {
var self = this;
if (self.headKey) {
// 清理资源
self.game.assets.unload(self.headKey);
self.headKey = null;
}
}; // Update is called every frame, if the behaviour is enabled.
RankItem.prototype.refreshData = function(index, data, cache) {
// 更新信息
var self = this;
self.headBack.frame = RankItem._headBack[index < 4 ? (index - 1) : 3];
self.scoreBack.frame = RankItem._infoBack[index < 4 ? (index - 1) : 3];
if (index < 4) {
self.positionImg.visible = true;
self.positionImg.frame = RankItem._position[index - 1];
self.positionText.visible = false;
self.nameText.stroke = new qc.Color(RankItem._textTint[index - 1]);
self.score.stroke = new qc.Color(RankItem._textTint[index - 1]);
}
else {
self.positionImg.visible = false;
self.positionText.visible = true;
self.positionText.text = index.toString();
self.nameText.stroke = new qc.Color(RankItem._textTint[3]);
self.score.stroke = new qc.Color(RankItem._textTint[3]);
} // 载入头像
// 获取64 * 64的头像尺寸
if (data.headurl) {
if (self.headKey) {
// 清理资源
self.game.assets.unload(self.headKey);
}
self.headKey = data.headurl;
self.game.assets.loadTexture(self.headKey, data.headurl + '64', function(assets) {
self.head.texture = assets;
if (cache) {
cache.dirty = true;
}
});
}
self.nameText.text = data.name;
self.score.text = data.score.toString();
};

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

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

排行榜界面

  • 管理脚本 使用ViewTable来管理榜单节点,需要提供TableViewAdapter来提供数据。创建一个Announcement.js,用来提供数据并管理界面。内容如下:
 /**
* 排行榜界面
*/
var Announcement = qc.defineBehaviour('qc.JumpingBrick.Announcement', com.qici.extraUI.TableViewAdapter, function() { }, {
closeButton: qc.Serializer.NODE,
showPanel : qc.Serializer.NODE,
myDesc : qc.Serializer.NODE,
myPosition : qc.Serializer.NODE,
myHeadPanel : qc.Serializer.NODE,
myHead : qc.Serializer.NODE,
myName : qc.Serializer.NODE,
myScore : qc.Serializer.NODE
}); Announcement.prototype.awake = function() {
var self = this,
data = JumpingBrick.data;
self.addListener(self.closeButton.onClick, self.returnToGameOver, self);
self.addListener(self.gameObject.onClick, self.returnToGameOver, self);
self.addListener(self.showPanel.onClick, function() {}, self);
self.addListener(data.onRankUpdate, self.receiveRankData, self);
}; /**
* 返回游戏结算界面
*/
Announcement.prototype.returnToGameOver = function() {
var self = this;
if (self.headKey) {
self.game.assets.unload(self.headKey);
}
JumpingBrick.uiManager.switchStateTo(qc.JumpingBrick.UIManager.GameOver);
}; // 请求排行榜数据
Announcement.prototype.updateRank = function() {
var data = JumpingBrick.data;
data.queryRank();
}; /**
* 收到排行榜数据
*/
Announcement.prototype.receiveRankData = function(data) {
var self = this;
// 更新自己的信息
var selfData = data.selfRank;
if (!selfData) {
self.myPosition.text = '请登录游戏后查看';
self.myHeadPanel.visible = false;
self.myName.visible = false;
self.myScore.visible = false;
self.myDesc.visible = false;
}
else {
self.myPosition.text = selfData.ranking ? selfData.ranking.toString() : '未上榜';
self.myHeadPanel.visible = true;
self.myDesc.visible = true; // 获取64 * 64的头像尺寸
if (selfData.headurl) {
if (self.headKey) {
self.game.assets.unload(self.headKey);
}
self.headKey = selfData.headurl;
self.game.assets.loadTexture(self.headKey, selfData.headurl + '64', function(assets) {
self.myHead.texture = assets;
});
}
self.myName.text = selfData.name;
self.myScore.text = selfData.scorers.toString();
} var rankTop = data.rankTop;
self.rankTop = rankTop; self.dispatchDataChange();
}; /**
* 获取表格大小,x、y同时只能有一个为Infinity
*/
Announcement.prototype.getTableSize = function() {
return { x: 1, y: this.rankTop ? this.rankTop.length : 0 };
}; /**
* 根据在Table中的点返回对应的单元格
* @param {number} x - x轴坐标
* @param {number} y - y轴坐标
*/
Announcement.prototype.findCellWithPos = function(x, y) {
return {
x: Math.floor(x / 540),
y: Math.floor(y / 90)
};
}; /**
* 获取节点的显示位置
*/
Announcement.prototype.getCellRect = function(col, row) {
return new qc.Rectangle(col * 540, row * 90, 540, 90);
}; /**
* 节点处于不可见时,回收节点,
* @param {qc.Node} cell - 节点
* @param {number} col - 所在列
* @param {number} row - 所在行
*/
Announcement.prototype.revokeCell = function(cell, col, row) {
cell.getScript('qc.JumpingBrick.RankItem').revoke();
}; /**
* 节点处于可见时,创建节点,
* @param {qc.Node} cell - 节点
* @param {number} col - 所在列
* @param {number} row - 所在行
*/
Announcement.prototype.createCell = function(cell, col, row) {
if (this.rankTop) {
cell.getScript('qc.JumpingBrick.RankItem').refreshData(row + 1, this.rankTop[row]);
}
};
  • 排行榜根节点 排行榜界面是一个固定大小的窗口,如果还是按游戏的方式以高度为准,可能在有些设备上就会超出屏幕区域。 所以,为了排行榜,需要再建立一个UIRoot,命名为announcement,Manual Type类型为Expand,建议的宽高还是设计使用的(640, 960)。 如图所示:

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

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

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

五)界面管理

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

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

结束语

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

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

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

其他相关链接

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

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

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

 
 

青瓷引擎之纯JavaScript打造HTML5游戏第二弹——《跳跃的方块》Part 10(排行榜界面&界面管理)的更多相关文章

  1. JAVASCRIPT开发HTML5游戏--斗地主(网络对战PART4)

    继之前用游戏引擎(青瓷引擎)做了斗地主单机版游戏之后,这里分享下使用socket.io来实现网络对战,代码可已放到github上,在此谈谈自己整个的开发思路吧. 客户端代码 服务端代码 (点击图片进入 ...

  2. javascript开发HTML5游戏--斗地主(单机模式part3)

    最近学习使用了一款HTML5游戏引擎(青瓷引擎),并用它尝试做了一个斗地主的游戏,简单实现了单机对战和网络对战,代码可已放到github上,在此谈谈自己如何通过引擎来开发这款游戏的. 客户端代码 服务 ...

  3. javascript开发HTML5游戏--斗地主(单机模式part2)

    最近学习使用了一款HTML5游戏引擎(青瓷引擎),并用它尝试做了一个斗地主的游戏,简单实现了单机对战和网络对战,代码可已放到github上,在此谈谈自己如何通过引擎来开发这款游戏的. 客户端代码 服务 ...

  4. 纯JavaScript实现HTML5 Canvas六种特效滤镜

    纯JavaScript实现HTML5 Canvas六种特效滤镜  小试牛刀,实现了六款简单常见HTML5 Canvas特效滤镜,并且封装成一个纯 JavaScript可调用的API文件gloomyfi ...

  5. 关于『HTML5』:第二弹

    关于『HTML5』:第二弹 建议缩放90%食用 咕咕咕咕咕咕咕!!1 (蒟蒻大鸽子终于更新啦) 自开学以来,经过了「一脸蒙圈的 半期考试」.「二脸蒙圈的 体测」的双重洗礼,我终于有空肝 HTML5 辣 ...

  6. javascript开发HTML5游戏--斗地主(单机模式part1)

      最近学习使用了一款HTML5游戏引擎(青瓷引擎),并用它尝试做了一个斗地主的游戏,简单实现了单机对战和网络对战,代码可已放到github上,在此谈谈自己如何通过引擎来开发这款游戏的. 客户端代码 ...

  7. 通通制作Html5小游戏——第二弹(仿flappy bird像素鸟)

    亲爱的博友们,我又回来啦~因为我们技术宅的思想只有技术宅懂得,好不容易写了点好玩的东西发QQ空间,结果只有11的UV,0回复....10分钟ps一个女神的素描效果发QQ空间朋友圈,一大堆回复加赞,作为 ...

  8. HTML5游戏开发引擎,初识CreateJS

    CreateJS为CreateJS库,可以说是一款为HTML5游戏开发的引擎.打造 HTML5 游戏,构建新游戏,提供构建最新 HTML5 的技术.你可以通过这个网站学习如何构建跨平台和跨终端游戏.这 ...

  9. HTML5游戏引擎深度测评

    https://zhuanlan.zhihu.com/p/20768495 最近看到网上一篇文章,标题叫做<2016年 最火的 15 款 HTML5 游戏引擎>.目前针对HTML5游戏的解 ...

随机推荐

  1. PL/SQL远程备份和恢复Oracle数据库

    (转自:http://blog.csdn.net/huchunfu/article/details/25165901) 在客户端远程备份的文件保存在数据库所在主机上,不会直接拷贝到客户端.—————— ...

  2. Spring中@Autowired注解、@Resource注解的区别

    Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resour ...

  3. 点击jqGrid表格,弹出需要的表格的数据

    首先,我们先定义一个函数,然后在JQuery里面直接引用就可以了, function GetJqGridRowValue(jgrid, code) { var KeyValue = "&qu ...

  4. 如何在开机时让Tomcat以进程的方式启动

    一. 安装tomcat服务 1. 打开cmd命令窗口,进入到"tomcat安装路径/bin"目录下,运行"service.bat install"命令,安装to ...

  5. Android设置AlertDialog点击按钮对话框不关闭(转)

    (转自:http://blog.csdn.net/winson_jason/article/details/8485524) 当我们在用到Android alertDialog创建对话框 的时候,我们 ...

  6. android:context,getApplicationContext()生命周期

    getApplicationContext() 返回应用的上下文,生命周期是整个应用,应用摧毁它才摧毁Activity.this的context 返回当前activity的上下文,属于activity ...

  7. [转]C#网络编程(异步传输字符串) - Part.3

    本文转自:http://www.tracefact.net/CSharp-Programming/Network-Programming-Part3.aspx 这篇文章我们将前进一大步,使用异步的方式 ...

  8. 2016-2017 CT S03E07: Codeforces Trainings Season 3 Episode 7 - HackerEarth Problems Compilation

    B: 思路: 暴力,每两个判断一下; C: 思路: 容斥定理,先枚举脖子下面那个点和那个不可描述的点,算出所有的方案数,这里面有多的腿当成了脖子或者胳膊的,然后就再枚举这种情况把这些减去,又减多了; ...

  9. 《Python核心编程》部分代码习题实践(持续更新)

    第三章 3-10 交换异常处理方式 代码: #makeTextFile.py #!/usr/bin/env python 'makeTextFile.py' import os ls = os.lin ...

  10. 第五章项目:QuickHit

    需求概述: 根据输入速率和正确率将玩家分为不同级别,级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高.如果玩家在规定时间内完成规定次数的输入,正确率达到规定要求,则玩家升级(为了简单起见, ...