【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2315|回复: 1

游戏是这样写成的 (第二篇: 混合 C/C++/Obj-C 的应用)

[复制链接]
发表于 2009-6-11 20:19:09 | 显示全部楼层 |阅读模式
<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>&nbsp;</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>&nbsp;</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">&nbsp; &nbsp; </div>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <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">&nbsp; &nbsp; 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">&nbsp; &nbsp; </div>
<li class="li1">
<div class="de1">&nbsp; &nbsp; 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">&nbsp; &nbsp; &nbsp; &nbsp; </div>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">[</span>tex <span class="kw1">release</span><span class="br0">]</span>;</div>
<li class="li1">
<div class="de1">&nbsp;</div>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> sprite;</div>
<li class="li1">
<div class="de1"><span class="br0">}</span></div></li></ol></div>
<div>&nbsp;</div>
<div>
<div>这里有一点注意的是,Texture2D 被释放时会同时 texture 释放掉,我们要把有关代码拿走:</div>
<div>&nbsp;</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, &amp;_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>&nbsp;</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,? ? ? &nbsp;_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,? ? ? &nbsp;<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>&nbsp;</div>
<div><img height="742" alt="" src="http://www.cocoachina.com/wp-content/uploads/igame-screen.png" width="386"/></div>
<div>&nbsp;</div>
<div>下篇再会!</div></div></div></div></div>
发表于 2012-10-1 19:18:22 | 显示全部楼层
      感情不就是一场暧昧、提起裤腰带谁还认识谁  男人,看哪个哪个女的漂亮了,就来句:我喜欢你,就爱人家了.丫的一副猥琐像腰板一挺就去追了,人家女女说有男朋友了再者不甩你了.你丫的不照脸的就开骂:你烧什么烧,长这熊样你还以为你西施杨贵妃啊,大爷我给你说话算看得起你了!
奶奶的,你说话前也不掂量掂量自己那茄样!你配的上人家吗?你牛B,你以为萨达姆是你哥人人都想和你有一腿! 文章来自99减肥网www.99jfss.com

    再者些男人,爱了、追了,然后就睡了、上了。下了床,某一天理所当然地给人家女的弄句‘分手吧,我累了。跟你合不来或(她)比你更好,咱俩不合适……
  男的、你贱不!?追人家的时候你爱的死去活来、甜言蜜语一堆一堆,三分钟一想你、五分钟一爱你。等人家跟了你,你一句分手吧甩给人家,你什么意思?你以为人人都是干**的!你也配是男人、妈的,丢你祖宗十八代的脸!
  你说你凭什么玩人家??人家给你谈容易吗?人家给爹娘吵架、给家里人闹,再者牙一咬爹娘不要了、心甘情愿的一根筋跟你走!
   男人、你还有啥不满意的!?要说缺点,你TMD就十全十美吗?人家没把你想成李嘉诚,你也别期望她变成范冰冰林志玲
男人,你跟人家睡了觉、上了床,你什么感觉?爽了吧!舒服了吧!?接下来呢?没新鲜感了,散了吧。没人的时候你也拍拍心口问问自己,你还是人吗?还有点人的良知吗?世界都让你们污染了!
  玩什么别玩女人!对不起什么,别对不起自己的良心!
  人家女人一次一次地给你流产,她痛、她难受,她在你面前说什么了吗!? 没shang床前,一个个斯文好男人样,上了床一个个败类禽兽!人渣! ‘我爱你’、我呸!逗小孩,玩过家家啊!
  有些女的她就傻就白痴、男人一句话她啥都心甘情愿做;一句句‘宝贝、亲爱的’丫的,你就晕的不知道那朝那了,就叫男人搂着睡了。 你真以为人家把你当姑奶奶伺候了,说白了,人家男人就想跟你S床!醒醒吧! 文章来自99减肥网www.99jfss.com












不管年纪,漂亮是必须的。减肥也没有藉口,你能把自己吃肥就一定能瘦下来。30多岁的女性应该比20岁女生更有智慧,你应该知道这个社会对女性多挑剔。必须瘦,不要想太多。想减肥请来99减肥网www.99jfss.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-5-6 19:51

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表