具有多年游戏开发经验的dr_watson在Cocoachina发表了他的开发自己的iPhone/iPod Touch游戏全记录。Cocoachina第一时间奉献给广大读者,希望大家喜欢。本文较长,请进入阅读,相信一定会对你有很大帮助。
刚买了iPod Touch, 准备写点小游戏, 因为一直是在 Windows 上搞开发, 对怎样开发 iPhone/iPod Touch 程序一无所知, 所以可说是从零开始(也不是零… 我有n年的编程经验)! 想借这个贴把我的学习过程记录下来, 希望对其他有兴趣搞开发的新人, 也会有点帮助!
3月10日:
终于拿到了我的iPod Touch 了, 二话不说, 先把它 "jailbreak" 了, 因为听说 8GB 的, 比较容易 jailbreak, 所以我买的是 8GB 的, 还回来是 1.1.3, 马上升上 1.1.4, 然后用 ZiPhone直接 jailbreak, 一切顺利, 几分钟就搞好了!
然后马上在 iPod Touch 安装 BSD Subsystem 和 OpenSSH, 在Windows 上 安装 WinSCP, 方便以后放东西到 iPod Touch上!
3月11日:
有了"jailbreak" 的iPod Touch, 接着要做的, 当然是安装开发环境! google 了一会, 找到这个网页:
跟着一步步做, 终于把 toolchain 安好, 马上下载 HelloWorld 来试试, 竟然出奇的顺利, 一下子就可以build!
接着才发现问题, 不知道怎么把 build 好的程序放上 iPod Touch! 只好又 google, 经过一番转折, 才知道要在 iPod Touch 内的 Applications 里, 要建立一个叫 helloWorld.app 的目录, 然后把刚编译好的档案 helloWorld 和一个叫 Info.plist 的档案, 抄到里面 (我是用 WinSCP). Info.plist 可以从其它的app 里抄来用, 但要改一下以下的两个地方:
这个是编译好的执行档的名字.
一个"独一无二"的字符串, 可以是任何东西, 一般大家习惯了把自己的域名反转来写, 再加上程序的名字.
接着就是要把 helloWorld.app 整个目录和里面的内容的属性, 设为 0755!
这时用"SysInfo" 来 "Respring"一下, 就看到 helloWorld 了!
看着简简单单的"Hello World!"几个字显示在 iPod Touch 的屏幕上, 心里竟然是无比的兴奋!
3月12日:
比较令人泄气的是iPhone SDK 的开发语言竟然是 Objective C, 习惯用c/c++, 看着iPhone 的示范代码, 有点丈八金刚摸不着头脑, 还好, 后来看到weiphone 论坛里的讨论, 原来是可以混合c/c++/objC 的代码的.
附件 teapot.rar, 就是一个混合了 objC 和 C++ 代码的demo, 原代码是由这里找来的OpenGL ES 示范:
程序有一个比较大的问题, 就是不是"全屏幕", 在屏幕上方的状态bar 会闪, 在关闭时, 也会闪, 不知有没有朋友知道怎样解决这个问题?
3月15日:
终于知道怎么把屏幕上方的status bar 弄掉, 只要在 applicationDidFinishLaunching 的开始部份, 加上下面的 setStatusBarMode 代码即可:
- (void) applicationDidFinishLaunching: (id) unused
{
[UIHardware _setStatusBarHeight:0.0f];
[self setStatusBarMode:2 orientation:0 duration:0.0f fenceID:0];
简单画图示范
虽然只是打算写2D游戏, 但也计划着用OpenGL ES 来写, 因为我想把我在 PSP 上的弄过的2D游戏引擎JGE++搬到 iPhone 上, 但花了几天, 也没找到好的 OpenGL ES 框架, 考虑了一下, 我想还是由基本的开始吧, 先利用iPhone 系统提供的图形功能来写个简单的游戏, 顺便可以熟悉一下 iPhone 系统.
把 HelloWorld 的代码整理了一下, 准备搭建自己的游戏框架, 先试试画个背景和画一个角色在画面上吧!
根据找到的参考, 最简单的"画图"方法, 是利用 UIImageView. 基本上我们可以把 UIImageView 当成一个平时游戏里会用到的 Sprite class 来用! 可以设定它的位置, 甚至做出动画效果.
附件是代码和仿真画面.
Transition 测试
在玩一些 iPhone/iPod Touch 游戏时, 按游戏开始或由一个画面转到另一个画面, 会有一个很cool 的转移画面, 一直在想是怎么做的呢? 后来才知道, 是用了 LKAnimation.
刚找到参考, 马上试试用.
附件是代码包和app, 测试时, 只要用手指点一下屏幕, 就会出现一种效果, 一共有19种效果之多呢!
看看LKAnimation 的设定:
LKAnimation *animation = [LKTransition animation];
[animation setType: effects[mCurr]];
[animation setSubtype: subtype[rand()%4]];
[animation setTimingFunction: [LKTimingFunction functionWithName: @"easeInEaseOut"]];
[animation setFillMode: @"extended"];
[animation setTransitionFlags: 3];
[animation setSpeed: 0.20];
[[self _layer] addAnimation: animation forKey: 0];
其中 [animation setType: effects[mCurr]] 的参数是一个字符串, 字符串可以是下列的其中一个:
- pageCurl: 旧版面像一页书那样被揭开, 显示下面的新版面.
- pageUnCurl: 新版面像一页书被翻过来覆盖旧版面.
- suckEffect: 旧版面在屏幕下方中间位置被吸走, 显示出下面的新版面.
- spewEffect: 新版面在屏幕下方中间位置被释放出来覆盖旧版面.
- genieEffect: 旧版面在屏幕左下方或右下方被吸走, 显示出下面的新版面 (阿拉丁灯神?).
- unGenieEffect: 新版面在屏幕左下方或右下方被释放出来覆盖旧版面.
- twist: 版面以水平方向像龙卷风式转出来.
- tubey: 版面垂直附有弹性的转出来.
- swirl: 旧版面360度旋转并淡出, 显示出新版面.
- rippleEffect: 新版面以水波方式显示出来.
- cameraIris: 旧版面被镜头快门关走, 镜头快门然后开出新版面.
- cameraIrisHollow: 同上, 但旧版面在镜头快门没关时就消失了.
- cameraIrisHollowOpen: 镜头快门一开始已关上, 快门打开显示新版面.
- cameraIrisHollowClose: 镜头快门关上而并不打开.
- charminUltra: 旧版面淡出并显示新版面.
- zoomyIn: 新版面由小放大走到前面, 旧版面放大由前面消失.
- zoomyOut: 新版面屏幕外面缩放出现, 旧版面缩小消失.
- oglApplicationSuspend: 像按"home" 按钮的效果.
- oglFlip: 新版面转出来.
setSpeed 的参数, 可以由 0.0 (不动) 到大约 5.0 (马上出现), 数值越小越慢.
LKTimingFunction 的参数也是一个字符串, 可以是以下三个之一:
- easeInEaseOut: 前段和后段动画各占一半时间.
- easeIn: 后段动画较快.
- easeOut: 前段动画较快.
UIImageView画图测试
利用 UIImageView 可以拿来很方便的画图, 但不知道它的速度如何呢? 这个demo, 就一次把50多个 UIImageView 放到画面上, 看看它的表现如何, 做了这个测试, 让我觉得一般的小游戏, 用 UIImageView 当作sprite 来用一点问题都没有!
我们还可以利用 LKTransform 把 UIImageView 任意的旋转, 也可以通过改变 frame.size.width 和 frame.size.height 来作放大缩小! 实在是太方便了!
基本上现在可以开始写游戏了, 要好好想想到底要写什么!
(这个demo, 大家可以用手指"移动"画面上的小飞船, 另外在build 时会有些warnings, 是正常的)
一个很无聊的小游戏: 动画测试
在游戏里, 一般的角色都得有动画才行, 我们怎样用 iphone 提供的功能做动画效果呢? 答案就是: UIClippedImageView!
假 设我们的动画有4格, 而我们把4格动画都放在一个png 里 (像附件那个外星飞船小图), 那我们可以把图放进一个 UIClippedImageView 里, 再把它的 frame 定为动画格的大小, 然后通过改变图在 UIClippedImageView 里的位置 (setImageOrigin), 显示不同的动画格, 因而做出动画效果.
这个例子是可以玩的, 虽然有点无聊, 但也可以当为在下第一个为 iPhone/iTouch 写的小游戏. 玩法主要是用手指把画面上的飞碟点爆, 飞碟的速度会一直增加到某个程度, 然后还原.
例子里, 我写了一个 JSprite 的class, 方便以后使用.
一些参考数据
最近一直在研究怎样在 itouch 上用 OpenGL ES, 花了不少时间, 所以没时间更新这里了, 正好收到两个朋友的pm, 我想我把响应放在这里比较好, 这样大家都可以一起分享.
问:…我是一个做硬件的,对这些知道的不多,现在有兴趣给iPhone/iTouch写点什么,但不知道如何入手,能不能提供点入门的资料?
答:我想第一步要做的, 就是用 toolchain 安装 iphone 的 SDK, 方法本论坛已有不少贴子说过. 当然你也可以选择用 apple 的官方 iphone SDK, 但你要有新的 2.0 (1.2) firmware 才可以放上机试, 所以暂时我觉得还是用 toolchain 的比较好.
至于入门数据, 只能在网上慢慢找了, 下面有些连接, 你可以看看:
http://mauvilasoftware.com/iphone_software_development/
入门介绍(在网页最下面).
http://idevdocs.com/index.php
有简单的教程和例子, 还有一个论坛.
一些例子的代码.
国外的iphone 开发论坛.
http://phonedev.tumblr.com/
一些挺有用的数据.
这里有数十个例子的代码, 但你要有 svn 才可以下. 有的例子可能不可以build, 但看看代码总是有用的
最后当然不能少了 iphone 界神人 Jonathan Zdziarski 的网站:
他经常有更新, 告诉大家toolchain SDK 和官方 SDK 的最新发展, 现在他已经可以用官方 SDK 编译 toolchain 的代码, 或用 toolchain 编译出 2.0 firmware 的程序! 太牛了! 更牛的是前几天他竟然受邀在一个apple 官方的开发者聚会上, 大讲怎么破解iphone 和用 toolchain SDK 做开发! apple 竟然这么大方!
问:… Phone应该可以捕获甩动phone的event。像iPhysics里的Shake to show menu,或是Sketches里的Shake to erase。一直很好奇interface是什么?在UIResponder和NSResponder里都没有看到相关的api。不知道你是否了解?
答:你说的应该是 Accelerometer 的应用, 这里有一篇数据, 有详细的介绍:
简单来说, 你要在你由 UIApplication derived 出来的 class, 加上
(void)acceleratedInX:(float)xx Y:(float)yy Z:(float)zz