|
<p>在第一篇我们弄好了一个 OpenGL ES 框架, 接下来我们可以再进一步为写游戏作准备了, 这时, 我们有一个问题要好好考虑一下: 到底我们想以 Obj-C 开发还是以 C/C++ 开发呢?</p>
<p>个人来说, 我还是比较偏向 C/C++, 一来比较熟, 二来要是借用别人游戏方面的代码, 也比较容易找到! 所以在本篇, 我会和大家介绍一下怎么混合 C/C++ 和 Obj-C, 并编写一个 C++ 的 sprite class, 方便以后在游戏里应用!</p>
<p><span id="more-200"></span></p>
<p>我们首先要做的第一件事, 是打开第一篇的示范工程,并把档案的点缀名由 .m 改为 .mm, 这样, 我们就可以在代码里, 随意引用 C++ 的 class了.</p>
<p>好了, 我们现在可以开始弄我们的 Sprite class 了, 让我们把它叫做 CCSprite 吧 (CC 就是代表cocoachina),class 的结构如下:</p>
<div class="geshi no="no" objc">
<ol>
<li class="li1">
<div class="de1"><span class="kw4">class</span> CCSprite</div>
<li class="li1">
<div class="de1"><span class="br0">{</span></div>
<li class="li1">
<div class="de1">public<span class="sy0">:</span></div>
<li class="li1">
<div class="de1">? ? CCSprite<span class="br0">(</span>GLuint texId, <span class="kw4">float</span> <span class="kw4">width</span>, <span class="kw4">float</span> <span class="kw4">height</span>, <span class="kw4">float</span> texWidth, <span class="kw4">float</span> texHeight<span class="br0">)</span>;</div>
<li class="li1">
<div class="de1">? ? ~CCSprite<span class="br0">(</span><span class="br0">)</span>;</div>
<li class="li1">
<div class="de1">? ? </div>
<li class="li1">
<div class="de1">? ? <span class="kw4">void</span> <span class="kw4">render</span><span class="br0">(</span><span class="kw4">float</span> x, <span class="kw4">float</span> <span class="kw4">y</span><span class="br0">)</span>;</div>
<li class="li1">
<div class="de1">? ? </div>
<li class="li1">
<div class="de1">private<span class="sy0">:</span></div>
<li class="li1">
<div class="de1">? ? GLuint mTextureId;</div>
<li class="li1">
<div class="de1">? ? <span class="kw4">float</span> mImageWidth;</div>
<li class="li1">
<div class="de1">? ? <span class="kw4">float</span> mImageHeight;</div>
<li class="li1">
<div class="de1">? ? <span class="kw4">float</span> mTextureWidth;</div>
<li class="li1">
<div class="de1">? ? <span class="kw4">float</span> mTextureHeight;</div>
<li class="li1">
<div class="de1">? ? </div>
<li class="li1">
<div class="de1"><span class="br0">}</span>;</div></li></ol></div>
<p> </p>
<p>加好了 CCSprite.h 和 CCSprite.cpp, 基本上, 我们可以抄袭 Texture2D, 把它的功能真接搬到 CCSprite! 至于 Texture2D 的加载贴图功能, 我可看不懂它里面那一大堆的代码, 也不知怎么搬到 C++, 我们直接用它好了! OpenGL ES 来说,我们只要拿到 texture id 就可以画图. 于是把试试把 Texture2D.h 放进 CCSprite.cpp:</p>
<div class="geshi no="no" objc">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include "Texture2D.h"</span></div></li></ol></div>
<div>
<div>编译一下,天!!! 1995 个错!有没有搞错!看来在 C++里引用 Obj-C的东西是有点问题,还好,反过来在 Obj-C 里引用 C++ 的东西,就没有问题! 所以我们先要弄一些封装的代码,让我们可以在 C++ 里间接的用 Obj-C 的东西. 于是我们有了 Wrapper.h 和 Wrapper.mm, 在 Wrapper.mm 里引用和生成 CCSprite 就可以了!</div>
<div> </div>
<div class="geshi no="no" objc">
<ol>
<li class="li1">
<div class="de1">CCSprite <span class="sy0">*</span>CCSpriteCreate<span class="br0">(</span><span class="kw4">const</span> <span class="kw4">char</span> <span class="sy0">*</span><span class="kw4">filename</span><span class="br0">)</span></div>
<li class="li1">
<div class="de1"><span class="br0">{</span></div>
<li class="li1">
<div class="de1"> </div>
<li class="li1">
<div class="de1"> <span class="kw4">NSString</span> <span class="sy0">*</span><span class="kw4">name</span> <span class="sy0">=</span> <span class="br0">[</span><span class="br0">[</span><span class="kw4">NSString</span> <span class="kw1">alloc</span><span class="br0">]</span> <span class="kw4">initWithUTF8String</span><span class="sy0">:</span> <span class="kw4">filename</span><span class="br0">]</span>;</div>
<li class="li1">
<div class="de1"> Texture2D <span class="sy0">*</span>tex <span class="sy0">=</span> <span class="br0">[</span><span class="br0">[</span>Texture2D <span class="kw1">alloc</span><span class="br0">]</span> initWithImagePath<span class="sy0">:</span><span class="kw4">name</span><span class="br0">]</span>;</div>
<li class="li1">
<div class="de1"> </div>
<li class="li1">
<div class="de1"> CCSprite <span class="sy0">*</span>sprite <span class="sy0">=</span> <span class="kw4">new</span> CCSprite<span class="br0">(</span><span class="br0">[</span>tex <span class="kw4">name</span><span class="br0">]</span>, tex.<span class="kw4">contentSize</span>.<span class="kw4">width</span>, tex.<span class="kw4">contentSize</span>.<span class="kw4">height</span>, tex.<span class="kw4">pixelsWide</span>, tex.<span class="kw4">pixelsHigh</span><span class="br0">)</span>;</div>
<li class="li1">
<div class="de1"> </div>
<li class="li1">
<div class="de1"> <span class="br0">[</span>tex <span class="kw1">release</span><span class="br0">]</span>;</div>
<li class="li1">
<div class="de1"> </div>
<li class="li1">
<div class="de1"> <span class="kw1">return</span> sprite;</div>
<li class="li1">
<div class="de1"><span class="br0">}</span></div></li></ol></div>
<div> </div>
<div>
<div>这里有一点注意的是,Texture2D 被释放时会同时 texture 释放掉,我们要把有关代码拿走:</div>
<div> </div>
<div class="geshi no="no" objc">
<ol>
<li class="li1">
<div class="de1"><span class="sy0">-</span> <span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span> <span class="kw4">dealloc</span></div>
<li class="li1">
<div class="de1"><span class="br0">{</span></div>
<li class="li1">
<div class="de1">? ? <span class="co1">//if(_name)</span></div>
<li class="li1">
<div class="de1">? ? <span class="co1">//glDeleteTextures(1, &_name);</span></div>
<li class="li1">
<div class="de1">? ? </div>
<li class="li1">
<div class="de1">? ? <span class="br0">[</span>super <span class="kw4">dealloc</span><span class="br0">]</span>;</div>
<li class="li1">
<div class="de1"><span class="br0">}</span></div></li></ol></div>
<div>
<div>接下来,我们就可以把画图部份, 抄到我们自己的class 里, 有了这些, 我们就弄好我们的CCSprite class 了:</div>
<div> </div>
<div class="geshi no="no" objc">
<ol>
<li class="li1">
<div class="de1"><span class="kw4">void</span> CCSprite<span class="sy0">::</span><span class="kw4">render</span><span class="br0">(</span><span class="kw4">float</span> x, <span class="kw4">float</span> <span class="kw4">y</span><span class="br0">)</span></div>
<li class="li1">
<div class="de1"><span class="br0">{</span></div>
<li class="li1">
<div class="de1">? ? GLfloat _maxS <span class="sy0">=</span> mImageWidth<span class="sy0">/</span>mTextureWidth;</div>
<li class="li1">
<div class="de1">? ? GLfloat _maxT <span class="sy0">=</span> mImageHeight<span class="sy0">/</span>mTextureHeight;</div>
<li class="li1">
<div class="de1">? ? </div>
<li class="li1">
<div class="de1">? ? GLfloat? ? coordinates<span class="br0">[</span><span class="br0">]</span> <span class="sy0">=</span> </div>
<li class="li1">
<div class="de1">? ? <span class="br0">{</span></div>
<li class="li1">
<div class="de1">? ? ? ? <span class="nu0">0</span>,? ? ? ? ? ? ? ? _maxT,</div>
<li class="li1">
<div class="de1">? ? ? ? _maxS,? ? ? _maxT,</div>
<li class="li1">
<div class="de1">? ? ? ? <span class="nu0">0</span>,? ? ? ? ? ? ? ? <span class="nu0">0</span>,</div>
<li class="li1">
<div class="de1">? ? ? ? _maxS,? ? ? <span class="nu0">0</span></div>
<li class="li1">
<div class="de1">? ? <span class="br0">}</span>;</div>
<li class="li1">
<div class="de1">? ? </div>
<li class="li1">
<div class="de1">? ? GLfloat? ? <span class="kw4">width</span> <span class="sy0">=</span> mImageWidth;</div>
<li class="li1">
<div class="de1">? ? GLfloat <span class="kw4">height</span> <span class="sy0">=</span> mImageHeight;</div>
<li class="li1">
<div class="de1">? ? </div>
<li class="li1">
<div class="de1">? ? GLfloat? ? vertices<span class="br0">[</span><span class="br0">]</span> <span class="sy0">=</span> </div>
<li class="li1">
<div class="de1">? ? <span class="br0">{</span></div>
<li class="li1">
<div class="de1">? ? ? ? <span class="sy0">-</span><span class="kw4">width</span> <span class="sy0">/</span> <span class="nu0">2</span> <span class="sy0">+</span> x,? ? ? ? <span class="sy0">-</span><span class="kw4">height</span> <span class="sy0">/</span> <span class="nu0">2</span> <span class="sy0">+</span> <span class="kw4">y</span>,? ? ? ? <span class="nu0">0</span>,</div>
<li class="li1">
<div class="de1">? ? ? ? <span class="kw4">width</span> <span class="sy0">/</span> <span class="nu0">2</span> <span class="sy0">+</span> x,? ? ? ? <span class="sy0">-</span><span class="kw4">height</span> <span class="sy0">/</span> <span class="nu0">2</span> <span class="sy0">+</span> <span class="kw4">y</span>,? ? ? ? <span class="nu0">0</span>,</div>
<li class="li1">
<div class="de1">? ? ? ? <span class="sy0">-</span><span class="kw4">width</span> <span class="sy0">/</span> <span class="nu0">2</span> <span class="sy0">+</span> x,? ? ? ? <span class="kw4">height</span> <span class="sy0">/</span> <span class="nu0">2</span> <span class="sy0">+</span> <span class="kw4">y</span>,? ? ? ? <span class="nu0">0</span>,</div>
<li class="li1">
<div class="de1">? ? ? ? <span class="kw4">width</span> <span class="sy0">/</span> <span class="nu0">2</span> <span class="sy0">+</span> x,? ? ? ? <span class="kw4">height</span> <span class="sy0">/</span> <span class="nu0">2</span> <span class="sy0">+</span> <span class="kw4">y</span>,? ? ? ? <span class="nu0">0</span></div>
<li class="li1">
<div class="de1">? ? <span class="br0">}</span>;</div>
<li class="li1">
<div class="de1">? ? </div>
<li class="li1">
<div class="de1">? ? glBindTexture<span class="br0">(</span>GL_TEXTURE_2D, mTextureId<span class="br0">)</span>;</div>
<li class="li1">
<div class="de1">? ? glVertexPointer<span class="br0">(</span><span class="nu0">3</span>, GL_FLOAT, <span class="nu0">0</span>, vertices<span class="br0">)</span>;</div>
<li class="li1">
<div class="de1">? ? glTexCoordPointer<span class="br0">(</span><span class="nu0">2</span>, GL_FLOAT, <span class="nu0">0</span>, coordinates<span class="br0">)</span>;</div>
<li class="li1">
<div class="de1">? ? glDrawArrays<span class="br0">(</span>GL_TRIANGLE_STRIP, <span class="nu0">0</span>, <span class="nu0">4</span><span class="br0">)</span>;</div>
<li class="li1">
<div class="de1"><span class="br0">}</span></div></li></ol></div>
<div>
<div>我们再改一下 EGALView 里截入贴图和画图的部份,哈,大功告成!</div>
<div> </div>
<div><img height="742" alt="" src="http://www.cocoachina.com/wp-content/uploads/igame-screen.png" width="386"/></div>
<div> </div>
<div>下篇再会!</div></div></div></div></div> |
|