遊戲是這樣寫成的 (第二篇: 混合 C/C++/Obj-C 的應用)

在第一篇我們弄好了一個 OpenGL ES 框架, 接下來我們可以再進一步為寫遊戲作準備了, 這時, 我們有一個問題要好好考慮一下: 到底我們想以 Obj-C 開發還是以 C/C++ 開發呢? 個人來說, 我還是比較偏向 C/C++, 一來比較熟, 二來要是借用別人遊戲方面的代碼, 也比較容易找到! 所以在本篇, 我會和大家介紹一下怎麼混合 C/C++ 和 Obj-C, 並編寫一個 C++ 的 sprite class, 方便以後在遊戲里應用!

我們首先要做的第一件事, 是打開第一篇的示範工程,並把檔案的點綴名由 .m 改為 .mm, 這樣, 我們就可以在代碼里, 隨意引用 C++ 的 class了.

好了, 我們現在可以開始弄我們的 Sprite class 了, 讓我們把它叫做 CCSprite 吧 (CC 就是代表cocoachina),class 的結構如下:

 

复制代码

  1. class CCSprite
  2. {
  3. public:
  4.     CCSprite(GLuint texId, float width, float height, float texWidth, float texHeight);
  5.     ~CCSprite();
  6.    
  7.     void render(float x, float y);
  8.    
  9. private:
  10.     GLuint mTextureId;
  11.     float mImageWidth;
  12.     float mImageHeight;
  13.     float mTextureWidth;
  14.     float mTextureHeight;
  15.    
  16. };

加好了 CCSprite.h 和 CCSprite.cpp, 基本上, 我們可以抄襲 Texture2D, 把它的功能真接搬到 CCSprite! 至於 Texture2D 的載入貼圖功能, 我可看不懂它里面那一大堆的代碼, 也不知怎麼搬到 C++, 我們直接用它好了! OpenGL ES 來說,我們只要拿到 texture id 就可以畫圖. 於是把試試把 Texture2D.h 放進  CCSprite.cpp:

 

复制代码

  1. #include "Texture2D.h"

編譯一下,天!!! 1995 個錯!有沒有搞錯!看來在 C++里引用 Obj-C的東西是有點問題,還好,反過來在 Obj-C 里引用 C++ 的東西,就沒有問題! 所以我們先要弄一些封裝的代碼,讓我們可以在 C++ 里間接的用 Obj-C 的東西. 於是我們有了 Wrapper.h 和 Wrapper.mm, 在 Wrapper.mm 里引用和生成 CCSprite 就可以了!

 

复制代码

  1. CCSprite *CCSpriteCreate(const char *filename)
  2. {
  3.    
  4.     NSString *name = [[NSString alloc] initWithUTF8String: filename];
  5.     Texture2D *tex = [[Texture2D alloc] initWithImagePath:name];
  6.    
  7.     CCSprite *sprite = new CCSprite([tex name], tex.contentSize.width, tex.contentSize.height, tex.pixelsWide, tex.pixelsHigh);
  8.        
  9.     [tex release];
  10.     return sprite;
  11. }

這里有一點注意的是,Texture2D 被釋放時會同時 texture 釋放掉,我們要把有關代碼拿走:

 

复制代码

  1. - (void) dealloc
  2. {
  3.     //if(_name)
  4.     //glDeleteTextures(1, &_name);
  5.    
  6.     [super dealloc];
  7. }

接下來,我們就可以把畫圖部份, 抄到我們自己的class 里, 有了這些, 我們就弄好我們的CCSprite class 了:

 

复制代码

  1. void CCSprite::render(float x, float y)
  2. {
  3.     GLfloat _maxS = mImageWidth/mTextureWidth;
  4.     GLfloat _maxT = mImageHeight/mTextureHeight;
  5.    
  6.     GLfloat    coordinates[] =
  7.     {
  8.         0,                _maxT,
  9.         _maxS,            _maxT,
  10.         0,                0,
  11.         _maxS,            0
  12.     };
  13.    
  14.     GLfloat    width = mImageWidth;
  15.     GLfloat height = mImageHeight;
  16.    
  17.     GLfloat    vertices[] =
  18.     {
  19.         -width / 2 + x,        -height / 2 + y,        0,
  20.         width / 2 + x,        -height / 2 + y,        0,
  21.         -width / 2 + x,        height / 2 + y,        0,
  22.         width / 2 + x,        height / 2 + y,        0
  23.     };
  24.    
  25.     glBindTexture(GL_TEXTURE_2D, mTextureId);
  26.     glVertexPointer(3, GL_FLOAT, 0, vertices);
  27.     glTexCoordPointer(2, GL_FLOAT, 0, coordinates);
  28.     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
  29. }

我們再改一下 EGALView 里截入貼圖和畫圖的部份,哈,大功告成!

遊戲是這樣寫成的 (第二篇: 混合 C/C++/Obj-C 的應用)

下篇再會!

原文链接: https://www.cnblogs.com/dongxiaoyu/archive/2012/02/03/2337100.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    遊戲是這樣寫成的 (第二篇: 混合 C/C++/Obj-C 的應用)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/40840

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 下午5:43
下一篇 2023年2月8日 下午5:44

相关推荐