技术开发 频道

游戏是这样写成的(八)

  【IT168 技术文档】大家先看一下這個截圖, 有什麼特別的地方嗎? 答案...

  答案是: 沒有!

  表面上它的確跟最早幾篇教程的截圖沒什麼分別, 但看不到的地方: 程序底層, 郤有了非常大的改變!

  寫了幾篇基本的東西, 我想大家對於在 iPhone 上運用OpenGL ES 己有了一些認識, 現在也是時候來個小結了! 我把之前的東西整理了一下, 也把整個結構改變了, 為打造一個比較正規的2D 遊戲程序庫作好準備! 因為過於簡陋, 不敢叫它作引擎, 我就稱之為遊戲盒子吧!

  正式向大家介紹: CCGameBox 0.1a這是 CCGameBox 第一版, 現在只包括了圖形渲染部份.

  類的列表:

  - CCRenderBox : 包括所有和圖像方面有關的功能, 如截入貼圖, 畫圖等.

  - CCTexture: 貼圖類.

  - CCImage: 可以被渲染的基本圖像類.

  這是一個 OpenGL ES 庫, 所以一般都會用在用 Cocoa Touch 模块建出來的項目, 利用 CCGameBox 編程, 首先我們要引進 CCGameBox.h :

#import "CCGameBox.h"

  在初始化了OpenGL ES 之後, 我們要用 CCGameBoxInit() 來初始化一下我們的盒子:

  1. - (void)layoutSubviews
  2. {
  3.     [EAGLContext setCurrentContext:context];
  4.     [self destroyFramebuffer];
  5.     [self createFramebuffer];
  6.     
  7.     CCGameBoxInit();
  8.  
  9.     gameApp = new GameApp();
  10.     
  11.     [self drawView];
  12. }

  接著在render 循環里, 我們就可以很方便的以 CCGameBox  的 singleton 物件大展拳腳了!

  1. - (void)drawView
  2. {
  3.     
  4.     CFTimeInterval time = CFAbsoluteTimeGetCurrent();
  5.     float dt = time - mOldTime;
  6.     mOldTime = time;
  7.     
  8.     if (gameApp)
  9.         gameApp->Update(dt);
  10.         
  11.     [EAGLContext setCurrentContext:context];
  12.     
  13.     glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
  14.  
  15.     CCRenderBox *renderBox = CCRenderBox::GetInstance();
  16.     renderBox->RenderBegin();
  17.     
  18.     if (gameApp)
  19.         gameApp->Render();
  20.     
  21.     renderBox->RenderEnd();
  22.     
  23.     glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
  24.     [context presentRenderbuffer:GL_RENDERBUFFER_OES];
  25.     
  26.     [[NSRunLoop currentRunLoop] runUntilDate: [NSDate distantPast]];
  27. }

  最後在我們的程序結束時, 用  CCGameBoxDestroy() 移除 CCGameBox 

  1. - (void)dealloc
  2. {
  3.     
  4.     [self stopAnimation];
  5.     
  6.     if ([EAGLContext currentContext] == context)
  7.     {
  8.         [EAGLContext setCurrentContext:nil];
  9.     }
  10.     
  11.     delete gameApp;
  12.     
  13.     CCGameBoxDestroy();
  14.     
  15.     [context release];    
  16.     [super dealloc];
  17. }

  當然, 大家要是懶得理會這些亂七八糟的初始工作, 可以直接更改 GameApp.cpp 和 GameApp.h 來實現自己的東西, 比如寫個遊戲! (其實還要等一等, 還有不少功能沒加呢...)

  早期的CCSprite 沒有優化, 每渲染一次, 都會更換一次貼圖和調用一次 glDrawArrays, 要是有大量的 CCSprite 要渲染, 速度就會很慢! CCRenderBox 在這方面作出了優化, 貼圖只在有需要時才更換, 而另外也加了一個頂點緩存, 集合了一堆才一次性渲染至螢幕!

下载链接:

iDemo8:http://www.rayfile.com/files/fa80c8d7-3bec-11de-b337-0014221b798a/
iDemo8b:http://www.rayfile.com/files/04e929ee-3bed-11de-b956-0014221b798a/
iDemo8c:http://www.rayfile.com/files/14766e57-3bed-11de-b324-0014221b798a/
GameBoxDemo3:http://www.rayfile.com/files/70925991-3bed-11de-ac49-0014221b798a/
GameBoxDemo4:http://www.rayfile.com/files/78659c9c-3bed-11de-a2e7-0014221b798a/
Sidewalk_with_example:http://www.rayfile.com/files/9e6fa840-3bed-11de-aa7c-0014221b798a/
GameBoxDemo5:http://www.rayfile.com/files/82c91161-3bed-11de-9df3-0014221b798a/

0
相关文章