1、03OPhone平台2D游戏引擎实现图形图像系统上一篇文章中我们介绍了引擎的场景、图层部分,我们已经拥有了一个用来代表一个游戏界面的容器,现在就需要向这个容器中加入各种元素,这些元素就是我们上一节给大家介绍的节点,我们前面看到在Node类中定义了一些接口,一直没有使用,本节我们将使用这一部分接口来完成图形图像的渲染,比如一个节点是一张背景图片,那么我们就需要将图片按照Opengl纹理映射的方式来进行贴图操作。下面先给大家介绍一下本节的主要内容。 引擎工具包:包括常用的逻辑操作和资源的装载等等。 2D纹理贴图:封装实现一个2D的纹理贴图对象,方便引擎中的贴图操作。 图片集:将很多图片放到一张大图
2、片上,使用时进行分割,原因稍后解析。 贴图管理器:负责管理引擎中所有贴图的缓冲,以及释放,重新载入等逻辑。 贴图元素:在Node的基础上实现2D纹理对象,贴图帧,精灵等。引擎工具包引擎一般都包含一个工具包,通常用来处理一些简单的逻辑,比如一些数学计算,角度的换转等,这里我们还包括了资源的装载于解析,包括从res文件夹下面获取资源,以及对一个特殊资源(TGA)的解析和使用。下面我们将分别稍稍他们的实现。常用工具包常用工具包就是对一些常用的操作进行了封装,所以大家一看就能明白,我们也加入了注解,这里就不在多浪费时间了。具体实现入代码清单3-1所示。代码清单3-1:Utilities实现view p
3、laincopy to clipboardprint?1. publicclassUtilities 2. privatestaticfinalRandomsRandom=newRandom(); 3. /产生指定的随机数 4. publicstaticfloatrandMinusOneToOne() 5. return(float)Math.random()*2.0F-1.0F; 6. 7. publicstaticfloatrandZeroToOne() 8. return(float)Math.random(); 9. 10. publicstaticintrand(intmax) 11
4、. returnsRandom.nextInt(max); 12. 13. /角度与弧度之间的转换 14. publicstaticfloatd2r(floatangle) 15. returnangle/180.0F*3.141593F; 16. 17. publicstaticfloatr2d(floatangle) 18. returnangle/3.141593F*180.0F; 19. 20. /将byte数组转换成UTF8字符串 21. publicstaticStringgetUTF8String(byteb) 22. if(b=null) 23. return; 24. ret
5、urngetUTF8String(b,0,b.length); 25. 26. publicstaticStringgetUTF8String(byteb,intstart,intlength) 27. if(b=null) 28. return; 29. try 30. returnnewString(b,start,length,UTF-8); 31. catch(UnsupportedEncodingExceptione) 32. 33. return; 34. 35. /指数 36. publicstaticintgetClosest2Exp(intnum) 37. if(num!=1
6、)&(num&num-1)!=0) 38. inti=1; 39. while(i-1;-y) 105. for(intx=0;x24&0xFF; 108. intred=pix16&0xFF; 109. intgreen=pix8&0xFF; 110. intblue=pix&0xFF; 111. ib.put(red24|green16|blue8|alpha); 112. 113. 114. bb.position(0); 115. returnbb; 116. 117. /交换数据 118. publicstaticvoidswap(floatv,intindex1,intindex2
7、) 119. floattmp=vindex1; 120. vindex1=vindex2; 121. vindex2=tmp; 122. 123. /从Raw中读取一个资源文件转换为byte数组 124. publicstaticbytedataOfRawResource(Contextcontext,intid) 125. InputStreamin=null; 126. bytebytes=(byte)null; 127. try 128. in=context.getResources().openRawResource(id); 129. bytebuf=newbyte1024; 1
8、30. ByteArrayOutputStreamout=newByteArrayOutputStream(); 131. for(inti=0;i!=-1;i=in.read(buf) 132. out.write(buf,0,i); 133. 134. bytes=out.toByteArray(); 135. out.flush(); 136. out.close(); 137. catch(Throwablee) 138. Log.e(Engine,Cantreadtherawresource:+id); 139. finally 140. try 141. if(in!=null)
9、142. in.close(); 143. catch(IOExceptionlocalIOException1) 144. 145. 146. returnbytes; 147. 148. public class Utilities private static final Random sRandom = new Random(); /产生指定的随机数 public static float randMinusOneToOne() return (float) Math.random() * 2.0F - 1.0F; public static float randZeroToOne()
10、 return (float) Math.random(); public static int rand(int max) return sRandom.nextInt(max); /角度与弧度之间的转换 public static float d2r(float angle) return angle / 180.0F * 3.141593F; public static float r2d(float angle) return angle / 3.141593F * 180.0F; /将byte数组转换成UTF8字符串 public static String getUTF8Strin
11、g(byte b) if (b = null) return ; return getUTF8String(b, 0, b.length); public static String getUTF8String(byte b, int start, int length) if (b = null) return ; try return new String(b, start, length, UTF-8); catch (UnsupportedEncodingException e) return ; /指数 public static int getClosest2Exp(int num
12、) if (num != 1) & (num & num - 1) != 0) int i = 1; while (i num) i *= 2; num = i; return num; /计算文字的尺寸 public static YFSSize calculateTextSize(String text, String fontname, float fontSize) Typeface typeface = Typeface.create(fontname, 0); Paint paint = new Paint(); paint.setTypeface(typeface); paint
13、.setTextSize(fontSize); paint.setAntiAlias(true); int ascent = (int) Math.ceil(-paint.ascent(); int descent = (int) Math.ceil(paint.descent(); int measuredTextWidth = (int) Math.ceil(paint.measureText(text); return YFSSize.make(measuredTextWidth, ascent + descent); /创建一个文字Label转换为Bitmap public stati
14、c Bitmap createLabelBitmap(String text, YFSSize dimensions, Label.TextAlignment alignment, String fontname, float fontSize) Typeface typeface = Typeface.create(fontname, 0); Paint paint = new Paint(); paint.setTypeface(typeface); paint.setTextSize(fontSize); paint.setAntiAlias(true); paint.setColor(
15、-1); int ascent = 0; int descent = 0; int measuredTextWidth = 0; ascent = (int) Math.ceil(-paint.ascent(); descent = (int) Math.ceil(paint.descent(); measuredTextWidth = (int) Math.ceil(paint.measureText(text); int textWidth = measuredTextWidth; int textHeight = ascent + descent; if (dimensions.widt
16、h = 0.0F) | (dimensions.height = 0.0F) YFSSize size = calculateTextSize(text, fontname, fontSize); dimensions.width = size.width; dimensions.height = size.height; int width = getClosest2Exp(int) dimensions.width); int height = getClosest2Exp(int) dimensions.height); Bitmap.Config config = Bitmap.Con
17、fig.ARGB_8888; Bitmap bitmap = Bitmap.createBitmap(width, height, config); Canvas canvas = new Canvas(bitmap); bitmap.eraseColor(0); int y = ascent + (int) dimensions.height - textHeight) / 2; int x = 0; switch (alignment) case RIGHT: x = (int) dimensions.width - textWidth; break; case LEFT: x = (int) dimensions.width - textWidth) / 2; canvas.drawText(text, x, y, paint); return bitmap; /argb转换为rgba格式 public static ByteBuffer argb2rgba(Bitmap bmp) ByteBuffer bb = ByteBuffer.allocateDirect(bmp.getHeight() * bmp
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1