PetGenie
大概六、七年前当我还在学 Asphyre 的时候,有看过一个以之编写的类似对对碰的“宠物对对碰”小游戏,虽然很简单,但我当时还是小小的沉溺过数个小时。而不久前,在闲逛论坛时无意看到了个以 FireMonkey 为所谓框架编写的另一款对对碰小游戏 GemGenie(需翻墙查看),由于其以 Delphi 开发,抱着看看 Delphi 现阶段对移动游戏开发的支持程度如何了,我下了个安装包,在我的华为荣耀U9508上跑了下。
结果当然很失望,我很难比较流畅的游戏。这个 FireMonkey 出来已 5 年左右了,还是半个玩具。
我自然比较倾向这个游戏的作者水平不会差(到哪去),所以不流畅的原因我想不归结于 FireMonkey 都难,而这玩意确实也一直备受诟病。
当然,某司宣称过 FireMonkey 并非针对游戏开发而提供。
那就让还用某司开发工具的人用某司的玩具工具去开发应用 APP 吧。
大概七、八个月前,我在学 Unity3D 的时候想练练手,刚好那时候 Unity3D 已开始官方支持 2D 开发,所以那时我就用 Unity2D 重写了前文提及的“宠物对对碰”游戏。不过那时候我所学还非常浅,虽然确实重写出了这个游戏,但效果却很不尽如人意,如下:

像这样简单的游戏,如此多的 Draw Calls 显然是不可接受的(我应该正确使用 Sprite Packer 打包了图片资源)。
那时我是通过 OnGUI 及 Graphics.DrawTexture 等来实现绘制等相关的,此做法明显还比较原始:
void OnGUI() {
if(Event.current.type.Equals(EventType.Repaint)) {
// 绘制背景
DrawBkgrd();
// 绘制剩余时间条
DrawTimeBar();
// 绘制得分
DrawScore();
// 绘制所有头像
DrawSpriteTextures();
// 绘制游戏信息
DrawGameCopyright();
}
}
void DrawBkgrd() {
Graphics.DrawTexture(new Rect((Screen.width - cBkgrdW) / 2, (Screen.height - cBkgrdH) / 2, 386, 506),
bkgrdTexture, new Rect(0.0f, 0.0f, 1.0f, 1.0f), 0, 0, 0, 0, null);
}
void DrawTimeBar() {
Graphics.DrawTexture(new Rect(41 + (Screen.width - cBkgrdW) / 2, 25 + (Screen.height - cBkgrdH) / 2, time / cTimeMax * 300, 10),
timeTexture, new Rect(0.0f, 0.0f, time / cTimeMax, 1.0f), 0, 0, 0, 0, null);
}
这几天有些闲,我索性想重新实现下(绘制相关),于是开搞。
——游戏首先最好有个名字,既然有 GemGenie,那这个就叫 PetGenie(宠物精灵)吧!
在重新导入及打包资源、废了些脑力回看及修改之前的代码后,得到了看起来似乎比之前的版本要优化的结果了:

这个版本看起来在绘制上应该不会有压力了:)
导入手机,跑起来(如丝般顺滑),如下:




这个版本里,以如下逻辑替代了之前版本的绘制相关代码:
void Update () {
if (!isGameOver) {
if ((!isMoving) || (!isUpdating)) {
timeLeft -= Time.deltaTime;
}
if (timeLeft <= 0) {
isGameOver = true;
audioSrc.PlayOneShot(gameOverClip);
Application.LoadLevel("FailScene");
}
if (score >= cScoreMax) {
Application.LoadLevel("WinScene");
}
}
else {
if (audioSrc.isPlaying) {
audioSrc.Stop();
}
}
if (Input.GetKey(KeyCode.Escape)) {
isGameOver = true;
Application.Quit();
}
// 检测输入信息
DetectInput();
// 更新精灵宠物信息
UpdateGenies();
// 更新剩余时间条大小&位置
UpdateTimeBar();
// 更新得分
UpdateScore();
}
private void UpdateTimeBar() {
// 横向缩放
timeLeftTransform.localScale = new Vector3(timeLeft / cTimeMax, timeLeftTransform.localScale.y, timeLeftTransform.localScale.z);
// 改变 X 坐标(前一步的缩放是双方向内缩,所以这里要除以2)
timeLeftTransform.position = new Vector3(cTimeBarGapLeft + 5.12f * (timeLeftTransform.localScale.x - 1.0f) / 2, timeLeftTransform.position.y, timeLeftTransform.position.z);
}
而这些逻辑的实现似乎有好几种方法,为简单起见(毕竟只是业余弄弄),我选了其中最简单的:摆控件(反正控件又不多)。
这样的开发方式似乎也正是 Unity3D 的所长。
这是最终的工程及 APK 文件。代码比较凌乱,整个设计也有很多改进之处,此仅为练手而已。
注:
1)、我手边没有比较好看的美术资源,也不会 PS作图,所以游戏看起来比较挫:)
2)、这个网页是个很好的学习去处,包含 Uinty3D 及 Cocos 等相关资源(可能需要翻墙)。
PetGenie的更多相关文章
- FruitFrolic
这是一个连连看小游戏,以 Unity2D 开发.因用了数种水果图片来做头像,所以游戏取名 FruitFrolic.同样,它也只是我闲时的练手. 少时曾玩过掌上游戏机里的俄罗斯方块及打飞机,及手机上的推 ...
随机推荐
- VS2015编译Qt5.7.0生成支持XP的静态库(很不错)
一.编译工具 1.VS2015 编译Qt5.7.0的所需VS版本:Visual Studio 2013 (Update1)或Visual Studio 2015 (Update2).因为Update补 ...
- Android Studio踩坑记
1. 模拟器在管理器中可以运行,但是点击run时死活找不到: 在sdk的/platform-tools/目录下找到adb.exe工具 打开cmd,输入下面两条命令 adb kill- ...
- Java读写资源文件类Properties
Java中读写资源文件最重要的类是Properties 1) 资源文件要求如下: 1.properties文件是一个文本文件 2.properties文件的语法有两种,一种是注释,一种属性配置. 注 ...
- 无法安装MVC3,错误提示:安装KB2483190(vs10-kb2483190)出错
原文:无法安装MVC3,错误提示:安装KB2483190(vs10-kb2483190)出错 无法安装MVC3,错误提示:安装KB2483190(vs10-kb2483190)出错. 安装指导:&qu ...
- GIT 配置管理
git版本控制开发流程小结笔记(一) 收藏 何良瑞Nyanko君 ...
- 使用clearInterval清除计时循环时,最后一次循环还是会执行解决办法
原代码: var interv=setInterval(function(){ alert("setInterval执行"); },2000) clearInterval(inte ...
- ionic build android error when download gradle
这里我遇到一个问题,当用 ionic build android 的时候,无数次build,无数次失败的时候,我真想骂一句,NND的GNF,我又想起武大的臭鸡蛋,是的,该丢,发明这种东西的人,难道不 ...
- 微服务之Swagger
Swagger使用 1. Swagger UI 按以下步骤配置,项目启动后访问:http://localhost:8080/swagger-ui.html 1.1 添加依赖 <dependenc ...
- 基于jquery封装通用的控制显示隐藏的方法
应用场景 在项目中会存在大量这样的需求: 1.选择不同的radio单选框,页面上的部分内容随之显示隐藏 2.选择不同的option下拉框内容,页面上的部分内容随之显示隐藏 如果每次遇到这类需求都单独写 ...
- (转)HTTP 长连接和短连接
1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问 ...