iPhone開發 - 3D - 建立3D界面(上)
蘋果公司于07年釋出的iPhone是手機業一大革命性的手機終端,iPhone作業系統是:Mac OS X,固件更新由去年釋出1.0到現在的2.0固件.iPhone螢幕大小3.5英寸,分辨率為:320x480,觸摸屏,完全用手指就可以完成所有的操作,更為我們驚喜的是條支援OpenGL_Es1.4版本,有着620MHz的ARM處理器,能夠非常流暢的運作我們制作的3D精美遊戲.
我也是剛學,把自己學的分享下,難免有些錯誤,希望大家一起指正,下面我介紹下用iPhoneSDK開發3D遊戲最基本的事情 - 建立3D視窗界面
有關iPhone的開發環境我這裡忽略了,需要的可以到網上查閱相關的文章,在這裡我使用的是iPhone官方SDK來開發(可以到Apple官方網站下載下傳免費iPhoneSDK),蘋果公司iPhoneSDK提供了一個模闆給我們迅速建立OpenGL_Es視窗界面的源碼,接下來就用它來解釋開發過程.
我們首先打開XCode,(剛開始使用iPhoneSDK,會提示是針對iPhone還是Mac,選擇iPhone即可),在上面的Xcode菜單下:"File/New Project.."來建立一個界面,截圖如下:

在iPhone OS面闆的"Application"下選擇"OpenGL ES Application",然後點選"Choose",它提示工程名稱和工程儲存的路徑,我們這裡的工程名字取為:"OpenGLEx",最後點選"OK",就可以看到iPhoneSDK,自動為我們生成的工程模闆檔案了,截圖如下:
二話不說,我們先不管裡面的檔案,立馬點選"Build and Go"圖示,看看在iPhone模拟器裡面運作的效果,看下面截圖:
呵呵,好看不,模拟器的iPhone和真機真像,很漂亮,而且比真機運作速度流暢,你可以通過菜單來90度旋轉iPhone模拟器,就和真的一樣噢.
接下來說說它的源碼構成:
如上圖所示,在OpenGLEx下面有5個檔案夾:Classes,Other Sources,Resources,Frameworks和Products,他們的作用分别是:程式執行源檔案包,工程其他源檔案包,資源檔案包,相關類庫包和産品檔案包.而其他的"Targets","Executables"...先不管.
1.首先看Frameworks,這是我們寫程式需要導入的類庫,就是iPhone公開的接口API,例如我們點選OpenGLES.framework,可以看到EAGL.h,EAGLDrawble.h,gl.h和glext.h等API頭檔案,單擊這些檔案可以看到這些檔案的詳細内容,可供我們查詢相關API.
2.再看Resources,有個MainWindow.xib和Info.plist,對于MainWindow.xib檔案它是Xcde的用另一個可視化編輯工具Interface Builder建立的,它的功能非常強大,可以添加和編輯UI控件到iPhone上,并且可以在代碼部分控制添加的控件和在沒有代碼的情況下在iPhone模拟器上預覽搭建好的界面.總之,它提供給我們在設計模式下搭建界面,并且做為1個資源檔案供我們在代碼部分調用.
而Info.plist,它标記了工程的是以資訊,例如軟體版本,公司名稱,圖示,國際化,和模拟器設定等.如截圖所示:
3.然後再看Other Sources,有個OpenGLEx_Prefix.pch檔案,它是用來預先配置工程運作環境,它的預設代碼為:
//
// Prefix header for all source files of the 'OpenGLEx' target in the 'OpenGLEx' project
//
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#endif
還有個main.m檔案,它是應用程式的入口程式檔案,另外還有一個稱為"Delegate"的主程式:OpenGLExAppDelegate,main.m代碼如下:
#import <UIKit/UIKit.h>
int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}
如果在Info.plist裡面Main nib file base name沒有寫将MainWindow,也就是沒将MainWindow.xib做為程式主架構的話,那"int retVal = UIApplicationMain(argc, argv, nil, nil);"需要修改為下面将要講的檔案的名稱:OpenGLExAppDelegate,即修改為:"int retVal = UIApplicationMain(argc, argv, nil, @"OpenGLExAppDelegate");",也就是程式将調用OpenGLExAppDelegate檔案繼續執行. 4.重要的來看Classes,它其實有兩個類,一個OpenGLExAppDelegate和EAGLView,他們的作用分别是:前一個是iPhone第3方本地程式控制檔案,另一個是我們建立的EAGL視圖,即OpenGL ES的3D界面類.下面分别介紹: 對于OpenGLExAppDelegate類它由OpenGLExAppDelegate.h頭檔案和OpenGLExAppDelegate.m執行檔案組成,源檔案如下:
// OpenGLExAppDelegate.h
#import <UIKit/UIKit.h>
@class EAGLView;
@interface OpenGLExAppDelegate : NSObject <UIApplicationDelegate> {
IBOutlet UIWindow *window;
IBOutlet EAGLView *glView;
}
@property (nonatomic, retain) UIWindow *window;
@property (nonatomic, retain) EAGLView *glView;
@end
// OpenGLExAppDelegate.m
#import "OpenGLExAppDelegate.h"
#import "EAGLView.h"
@implementation OpenGLExAppDelegate
@synthesize window;
@synthesize glView;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
glView.animationInterval = 1.0 / 60.0;
[glView startAnimation];
}
- (void)applicationWillResignActive:(UIApplication *)application {
glView.animationInterval = 1.0 / 5.0;
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
glView.animationInterval = 1.0 / 60.0;
}
- (void)dealloc {
[window release];
[glView release];
[super dealloc];
}
@end
上面在.m檔案裡面并沒有使用window和glView類對象,其實它是是通過使用Xib檔案初始化視窗window和将glView添加到了windwo上面,建立了基本的界面層次結構,省去了我們用代碼來初始化的程式設計工作,當然也可以自己來編寫代碼來初始化建立視窗系統,這樣更容易了解,以後的例子可能都是用代碼來初始化. 另外1個,EAGLView類,暫時不介紹,留到下節. 5.最後看Products,iPhoneSDK允許我們設定打包生成多個不同類型的産品,iPhoneOS系統中可執行檔案是一個帶有字尾為app的檔案夾,例如:OpenGLEx.app,我們可以打開檔案檢視裡面的程式和資源檔案等.設定的方法是通過菜單Project/set Active Target,Project/set Active SDK,Project/set Active Build Configure等來設定打包的産品的屬性.常見的屬性例如:開發環境(真機/模拟器),編譯(調試/釋出)等. 上半部分就介紹到這,這部分主要介紹了iPhoneSDK的相關編寫流程和建構,下面部分将主要講EAGLView類(它是OpenGLES的界面),怎樣建立高效的OpenGLES界面.有什麼錯誤,望看到文章的同行們海涵~*_*~