注册 登录
主题 : 學習怎樣在 iPhone/iPod Touch 上開發自制遊戲全記錄
级别: 金牌会员

状态: 未签到 - [1天]
UID: 37
精华: 33
发帖: 3267
可可豆: 29878 CB
威望: 29874 点
在线时间: 2664(时)
注册时间: 2008-04-26
最后登录: 2016-10-19
楼主 : 发表于: 2008-05-04 19:03    发自: Web Page
来源于 综合讨论 分类

學習怎樣在 iPhone/iPod Touch 上開發自制遊戲全記錄   

管理提醒: 本帖被 lvyile 从 iPhone/iPod Touch开发一般讨论区 移动到本区(2009-08-23)
剛*****了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 了一會, 找到這個網頁:
http://wiki.iphonegameover.com/Windows_Cygwin_Binary_Toolchain_Installation

跟著一步步做, 終於把 toolchain 安好, 馬上下載 HelloWorld 來試試, 竟然出奇的順利, 一下子就可以build!

接著才發現問題, 不知道怎麼把 build 好的程序放上 iPod Touch! 只好又 google, 經過一番轉折, 才知道要在 iPod Touch 內的 Applications 里, 要建立一個叫 helloWorld.app 的目錄, 然後把剛編譯好的檔案 helloWorld 和一個叫 Info.plist 的檔案, 抄到里面 (我是用 WinSCP). Info.plist 可以從其他的app 里抄來用, 但要改一下以下的兩個地方:
引用

<key>CFBundleExecutable</key>
<string>helloWorld</string>

這個是編譯好的執行檔的名字.


引用

<key>CFBundleIdentifier</key>
<string>com.khors.helloWorld</string>

一個"獨一無二"的字串, 可以是任何東西, 一般大家習慣了把自己的域名反轉來寫, 再加上程序的名字.


接著就是要把 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 示範:
http://www.cs.cmu.edu/~ajw/public/iphone-gl/

程序有一個比較大的問題, 就是不是"全螢幕", 在螢幕上方的狀態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];



[ 此贴被dr_watson在2008-05-04 19:45重新编辑 ]

附件: Teapot.rar (68 K) 下载次数:833
We have the passion to make games!
http://www.epicforce.com
级别: 金牌会员

状态: 未签到 - [1天]
UID: 37
精华: 33
发帖: 3267
可可豆: 29878 CB
威望: 29874 点
在线时间: 2664(时)
注册时间: 2008-04-26
最后登录: 2016-10-19
沙发 : 发表于: 2008-05-04 19:11    发自: Web Page
簡單畫圖示範
雖然只是打算寫2D遊戲, 但也計畫著用OpenGL ES 來寫, 因為我想把我在 PSP 上的弄過的2D遊戲引擎JGE++搬到 iPhone 上, 但花了幾天, 也沒找到好的 OpenGL ES 框架, 考慮了一下, 我想還是由基本的開始吧, 先利用iPhone 系統提供的圖形功能來寫個簡單的遊戲, 順便可以熟悉一下 iPhone 系統.

把 HelloWorld 的代碼整理了一下, 準備搭建自己的遊戲框架, 先試試畫個背景和畫一個角色在畫面上吧!

根據找到的參考, 最簡單的"畫圖"方法, 是利用 UIImageView. 基本上我們可以把 UIImageView 當成一個平時遊戲里會用到的 Sprite class 來用! 可以設定它的位置, 甚至做出動畫效果.

附件是代碼和模擬畫面.
[ 此贴被dr_watson在2008-05-04 19:50重新编辑 ]

图片:screenshot.png
附件: iDemo(20080316).rar (33 K) 下载次数:1436
We have the passion to make games!
http://www.epicforce.com
级别: 金牌会员

状态: 未签到 - [1天]
UID: 37
精华: 33
发帖: 3267
可可豆: 29878 CB
威望: 29874 点
在线时间: 2664(时)
注册时间: 2008-04-26
最后登录: 2016-10-19
板凳 : 发表于: 2008-05-04 19:15    发自: Web Page
Transition 測試
在玩一些 iPhone/iPod Touch 遊戲時, 按遊戲開始或由一個畫面轉到另一個畫面, 會有一個很cool 的轉移畫面, 一直在想是怎麼做的呢? 後來才知道, 是用了 LKAnimation.

剛找到參考, 馬上試試用.

附件是代碼包和app, 測試時, 只要用手指點一下螢幕, 就會出現一種效果, 一共有19種效果之多呢!

看看LKAnimation 的設定:
复制代码
  1.     LKAnimation *animation = [LKTransition animation];
  2.     [animation setType: effects[mCurr]];
  3.     [animation setSubtype: subtype[rand()%4]];
  4.     [animation setTimingFunction: [LKTimingFunction functionWithName: @"easeInEaseOut"]];
  5.     [animation setFillMode: @"extended"];
  6.     [animation setTransitionFlags: 3];
  7.     [animation setSpeed: 0.20];
  8.     [[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: 前段動畫較快.
[ 此贴被dr_watson在2008-05-04 19:51重新编辑 ]

图片:Image2.png
附件: iDemo(Transition).rar (420 K) 下载次数:1169
We have the passion to make games!
http://www.epicforce.com
级别: 金牌会员

状态: 未签到 - [1天]
UID: 37
精华: 33
发帖: 3267
可可豆: 29878 CB
威望: 29874 点
在线时间: 2664(时)
注册时间: 2008-04-26
最后登录: 2016-10-19
3 楼:  发表于: 2008-05-04 19:18    发自: Web Page
UIImageView畫圖測試
UIImageView畫圖測試

利用 UIImageView 可以拿來很方便的畫圖, 但不知道它的速度如何呢? 這個demo, 就一次把50多個 UIImageView 放到畫面上, 看看它的表現如何, 做了這個測試, 讓我覺得一般的小遊戲, 用 UIImageView 當作sprite 來用一點問題都沒有!

我們還可以利用 LKTransform 把 UIImageView 任意的旋轉, 也可以通過改變 frame.size.width 和 frame.size.height 來作放大縮小! 實在是太方便了!

基本上現在可以開始寫遊戲了, 要好好想想到底要寫什麼!

(這個demo, 大家可以用手指"移動"畫面上的小飛船, 另外在build 時會有些warnings, 是正常的)
图片:foo_0.png
附件: iDemo(UIImageDemo).rar (131 K) 下载次数:927
We have the passion to make games!
http://www.epicforce.com
级别: 金牌会员

状态: 未签到 - [1天]
UID: 37
精华: 33
发帖: 3267
可可豆: 29878 CB
威望: 29874 点
在线时间: 2664(时)
注册时间: 2008-04-26
最后登录: 2016-10-19
4 楼:  发表于: 2008-05-04 19:28    发自: Web Page
一個很無聊的小遊戲: 動畫測試
一個很無聊的小遊戲: 動畫測試

在遊戲里, 一般的角色都得有動畫才行, 我們怎樣用 iphone 提供的功能做動畫效果呢? 答案就是: UIClippedImageView!

假設我們的動畫有4格, 而我們把4格動畫都放在一個png 里 (像附件那個外星飛船小圖), 那我們可以把圖放進一個 UIClippedImageView 里, 再把它的 frame 定為動畫格的大小, 然後通過改變圖在 UIClippedImageView 里的位置 (setImageOrigin), 顯示不同的動畫格, 因而做出動畫效果.

這個例子是可以玩的, 雖然有點無聊, 但也可以當為在下第一個為 iPhone/iTouch 寫的小遊戲. 玩法主要是用手指把畫面上的飛碟點爆, 飛碟的速度會一直增加到某個程度, 然後還原.

例子里, 我寫了一個 JSprite 的class, 方便以後使用.
[ 此贴被dr_watson在2008-05-04 19:53重新编辑 ]

图片:alien.png
图片:foo_0.png
附件: iDemo(Animation+Game).rar (225 K) 下载次数:1037
We have the passion to make games!
http://www.epicforce.com
级别: 金牌会员

状态: 未签到 - [1天]
UID: 37
精华: 33
发帖: 3267
可可豆: 29878 CB
威望: 29874 点
在线时间: 2664(时)
注册时间: 2008-04-26
最后登录: 2016-10-19
5 楼:  发表于: 2008-05-04 19:34    发自: Web Page
一些參考資料
最近一直在研究怎樣在 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
有簡單的教程和例子, 還有一個論壇.

http://e.kevb.net/files/iphone/
一些例子的代碼.

http://www.modmyifone.com/forums/
國外的iphone 開發論壇.

http://phonedev.tumblr.com/
一些挺有用的資料.

http://code.google.com/p/iappaday/
這里有數十個例子的代碼, 但你要有 svn 才可以下. 有的例子可能不可以build, 但看看代碼總是有用的 ;)

最後當然不能少了 iphone 界神人 Jonathan Zdziarski 的網站:

http://www.zdziarski.com/

他經常有更新, 告訴大家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 的應用, 這里有一篇資料, 有詳細的介紹:

http://www.tuaw.com/2007/09/10/iphone-coding-using-the-accelerometer/

簡單來說, 你要在你由 UIApplication derived 出來的 class, 加上

引用

(void)acceleratedInX:(float)xx Y:(float)yy Z:(float)zz


附件是一個實際的例子, 你可參考一下! 是從上面提到的 iappaday 下載的.
[ 此贴被dr_watson在2008-05-04 20:45重新编辑 ]

附件: Bonk.rar (524 K) 下载次数:336
We have the passion to make games!
http://www.epicforce.com
级别: 新手上路
UID: 44
精华: 0
发帖: 1
可可豆: 1 CB
威望: 1 点
在线时间: 0(时)
注册时间: 2008-05-05
最后登录: 2008-05-19
6 楼:  发表于: 2008-05-05 13:13    发自: Web Page
                                                             

支持支持支持支持支持支持一下.
级别: 论坛版主

状态: 未签到 - [3天]
UID: 2
精华: 9
发帖: 7688
可可豆: 73313 CB
威望: 73439 点
在线时间: 5514(时)
注册时间: 2008-03-29
最后登录: 2016-08-05
7 楼:  发表于: 2008-05-05 22:50    发自: Web Page
iappaday那些例子和lucas newman的那3个例子的确非常好。

这篇记录我个人觉得最好的地方是站在一个有丰富游戏开发经验,但是初入iPhone开发的角度。这个角度把握的特别到位,而且全篇都是非常有用的内容。

比较期待这篇经典教学的更新篇
In all thy ways acknowledge Him, and He shall direct thy paths.
级别: 金牌会员

状态: 未签到 - [1天]
UID: 37
精华: 33
发帖: 3267
可可豆: 29878 CB
威望: 29874 点
在线时间: 2664(时)
注册时间: 2008-04-26
最后登录: 2016-10-19
8 楼:  发表于: 2008-05-10 22:40    发自: Web Page
OpenGL ES Framework 和 C/C++/ObjC混合例子

最近比較忙,沒時間寫東西,先把代碼放上來給大家看看。

機子忽然壞了,接不上網,沒法在iphone測試,要是代碼有問題,請告訴我一下!
附件: GLFrameWork.rar (243 K) 下载次数:312
We have the passion to make games!
http://www.epicforce.com
级别: 新手上路
UID: 19
精华: 0
发帖: 11
可可豆: 38 CB
威望: 38 点
在线时间: 0(时)
注册时间: 2008-04-03
最后登录: 2009-06-08
9 楼:  发表于: 2008-05-11 11:06    发自: Web Page
dr_watson 的学习经历对我们后辈的学习非常有帮助, 先谢谢了.

我用的是 Leopard 10.5.2 + Xcode3.1 beta1~5, + 1.1.4 toolchain SDK + xcode 模板 .  对于lucas newman的那3个例子 无法编译通过, 比较郁闷. 这个环境的优点是,可以在xcode编写代码,然后直接在工程界面中发布到真机运行, 感觉调试起来比较方便(但是比较费电).
这段时间一直比较忙, 没有认真学习一下 watson 的例子, 稍后要好好看看. 争取也开发一个具有iphone特色的游戏.

继续学习, 共同建设iphone开发者家园.
描述
快速回复

关注本帖(如果有新回复会站内信通知您)

验证问题:
苹果公司现任CEO是谁?2字 正确答案:库克

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部