ImageVerifierCode 换一换
格式:DOCX , 页数:99 ,大小:180.10KB ,
资源ID:8871077      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8871077.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(深入分析Cocos2dx 20中的纹理.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

深入分析Cocos2dx 20中的纹理.docx

1、深入分析Cocos2dx 20中的纹理 深入分析Cocos2d-x 2.0中的“纹理”另:本章所用Cocos2d-x版本为:cocos2d-2.0-x-2.0.2 Aug 30 2012http:/cn.cocos2d-x.org/download 大家好,最近工作实在是太忙了,公司项目这个月要进行对外测试,大伙都是忙的昏天黑地的,每天很少有时间写新博文,但每天看到博文的回复和排名,心中很是感谢,正是因为各位的支持才能让我保持旺盛的战斗力。当然,在此还要感谢一下亲爱的老婆大人对我的支持,小乖每天闹困时主动的哄小乖安睡,否则咱咋能有时间写这些文字,小乖一岁半了,长得非常可爱,虽然在京仍然漂着,仍

2、然买不起房,仍然只是一个程序员,但是我知道我已经得到了人生中最幸福的东西。 好了,感叹之后,今天我们来学习Cocos2d-x中的“纹理”。之前有几篇文章都是谈及图片方面的,也是我刻意的安排:(1)。如何利用Cocos2d-x开发一款游戏?(2)。游戏开发之图片元素。(3)。Cocos2d-x中图字原理之深入分析。(4)。红孩儿纹理打包器。(5)。CCImage深入分析。(6)。词典类CCDictionary深入分析。 在第一篇里我首先提到了“图元素的管理工具”。这是为什么呢?因为2D游戏画面是由图片构成的。了解好图片从美术绘制到加载到游戏以及使用和释放的整个过程是非常重要的,他关系着游戏的运行

3、效率,内存占用等重要关键问题。有一个好的方案指导工作流程对于项目的成功是一项重要的保证。所以,请各位好好管理你们的图片资源。在第2篇里对于图片拼合的用途和意义做了启蒙。第3篇里我们深入了解了写汉字时Cocos2d-x是怎么使用图片来进行绘制的,它里面CCTextureAtlas和CCSpriteBatchNode 两个类告诉我们图片拼合原理与实现。而第4篇介绍了我开发的一款图片拼合工具。随后我会更新为最新版提供给大家使用。新增了PLIST方式导出和自动进行边缘空白裁剪的功能,免费而更强大!欢迎大家到下载。而后面两篇,其实是为了引出今天的文章而做的铺垫。 本博为什么要花这么多时间在纹理上呢?因为

4、本博一次再一次的看到很多的Cocos2d开发者在说:“为什么我的游戏占内存这么大?”。“为什么我的游戏跑起来效率这么低?”。其实这里面最根本的问题是你思想上没有对资源进行优化的一种流程在里面。在进行游戏开发的过程中,你被美术牵着鼻子跑,你没有自然而然的想到该怎么进行图片的格式,尺寸,拼合,复用方式,以及绘制时的方式。这些因素对游戏产生的具体影响在你的脑子里还没有留下完整的概念。所以,我希望经过对于这些源码的分析,让大家去了解这些因素,从而学会思考如何优化自已的游戏。好了,大家先将今天关于纹理代码的分析博文学习完,下一篇我讲对于这些优化因素做一个具体的讲解。 当一张图片被加载到内存后,它是以纹理

5、的形式存在的。纹理是什么东西呢?纹理就是一块内存,这块内存中存放的是按照指定的像素格式填充的图片像素信息。它被最终作为三角面着色所依据的数据源。 我们来看一下cocos2d-x中的libcocos2d库,其下有许多目录,找到textures展开,可以看到有CCTexture2D,CCTextureAtlas,CCTextureCache,CCTexturePVR四个类。这四个类的功能分别是:CCTexture2D: 纹理,即图片加载入内存后供CPU和GPU操作的贴图对象。 CCTexturePVR:处理PVR文件生成纹理的类,提示:大家可以用它解析愤怒的小鸟中的图片。CCTextureCach

6、e:纹理管理器,负责加载图片并对生成的纹理进行管理。通过“字典”来进行快速的查询。 CCTextureAtlas:纹理块管理器,如果图片是由多个小图块组成的,则纹理块管理器用来存储这些小图块的相关信息,以方便绘制相应图块。 为了让大家更好的学习纹理,在讲解纹理的代码之前我已经先给大家分析了本章用到的两个功能类:CCImage和CCDictionary。这两个类分别在纹理模块中担任加载图片和管理纹理指针的作用。希望大家先顶一下这两篇贴子之后再开始下面的代码学习,你一定会感到非常容易。一CCTexture2D:好,咱们现在开始看CCTexture2D:cppview plaincopy1. #if

7、ndef_CCTEXTURE2D_H_2. #define_CCTEXTURE2D_H_3. 4. #include5. #includecocoa/CCObject.h6. #includecocoa/CCGeometry.h7. #includeccTypes.h8. 9. /Cocos2d命名空间10. NS_CC_BEGIN11. /需要用到CCImage,这里声明一下。12. classCCImage;13. 14. /纹理格式:即每个纹理中的像素单位分别是怎么为颜色值进行实际内存分配的。这个非常重要,我们在进行游戏开发的过程中,会常常与各种图片类型打交通。每种图片往往也有各自的像素

8、格式。但当它们一旦加载到游戏中后,就会根据我们的要求变成以下某种类型的纹理。不同的纹理格式所占据的内存大小可能不同,我们要根据实际情况和需求来选择相应的纹理格式。比如我们用RGBA8888纹理格式来创建纹理,它占据的内存容量很大,如果我们要显示的纹理中没有ALPHA值,那就不应该使用带ALPHA通道的纹理格式。我们就可以改成RGB565像素格式。15. 16. typedefenum17. 18. /32位真彩色,最真但最耗内存19. kCCTexture2DPixelFormat_RGBA8888,20. /24位真彩色,去掉了ALPHA通道21. kCCTexture2DPixelForm

9、at_RGB888,22. /16位色,将RGB压缩在一个字中。绿色多了1位,因为人眼对绿色更敏感。23. kCCTexture2DPixelFormat_RGB565,24. /8位色,只存ALPHA值,做遮罩图用25. kCCTexture2DPixelFormat_A8,26. /8位色,只存灰度或者强度值,做灰度图用27. kCCTexture2DPixelFormat_I8,28. /16位色,只存ALPHA值与强度值,双功能29. kCCTexture2DPixelFormat_AI88,30. /16位色,RGBA四通道各占4位。31. kCCTexture2DPixelForm

10、at_RGBA4444,32. /16位色,RGB三通道各占5位,多1位留做ALPHA镂空使用33. kCCTexture2DPixelFormat_RGB5A1,34. /PVR的PVRTC4压缩格式35. kCCTexture2DPixelFormat_PVRTC4,36. /PVRTC的PVRTC2压缩格式37. kCCTexture2DPixelFormat_PVRTC2,38. 39. /默认格式RGBA888840. kCCTexture2DPixelFormat_Default=kCCTexture2DPixelFormat_RGBA8888,41. 42. /为了兼容性而保留的

11、枚举值43. kTexture2DPixelFormat_RGBA8888=kCCTexture2DPixelFormat_RGBA8888,44. kTexture2DPixelFormat_RGB888=kCCTexture2DPixelFormat_RGB888,45. kTexture2DPixelFormat_RGB565=kCCTexture2DPixelFormat_RGB565,46. kTexture2DPixelFormat_A8=kCCTexture2DPixelFormat_A8,47. kTexture2DPixelFormat_RGBA4444=kCCTexture

12、2DPixelFormat_RGBA4444,48. kTexture2DPixelFormat_RGB5A1=kCCTexture2DPixelFormat_RGB5A1,49. kTexture2DPixelFormat_Default=kCCTexture2DPixelFormat_Default50. 51. CCTexture2DPixelFormat;52. 53. /需要使用Shader代码片段,这里声明一下54. classCCGLProgram;55. 56. /定义了纹理的一些参数57. typedefstruct_ccTexParams58. GLuintminFilte

13、r;/纹理过滤器:缩小过滤器59. GLuintmagFilter;/纹理过滤器:放大过滤器60. GLuintwrapS;/横向纹理寻址模式61. GLuintwrapT;/纵向纹理寻址模式62. ccTexParams;63. 64. 65. /CCTexture2D类可以方便的从图片,文本或raw数据文件中创建OpenGL所用贴图,创建的贴图会自动转为2的幂次方大小,所以要注意对于贴图坐标的影响。66. 67. classCC_DLLCCTexture2D:publicCCObject68. 69. public:70. /构造71. CCTexture2D();72. /析构73. v

14、irtualCCTexture2D();74. /取得纹理的描述75. constchar*description(void);76. 77. /释放数据78. voidreleaseData(void*data);79. /保存数据80. void*keepData(void*data,unsignedintlength);81. 82. /由数据指针和指定的像素格式,图片宽高,来生成OpenGL贴图。83. boolinitWithData(constvoid*data,CCTexture2DPixelFormatpixelFormat,unsignedintpixelsWide,unsi

15、gnedintpixelsHigh,constCCSize&contentSize);84. 85. /在指定的位置绘制贴图86. voiddrawAtPoint(constCCPoint&point);87. /纹制贴图上的一个图像块88. voiddrawInRect(constCCRect&rect);89. 90. /由CCImage指针生成OpenGL贴图91. boolinitWithImage(CCImage*uiImage);92. 93. /由一个字符串生成OpenGL贴图。94. boolinitWithString(constchar*text,constCCSize&d

16、imensions,CCTextAlignmenthAlignment,CCVerticalTextAlignmentvAlignment,constchar*fontName,floatfontSize);95. /由一个字符串和指定的字体与大小生成OpenGL贴图96. boolinitWithString(constchar*text,constchar*fontName,floatfontSize);97. 98. /如果支持PVR的压缩格式99. #ifdefCC_SUPPORT_PVRTC100. /由一个PVR压缩格式的数据生成OpenGL贴图101. boolinitWithP

17、VRTCData(constvoid*data,intlevel,intbpp,boolhasAlpha,intlength,CCTexture2DPixelFormatpixelFormat);102. #endif/CC_SUPPORT_PVRTC103. 104. /从普通PVR文件生成OpenGL贴图105. boolinitWithPVRFile(constchar*file);106. 107. /设置贴图参数108. voidsetTexParameters(ccTexParams*texParams);109. 110. /设置为抗锯齿的贴图过滤方式(线性过滤)111. voi

18、dsetAntiAliasTexParameters();112. 113. /设置为非抗锯齿的贴图过滤方式(最近点采样)114. voidsetAliasTexParameters();115. 116. 117. /生成多级贴图:由图片数据生成一系列尺寸为2的幂次方直至当前贴图大小的贴图。系统会根据距离自动选择纹理图片。可以解决大图片显示在小空间时的闪烁问题。118. voidgenerateMipmap();119. 120. /取得像素格式名称121. constchar*stringForFormat();122. 123. /返回当前贴图色深,即每个像素占多少位124. unsig

19、nedintbitsPerPixelForFormat();125. 126. /通过参数贴图格式返回纹理色深127. unsignedintbitsPerPixelForFormat(CCTexture2DPixelFormatformat);128. 129. 130. /静态函数,用于设置默认带ALPHA通道的贴图像素格式。则图片创建为贴图时,如果有ALPHA通道,则生成此默认贴图像素格式。131. staticvoidsetDefaultAlphaPixelFormat(CCTexture2DPixelFormatformat);132. 133. /静态函数,取得默认带ALPHA通道

20、的贴图像素格式。134. staticCCTexture2DPixelFormatdefaultAlphaPixelFormat();135. 136. /静态函数,设置载入PVR时是否开启ALPHA渐变,默认不开启,则ALPHA值只有是与否,无渐变。137. staticvoidPVRImagesHavePremultipliedAlpha(boolhaveAlphaPremultiplied);138. 139. /取得图片大小(以像素为单位)140. constCCSize&getContentSizeInPixels();141. /是否有ALPHA渐变值142. boolhasPre

21、multipliedAlpha();143. /是否有多级贴图144. boolhasMipmaps();145. private:146. /加载一个带ALPHA渐变的图片生成OpenGL贴图147. boolinitPremultipliedATextureWithImage(CCImage*image,unsignedintpixelsWide,unsignedintpixelsHigh);148. 149. /ALPHA渐变开关150. boolm_bPVRHaveAlphaPremultiplied;151. 152. /贴图格式变量及get接口153. CC_PROPERTY_RE

22、ADONLY(CCTexture2DPixelFormat,m_ePixelFormat,PixelFormat)154. /贴图宽度及get接口155. CC_PROPERTY_READONLY(unsignedint,m_uPixelsWide,PixelsWide)156. /贴图高度及get接口157. CC_PROPERTY_READONLY(unsignedint,m_uPixelsHigh,PixelsHigh)158. 159. /OpenGL贴图索引及get接口160. CC_PROPERTY_READONLY(GLuint,m_uName,Name)161. 162. /横

23、向贴图坐标终点。因为图片如果不是2的幂次方,图片大小会小于贴图的大小,贴图一定是2的幂次方嘛,这时候横向的贴图坐标终点不是1.0。163. CC_PROPERTY(GLfloat,m_fMaxS,MaxS)164. /纵向贴图坐标终点。165. CC_PROPERTY(GLfloat,m_fMaxT,MaxT)166. /图片大小及get接口167. CC_PROPERTY_READONLY(CCSize,m_tContentSize,ContentSize)168. 169. /ALPHA渐变开关170. boolm_bHasPremultipliedAlpha;171. /多级纹理开关17

24、2. boolm_bHasMipmaps;173. 174. /Shader代码片段指针175. CC_PROPERTY(CCGLProgram*,m_pShaderProgram,ShaderProgram);176. ;177. 178. NS_CC_END179. 180. #endif/_CCTEXTURE2D_H_再来看CCTexture2D.cpp:cppview plaincopy1. #includeCCTexture2D.h2. #includeccConfig.h3. #includeccMacros.h4. #includeCCConfiguration.h5. #inc

25、ludeplatform/platform.h6. #includeplatform/CCImage.h7. #includeCCGL.h8. #includesupport/ccUtils.h9. #includeplatform/CCPlatformMacros.h10. #includetextures/CCTexturePVR.h11. #includeCCDirector.h12. #includeshaders/CCGLProgram.h13. #includeshaders/ccGLStateCache.h14. #includeshaders/CCShaderCache.h15

26、. /这里定义是否使用可变纹理16. #ifCC_ENABLE_CACHE_TEXTURE_DATA17. #includeCCTextureCache.h18. #endif19. /Cocos2d-x命名空间20. NS_CC_BEGIN21. 22. 23. /静态全局的默认贴图像素格式。缺省为kCCTexture2DPixelFormat_Default,即RGBA8888。24. staticCCTexture2DPixelFormatg_defaultAlphaPixelFormat=kCCTexture2DPixelFormat_Default;25. 26. /静态全局的PVR

27、是否有ALPHA渐变的开关变量,默认为否。27. staticboolPVRHaveAlphaPremultiplied_=false;28. 29. /构造函数。30. CCTexture2D:CCTexture2D()31. :m_uPixelsWide(0)32. ,m_uPixelsHigh(0)33. ,m_uName(0)34. ,m_fMaxS(0.0)35. ,m_fMaxT(0.0)36. ,m_bHasPremultipliedAlpha(false)37. ,m_bHasMipmaps(false)38. ,m_bPVRHaveAlphaPremultiplied(true)39. ,m_pShaderProgram(NULL)40. 41. 42. /析构43. CCTexture2D:CCTexture2D()44. 45. /如果使用可变纹

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1