首页 01_OPhone平台2D游戏引擎实现——概述及框架.doc

01_OPhone平台2D游戏引擎实现——概述及框架.doc

举报
开通vip

01_OPhone平台2D游戏引擎实现——概述及框架.doc01_OPhone平台2D游戏引擎实现——概述及框架.doc 很来高兴在兴里又和大家兴面了~兴大家兴的是Ophone平台2D游兴引擎兴兴~兴然兴在3D的游兴越越多~但是来2D游兴依然倍受兴迎,兴了方便我兴兴兴更多精彩的2D游兴,兴里我兴兴兴如何兴兴一将来个OPhone平台的2D游兴引擎~兴于3D游兴及其引擎兴兴~我兴再抽出兴兴兴大家介兴。相信大家兴兴兴兴兴兴兴的兴~兴于基兴知兴也有一定的会来学 把握~所以我兴兴一系列文章介兴更高兴的容~大家也可以考将内参Opengl官方站兴行更多的兴。祝大家网学 学兴愉快, 先回...

01_OPhone平台2D游戏引擎实现——概述及框架.doc
01_OPhone平台2D游戏引擎实现——概述及框架.doc 很来高兴在兴里又和大家兴面了~兴大家兴的是Ophone平台2D游兴引擎兴兴~兴然兴在3D的游兴越越多~但是来2D游兴依然倍受兴迎,兴了方便我兴兴兴更多精彩的2D游兴,兴里我兴兴兴如何兴兴一将来个OPhone平台的2D游兴引擎~兴于3D游兴及其引擎兴兴~我兴再抽出兴兴兴大家介兴。相信大家兴兴兴兴兴兴兴的兴~兴于基兴知兴也有一定的会来学 把握~所以我兴兴一系列文章介兴更高兴的容~大家也可以考将内参Opengl官方站兴行更多的兴。祝大家网学 学兴愉快, 先回兴一下09年度OphoneSDN征文大兴~我兴所兴的是“深入出来浅Ophone平台游兴兴兴”~在兴篇文章两中,我兴完成了一兴魔全球的最兴典的游兴俄兴斯方兴~但是我兴所使用的技兴主要包括个Ophone平台的Skia兴形兴和一些常用的兴件~大家也看到了在Ophone平台中行兴兴小游兴不需要心效率兴兴~但是大家同兴也注运并担 意到了~我兴的游兴有太多的兴和特效~有兴和特效的游兴就如在兴事本中兴制兴形一兴~兴人郁兴并没画没画犹很~不但效果不好~而且需要花兴大量兴兴、精力。兴肯定不是我兴所想要的~同兴在我兴加入了兴和特效之后~游画兴能否流兴行运?兴兴兴兴效果不兴意~所以我兴需要一兴更先兴的技兴兴理兴和特效~在保兴游兴能兴利行的前很来画运 提下~使游兴更加生兴~那便是本次我兴所兴的“利用来3D技兴兴兴来2D游兴”。Ophone平台所提供的3D渲染兴形兴便是我兴熟悉的Opengl ES~下面我兴就使用将Opengl ES来构个架一游兴引擎。在兴始之前~我兴兴大家演示一下~利用我兴兴兴的引擎完成的一游兴半成品。如兴来个1所示兴游兴的兴兴面~启画兴2兴主菜兴界面~兴3兴游兴中的界面~每界面之兴的切兴都有相兴的兴效果~游兴中也有各兴“精”的兴兴个会画灵,更多游兴相兴截兴兴兴文末的附兴。参 兴1 启画兴兴面 兴2 游兴主界面 兴3 游兴中界面 大家已兴看到了我兴的半成品游兴~兴兴且相信我兴的兴兴的引擎能兴兴松的完成很Ophone平台2D游兴的兴兴(当然稍加兴整同兴可以兴兴3D游兴)~同兴看完兴一系列文章之后~同兴可以兴兴自己的游兴引擎且能兴兴出兴兴多当你你并 彩的游兴。因兴者兴兴有多人在兴笔很Opengl是什兴,能做什兴的兴兴,所以在兴始引擎兴兴的兴之前~我兴首先兴学Opengl ES兴行一兴兴的介兴。个 Opengl ES概述 OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三兴兴形 API 的子集~兴兴手机、PDA和游兴主机等嵌入式兴兴而兴兴。兴API由Khronos集兴定兴推~广Khronos是一兴形兴硬件行兴兴~兴兴主要兴注兴形和个会会 多媒方面的兴放兴准。体 OpenGL ES 是 从OpenGL 裁剪定制而的~去除了 来glBegin/glEnd~四兴形;GL_QUADS,、多兴形;GL_POLYGONS,等兴兴兴元等兴多非兴兴必要的特性。兴兴多年兴展~兴在主要有版本~两个OpenGL ES 1.x 兴兴固定管兴硬件的~OpenGL ES 2.x 兴兴可兴程管兴硬件。OpenGL ES 1.0 是以 OpenGL 1.3 兴范兴基兴的~OpenGL ES 1.1 是以 OpenGL 1.5 兴范兴基兴的~兴分兴又支持 它common 和 common lite 两兴profile。lite profile只支持定点定点兴~而数common profile既数数支持定点又支持浮点。 OpenGL ES 2.0 兴是照参 OpenGL 2.0 兴范定兴的~common profile兴布于2005-8~引入了兴可兴程管兴的支持。下面是我兴列兴的一些被Opengl ES裁剪掉的Opengl功能,因此大家在使用api兴需要注意,不能使用以下兴些api, 1. glBegin/glEnd 2. glArrayElement 3. 兴示列表 4. 求兴器 5. 索引色模式 6. 自定兴裁剪平面 7. glRect 8. 兴像兴理(兴一般兴也有~个卡没FireGL/Quadro兴有卡) 9. 反兴兴冲 10. 兴兴兴冲 11. 累兴兴冲 12. 兴界兴志 13. glPolygonMode 14. GL_QUADS、GL_QUAD_STRIP、GL_POLYGON 15. glPushAttrib、PopAttrib、glPushClientAttrib、glPopClientAttrib16. TEXTURE_1D、TEXTURE_3D、TEXTURE_RECT、TEXTURE_CUBE_MAP17. GL_COMBINE 18. 自兴兴理坐兴生成 19. 兴理兴界 20. GL_CLAMP、GL_CLAMP_TO_BORDER 21. 消失兴理代表 22. 兴理LOD限定 23. 兴理偏好限定 24. 兴理自兴兴兴、解兴兴 25. glDrawPixels、glPixelTransfer、glPixelZoom 26. glReadBuffer、glDrawBuffer、glCopyPixels 由于篇幅兴系,兴里我兴列兴的可能不是全部,更多兴兴容大家可以考内参www.khronos.org/opengles/。 引擎兴分构划 下面我兴兴始兴入游兴引擎的兴兴兴学,在架一游兴引擎之前构个,我兴需要兴引擎的功能兴行定和分确划,兴里我兴兴引擎划分兴以下模兴几个: • 核心架;包括据兴型、常兴理、事件兴理,框数异 • 兴景、兴兴、兴景元素;兴点, • 兴兴\理、精灵 • 文字渲染 • 常用兴件 • 兴系兴画 • 地兴系兴 • 粒子系兴 • 游兴兴例 我兴也按照兴里兴程兴行兴~然要使引擎更加完善~兴兴需要音兴~音效、据存兴等子系兴~兴里我兴主要会来学当数 兴兴游兴引擎的兴形渲染部分~最后有一前面我兴演示的游兴兴例,其他的我兴有机在兴兴。会个会 坐兴系 坐兴系是我兴所兴兴的第一兴兴~因兴在个Ophone平台中的缺省坐兴系是原点在左上角~x 和 y 兴的正向是往右和往下。而 OpenGL 的坐兴系是原点在左下角x 和 y 兴的正向是往右和往上。所以我兴首先需要明白兴我兴兴里所使用的坐兴系~明作原确会兴点的所在地~然后更多坐兴系相兴兴兴~我兴后面兴兴兴大家介兴。 游兴引擎架框 一好的系兴个离个构将构个或者兴用程序都不兴一兴秀的架~下面我兴分析如何合理的架一Ophone平台的游兴引擎架框.兴里需要兴明一下~者在架兴考了笔构参Iphone平台著名的2D游兴引擎cocos2D的架构,在兴里也兴兴引擎的作者表示感兴.因此如果熟悉你Iphone平台且熟悉并cocos2D~容将会很框易的理解本兴引擎的架,如果不熟悉~也不必心~我兴兴兴的分担会个析每一模兴。用Opengl来个渲染兴形~首先就需要兴建一于底兴硬件相兴的用于兴示兴形的窗口和渲染器~兴兴程本身比兴兴兴~但是Ophone平台兴我兴系兴了GLSurfaceView兴用来兴建一个窗口GLSurfaceView.Renderer用来构个很建一渲染器~兴使得我兴可以兴松的完成兴一工作。下面我兴首先看一下窗口的兴建~兴里我兴兴了兴大家兴GLSurfaceView的兴兴理解得更深刻~我兴兴建一个GLSurfaceView的子兴YFSGLSurfaceView来窗个清作兴我兴的渲染口~整兴的兴兴非常兴兴~如代兴兴1-1所示。view plaincopy to clipboardprint? 1.代兴兴清1-1:YFSGLSurfaceView兴兴兴 2.public class YFSGLSurfaceView extends GLSurfaceView { 3. public YFSGLSurfaceView(Context context) { 4. this(context, null); 5. } 6. public YFSGLSurfaceView(Context context, AttributeSet attrs) { 7. super(context, attrs); 8. // 兴置Surface格式 9. setEGLConfigChooser(8, 8, 8, 8, 16, 0); 10. // 兴置Renderer 11. setRenderer(this.mDirector); 12. getHolder().setFormat(PixelFormat.TRANSLUCENT); 13. //允兴兴事件 触 14. setFocusable(true); 15. setFocusableInTouchMode(true); 16. } 17. //窗触口兴毁兴兴 18. public void surfaceDestroyed(SurfaceHolder holder) { 19. super.surfaceDestroyed(holder); 20. } 21. public boolean onTouchEvent(MotionEvent event) { 22. //触笔事件兴理 23. return true; 24. } 25. //按兴事件兴理 26. public boolean onKeyDown(int keyCode, KeyEvent eve nt) { 27. return super.onKeyDown(keyCode, event); 28. } 29. public boolean onKeyUp(int keyCode, KeyEvent event) { 30. return super.onKeyUp(keyCode, event); 31. } 32.} 代兴兴清1-1~我兴便在Ophone平台上兴兴了一个Opengl渲染窗口~大部分地方我兴都加入了注解~相信大家都能看明白,兴里我兴重点兴明一下setEGLConfigChooser函数参数~其包括了rgba的兴色尺寸和深度兴~冲 模板 个人简介word模板免费下载关于员工迟到处罚通告模板康奈尔office模板下载康奈尔 笔记本 模板 下载软件方案模板免费下载 兴的冲尺寸~最主要兴兴放在setRenderer函数它窗个来中~用于兴兴渲染口兴置一渲染器渲染我兴兴制的兴 形。兴兴形渲染器我兴同兴需要自己兴兴~前面兴兴可以来采用GLSurfaceView.Renderer来将兴兴渲染器~下面我兴兴建一个Renderer的子兴来作兴兴兴境的渲染器。根据cocos2D的兴兴~我兴渲染器将命名兴Director~大家可以从称来名看出~Director扮演着一非常个清重要的角色~如代兴兴1-2所示。 代兴兴清1-2:Director构架兴兴 view plaincopy to clipboardprint? 1.public class Director implements GLSurfaceView.Renderer { 2. private static Director sInstance; 3. //投影的兴型,分兴2D,3D等 4. public static final int PROJECTION_2D = 1; 5. public static final int PROJECTION_3D = 2; 6. public static final int PROJECTION_CUSTOM = 3; 7. //默兴兴2D 8. public static final int PROJECTION_DEFAULT = PROJECTION_ 2D; 9. public Context context = null; 10. public GL10 gl = null; 11. public GL11 gl11 = null; 12. public GL11ExtensionPack gl11ext = null; 13. private GLSurfaceView mGLView; 14. private long mLastUpdateTime; 15. private boolean mPaused; 16. private int mProjection; 17. private int mWidth; 18. private int mHeight; 19. private DisplayMetrics mDM; 20. private List mDestroyables; 21. //生命周期 22. private List mLifecycleObs ervers; 23. //取得本兴兴象 24. public static Director getInstance() { 25. synchronized (Director.class) { 26. if (sInstance == null) { 27. sInstance = new Director(); 28. } 29. return sInstance; 30. } 31. } 32. protected Director() { 33. synchronized (Director.class) { 34. this.mPaused = false; 35. this.mDestroyables = new ArrayList(); 36. this.mLifecycleObservers = new ArrayList(); 37. } 38. } 39. //生命周期相兴 40. public void addLifecycleObserver(IDirectorLifecycleObserver observer) { 41. this.mLifecycleObservers.add(observer); 42. } 43. public void removeLifecycleObserver(IDirectorLifecycleObserver observer) { 44. this.mLifecycleObservers.remove(observer); 45. } 46. public void registerDestroyable(IDestroyable destroyable) { 47. this.mDestroyables.add(destroyable); 48. } 49. public void unregisterDestroyable(IDestroyable destroyable) { 50. this.mDestroyables.remove(destroyable); 51. } 52. //激活GL兴兴 53. public boolean attachInView(GLSurfaceView view) { 54. return initOpenGLViewWithView(view); 55. } 56. //兴取幕屏属的相兴性 57. public DisplayMetrics getDisplayMetrics() { 58. if (this.mDM == null) { 59. this.mDM = this.context.getResources().getDisplayMetrics(); 60. } 61. return this.mDM; 62. } 63. //兴算fps 64. private void calculateDeltaTime() { 65. long now = SystemClock.uptimeMillis(); 66. if (this.mLastUpdateTime == 0L) { 67. this.mDelta = 0.0F; 68. } else { 69. this.mDelta = ((float) (now - this.mLastUpdateTime) / 1000.0F); 70. this.mDelta = Math.max(0.0F, this.mDelta); 71. } 72. this.mLastUpdateTime = now; 73. } 74. //退出兴理 75. private boolean detach() { 76. try { 77. if ((this.context instanceof Activity) 78. && (!((Activity) this.context).isFinishing())) 79. ((Activity) this.context).finish(); 80. return true; 81. } catch (Exception e) { 82. } 83. return false; 84. } 85. //兴束兴兴放空兴 86. public void end() { 87. if ((this.mGLView != null) && (!this.mPaused)) { 88. this.mGLView.onPause(); 89. } 90. for (IDirectorLifecycleObserver ob : this.mLifecycleObservers) 91. ob.onDirectorEnd(); 92. this.mLifecycleObservers.clear(); 93. this.mDM = null; 94. this.gl = null; 95. this.gl11 = null; 96. this.gl11ext = null; 97. for (IDestroyable destroyable : this.mDestroyables) 98. destroyable.destroy(); 99. this.mDestroyables.clear(); 100. detach(); 101. this.context = null; 102. this.mGLView = null; 103. sInstance = null; 104. //兴放所有兴源,内存空兴,,包括后面介兴的兴兴将,scene,layer等 105. } 106. public Context getContext() { 107. return this.context; 108. } 109. //取得幕屏方向 110. public boolean isPortrait() { 111. Display display = ((WindowManager) this.context 112. .getSystemService("window")).getDefaultDisplay(); 113. return display.getOrientation() == 0; 114. } 115. //得到GL兴兴 116. public GLSurfaceView getOpenGLView() { 117. return this.mGLView; 118. } 119. //得到投影兴型 120. public int getProjection() { 121. return this.mProjection; 122. } 123. //初始化GL的默兴性 属 124. private void initGLDefaultValues(GL10 gl) { 125. this.gl = gl; 126. if (gl instanceof GL11) 127. this.gl11 = ((GL11) gl); 128. if (gl instanceof GL11ExtensionPack) { 129. this.gl11ext = ((GL11ExtensionPack) gl); 130. } 131. //兴兴 启抖 132. gl.glDisable(GL10.GL_DITHER); 133. //兴置插兴算法及其渲染模式 134. gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); 135. //兴置是否兴启混合(是) 136. setAlphaBlending(true); 137. //兴置混色的方式 138. gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_ MINUS_SRC_ALPHA); 139. //兴启光效 140. gl.glDisable(GL10.GL_LIGHTING); 141. //兴置渲染模式 142. gl.glShadeModel(GL10.GL_FLAT); 143. //兴置清屏理幕兴色rgba 144. gl.glClearColor(0.0F, 0.0F, 0.6F, 0.0F); 145. } 146. //根据GLSurfaceView来初始化GL兴兴 147. private boolean initOpenGLViewWithView(GLSurfaceView view) { 148. this.mGLView = view; 149. DisplayMetrics dm = getDisplayMetrics(); 150. this.mWidth = dm.widthPixels; 151. this.mHeight = dm.heightPixels; 152. EventDispatcher.getInstance().setDispatchEvents(true); 153. return true; 154. } 155. //判断是否被激活 156. public boolean isOpenGLAttached() { 157. return this.mGLView != null; 158. } 159. //渲染 160. public void onDrawFrame(GL10 gl) { 161. if (this.mGLView == null) { 162. return; 163. } 164. //允兴兴置兴点兴数,兴色兴数,兴理坐兴兴 数 165. gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 166. gl.glDisableClientState(GL10.GL_COLOR_ARRAY); 167. gl.glDisableClientState(GL10.GL_TEXTURE_COORD_A RRAY); 168. //允兴2D兴兴 169. gl.glDisable(GL10.GL_TEXTURE_2D); 170. //清屏理幕(兴色兴存,深度兴存) 171. gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT); 172. //兴算fps 173. calculateDeltaTime(); 174. if (this.mPaused) 175. return; 176. } 177. //屏窗幕口大小改兴 178. public void onSurfaceChanged(GL10 gl, int width, int height) { 179. this.mWidth = width; 180. this.mHeight = height; 181. gl.glViewport(0, 0, width, height); 182. setDefaultProjection(); 183. } 184. //窗口兴建兴 185. public void onSurfaceCreated(GL10 gl, EGLConfig confi g) { 186. initGLDefaultValues(gl); 187. } 188. //兴毁兴 189. public void onSurfaceDestroyed() { 190. } 191. //兴停兴理 192. public void pause() { 193. if (this.mPaused) { 194. return; 195. } 196. if (this.mGLView != null) 197. this.mGLView.onPause(); 198. this.mPaused = true; 199. for (IDirectorLifecycleObserver ob : this.mLifecycleObservers) 200. ob.onDirectorPause(); 201. } 202. //中之后断重新激活 203. public void resume() { 204. if (!this.mPaused) { 205. return; 206. } 207. this.mLastUpdateTime = SystemClock.uptimeMillis(); 208. if (this.mGLView != null) { 209. this.mGLView.onResume(); 210. } 211. this.mPaused = false; 212. this.mDelta = 0.0F; 213. for (IDirectorLifecycleObserver ob : this.mLifecycleObservers) 214. ob.onDirectorResume(); 215. } 216. //兴置投影兴型兴2D 217. public void set2DProjection() { 218. setProjection(PROJECTION_2D); 219. } 220. //兴置投影兴型兴3D 221. public void set3DProjection() { 222. setProjection(PROJECTION_3D); 223. } 224. //兴置是否兴启混合 225. public void setAlphaBlending(boolean on) { 226. if (on) 227. this.gl.glEnable(GL10.GL_BLEND); 228. else 229. this.gl.glDisable(GL10.GL_BLEND); 230. } 231. //兴置默兴投影方式 232. private void setDefaultProjection() { 233. setProjection(PROJECTION_DEFAULT); 234. } 235. //兴置深度兴兴 236. public void setDepthTest(boolean on) { 237. if (on) { 238. this.gl.glEnable(GL10.GL_DEPTH_TEST); 239. this.gl.glDepthFunc(GL10.GL_LEQUAL); 240. this.gl.glDepthRangef(0.0F, 1.0F); 241. this.gl.glClearDepthf(1.0F); 242. } else { 243. this.gl.glDisable(GL10.GL_DEPTH_TEST); 244. } 245. } 246. //兴置双面兴示,,,背面裁切 247. public void setCullFace(boolean on) { 248. this.gl.glFrontFace(GL10.GL_CCW); 249. this.gl.glEnable(GL10.GL_CULL_FACE); 250. this.gl.glCullFace(GL10.GL_BACK); 251. } 252. //兴置投影兴型 253. public void setProjection(int projection) { 254. switch (projection) { 255. case PROJECTION_2D: 256. this.gl.glMatrixMode(GL10.GL_PROJECTION); 257. this.gl.glLoadIdentity(); 258. //正交 259. this.gl.glOrthof(0.0F, this.mWidth, 0.0F, this.mH eight, -1.0F, 1.0F); 260. this.gl.glMatrixMode(GL10.GL_MODELVIEW); 261. this.gl.glLoadIdentity(); 262. setDepthTest(false); 263. break; 264. case PROJECTION_3D: 265. this.gl.glViewport(0, 0, this.mWidth, this.mHeight); 266. this.gl.glMatrixMode(GL10.GL_MODELVIEW); 267. this.gl.glLoadIdentity(); 268. //透兴 269. GLU.gluPerspective(this.gl, 60.0F, this.mWidth / this.mHeight, 270. 0.5F, 1500.0F); 271. this.gl.glMatrixMode(GL10.GL_MODELVIEW); 272. this.gl.glLoadIdentity(); 273. //lookat 274. GLU.gluLookAt(this.gl, this.mWidth / 2, this.mHe ight / 2, 275. Camera.getZEye(), this.mWidth / 2, this. mHeight / 2, 0.0F, 276. 0.0F, 1.0F, 0.0F); 277. setDepthTest(true); 278. break; 279. case PROJECTION_CUSTOM: 280. break; 281. } 282. this.mProjection = projection; 283. } 284. //兴毁接口 285. public static abstract interface IDestroyable { 286. public abstract void destroy(); 287. } 288. //生命周期接口 289. public static abstract interface IDirectorLifecycleObse rver { 290. public abstract void onDirectorPause(); 291. public abstract void onDirectorResume(); 292. public abstract void onDirectorEnd(); 293. } 294.} 代兴兴清1-2兴是我兴兴引擎兴兴的一渲染器~其中我兴主要兴个Opengl兴兴兴行了初始化~大家可以看出,我兴留好了3D兴理的接口;因兴某些2D游兴兴了能做得更逼真~同兴需要3D的一些效果~然兴也可能需要更高的版本当 才能支持,~兴里我兴需要兴大家特兴兴明一下兴置插兴算法及其渲染模式~其中 GL_PERSPECTIVE_CORRECTION_HINT是指按照指定兴色和兴理坐兴的兴兴量。插GL_FASTES兴使用速度最快的模式GL_NICEST兴使用兴量最好的模式。由于我兴多兴很候在做游兴兴需要在兴量和效率上兴行兴兴~兴了保兴效率~我兴不免会画将体来确另启抖兴牲一些兴~兴些根据具的游兴定~外我兴兴兴了兴(GL_DITHER)~因兴一旦兴入的片元通兴了所有的兴兴~就可以兴色兴存中的前容按它与当内并来某兴方式合起。最兴兴的方法~也是默兴操作~就是前兴将当覆盖掉。在RGBA模式中~如果希望片元是半透明的或是消除了兴兴兴象的~程序兴可以兴将片元兴兴存中的兴与即抖来作一平均~混合。兴于可用兴色兴少的系兴~可以以兴牲分辨率兴代价~通兴兴色兴的兴兴增加可用兴色量。兴数抖操作是和硬件相兴的~OpenGL允兴程序兴所做的操作就只有打兴或兴兴兴抖操作。兴兴上~若机器的分辨率已兴相高~当抖没抖激活兴操作根本就有任何意兴。要激活或取消兴~可以用 glEnable(GL_DITHER)和glDisable(GL_DITHER)函数况抖。默兴情下~兴是激活的。在兴色索引模式中~ 可以利用任意的按位兴兴操作~兴入将与写片元已入的象素兴行合成;最后需要注意的是我兴在兴置2D投影方式兴兴兴了glOrthof来个兴置一正交兴口~3D兴我兴兴兴了GLU.gluPerspective来个当兴兴一透兴投影效果。然兴里目前只有一部分~因兴我兴所有的事情乎几会都于渲染器相兴~所以我兴后期兴兴兴兴兴行完善~包括兴景堆兴管理~坐兴系兴兴~中、兴断将停等兴理。兴里我兴先介兴兴兴多。 数据兴型 兴了方便兴兴~我兴需要兴兴引擎的据兴型兴行兴一~兴引擎我兴使用如下一些据兴型~下面我兴分兴介兴他兴的数将数将 功能及其作用。 兴象拷兴接口(YFSCopyable)兴里主要是兴兴一用于个当个来体个拷兴兴象的接口~然我兴需要在子兴中兴兴兴接口完成兴象的拷兴工作~具兴兴在每具体清兴象中在兴大家演示~兴接口定兴如代兴兴1-3所示。 代兴兴清1-3,YFSCopyable定兴 view plaincopy to clipboardprint? 1.public abstract interface YFSCopyable { 2. public abstract Object copy(); 3.} 点(YFSPoint) 最基本的据兴型点~定兴如代兴兴数清1-4所示。 代兴兴清1-4,YFSPoint兴兴 view plaincopy to clipboardprint? 1.public class YFSPoint { 2. public float x; 3. public float y; 4. public static YFSPoint makeZero() { 5. return new YFSPoint(0.0F, 0.0F); 6. } 7. public static YFSPoint makeByRadian(float r) { 8. return make((float) Math.cos(r), (float) Math.sin(r)); 9. } 10. public YFSPoint() { 11. this(0.0F, 0.0F); 12. } 13. protected YFSPoint(float x, float y) { 14. this.x = x; 15. this.y = y; 16. } 17. public String toString() { 18. return "(" + this.x + ", " + this.y + ")"; 19. } 20. public static boolean isEqual(YFSPoint p1, YFSPoint p2 ) { 21. return (p1.x == p2.x) && (p1.y == p2.y); 22. } 23. public YFSPoint applyTransform(YFSAffineTransform aTransform) { 24. return aTransform.transform(this); 25. } 26. public static YFSPoint make(float x, float y) { 27. return new YFSPoint(x, y); 28. } 29. public static YFSPoint negate(YFSPoint v) { 30. return make(-v.x, -v.y); 31. } 32. public static YFSPoint add(YFSPoint v1, YFSPoint v2) { 33. return make(v1.x + v2.x, v1.y + v2.y); 34. } 35. public static YFSPoint sub(YFSPoint v1, YFSPoint v2) { 36. return make(v1.x - v2.x, v1.y - v2.y); 37. } 38. public static YFSPoint mul(YFSPoint v, float s) { 39. return make(v.x * s, v.y * s); 40. } 41. public static YFSPoint mul(YFSPoint v, YFSPoint v2) { 42. return make(v.x * v2.x, v.y * v2.y); 43. } 44. public static YFSPoint midpoint(YFSPoint v1, YFSPoint v2) { 45. return mul(add(v1, v2), 0.5F); 46. } 47. public static float dot(YFSPoint v1, YFSPoint v2) { 48. return v1.x * v2.x + v1.y * v2.y; 49. } 50. public static float cross(YFSPoint v1, YFSPoint v2) { 51. return v1.x * v2.y - v1.y * v2.x; 52. } 53. public static YFSPoint perp(YFSPoint v) { 54. return make(-v.y, v.x); 55. } 56. public static YFSPoint rperp(YFSPoint v) { 57. return make(v.y, -v.x); 58. } 59. public static YFSPoint project(YFSPoint v1, YFSPoint v2) { 60. return mul(v2, dot(v1, v2) / dot(v2, v2)); 61. } 62. public static YFSPoint rotate(YFSPoint v1, YFSPoint v2) { 63. return make(v1.x * v2.x - v1.y * v2.y, v1.x * v2.y + v1.y * v2.x); 64. } 65. public static YFSPoint rotateByAngle(YFSPoint v, YFSPoint pivot, float angle) { 66. YFSPoint r = sub(v, pivot); 67. float t = r.x; 68. float cosa = (float) Math.cos(angle); 69. float sina = (float) Math.sin(angle); 70. r.x = (t * cosa - r.y * sina); 71. r.y = (t * sina + r.y * cosa); 72. r = add(r, pivot); 73. return r; 74. } 75. public static YFSPoint unrotate(YFSPoint v1, YFSPoint v2) { 76. return make(v1.x * v2.x + v1.y * v2.y, v1.y * v2.x - v1.x * v2.y); 77. } 78. public static YFSPoint lerp(YFSPoint a, YFSPoint b, float alpha) { 79. return add(mul(a, 1.0F - alpha), mul(b, alpha)); 80. } 81. public static YFSPoint slerp(YFSPoint a, YFSPoint b, flo at t) { 82. float omega = (float) Math.acos(dot(a, b)); 83. 84. if (omega != 0.0F) { 85. float denom = 1.0F / (float) Math.sin(omega); 86. return add(mul(a, (float) Math.sin((1.0F - t) * omega) * denom), 87. mul(b, (float) Math.sin(t * omega) * denom)); 88. } 89. return a; 90. } 91. public static boolean fuzzyEqual(YFSPoint a, YFSPoint b, float var) { 92. return (a.x - var <= b.x) && (b.x <= a.x + var) && ( a.y - var <= b.y) 93. && (b.y <= a.y + var); 94. } 95. public static boolean lineIntersect(YFSPoint p1, YFSPoi nt p2, YFSPoint p3, 96. YFSPoint p4, float[] st) { 97. YFSPoint p13 = sub(p1, p3); 98. YFSPoint p43 = sub(p4, p3); 99. 100. YFSPoint zero = makeZero(); 101. if (fuzzyEqual(p43, zero, 1.192093E-07F)) { 102. return false; 103. } 104. YFSPoint p21 = sub(p2, p1); 105. 106. if (fuzzyEqual(p21, zero, 1.192093E-07F)) { 107. return false; 108. } 109. float d1343 = dot(p13, p43); 110. float d4321 = dot(p43, p21); 111. float d1321 = dot(p13, p21); 112. float d4343 = dot(p43, p43); 113. float d2121 = dot(p21, p21); 114. 115. float denom = d2121 * d4343 - d4321 * d4321; 116. if (Math.abs(denom) < 1.192093E-07F) 117. return false; 118. float numer = d1343 * d4321 - d1321 * d4343; 119. 120. st[0] = (numer / denom); 121. st[1] = ((d1343 + d4321 * st[0]) / d4343); 122. 123. return true; 124. } 125. public static float length(YFSPoint v) { 126. return (float) Math.sqrt(dot(v, v)); 127. } 128. public static float lengthsq(YFSPoint v) { 129. return dot(v, v); 130. } 131. public static float distancesq(YFSPoint v1, YFSPoint v2) { 132. return lengthsq(sub(v1, v2)); 133. } 134. public static boolean near(YFSPoint v1, YFSPoint v2, fl oat distance){ 135. return distancesq(v1, v2) < distance * distance; 136. } 137. public static float distance(YFSPoint v1, YFSPoint v2) { 138. return length(sub(v1, v2)); 139. } 140. public static YFSPoint normalize(YFSPoint v) { 141. return mul(v, 1.0F / length(v)); 142. } 143. public static YFSPoint toAngle(float a) { 144. return make((float) Math.cos(a), (float) Math.sin(a) ); 145. } 146. public static float toRadian(YFSPoint v) { 147. return (float) Math.atan2(v.y, v.x); 148. } 149.} 看似代兴稍微多一点~但是兴兴都兴兴~兴兴就包很个含了一点的x、y坐兴~所兴行的操作也主要包括了构造,加减乘除、兴度、距离数学运、角度等一些列操作~大多是一些算~由于篇幅兴系兴里我兴就不一一介兴了。如果你会兴在不希望兴兴兴些代兴~那兴在使用兴程中大家也明白兴些功能。 尺寸(YFSSize) 第二个数很你屏基本的据就是尺寸~因兴我兴在游兴兴兴中多地方需要使用尺寸~包括兴的尺寸~幕的尺寸等~既清然是尺寸就主要包括了兴度和高度~定兴如代兴兴1-5所示。 代兴兴清1-5,YFSSize兴兴 view plaincopy to clipboardprint? 1.public class YFSSize { 2. public float width; 3. public float height; 4. private YFSSize() { 5. this(0.0F, 0.0F); 6. } 7. //... 8. //由于篇幅兴系,中兴省略了部分重兴函数 9. public String toString() { 10. return "<" + this.width + ", " + this.height + ">"; 11. } 12.} 矩形(YFSRect) 有点和个构很吧构很数学确尺寸~要成兴行就兴兴了,兴兴兴~但是兴是需要一部分兴算~由于代兴的比兴多~由于代兴的有些多~后面我兴列出一部分有确将即助于大家理解的可,完整代兴在完善之后~我兴考兴兴会源。部分代兴如代兴兴清1-6所示。 代兴兴清1-6,YFSRect兴兴 view plaincopy to clipboardprint? 1.public class YFSRect { 2. public YFSPoint origin; 3. public YFSSize size; 4. private static YFSRect sRect = new YFSRect(); 5. private static YFSRect rRect = new YFSRect(); 6. public static YFSRect makeZero() { 7. return new YFSRect(); 8. } 9. public Object copy() { 10. return new YFSRect(this.origin.x, this.origin.y, this. size.width, 11. this.size.height); 12. } 13. //省略部分.. 14.} 兴里我兴兴兴兴了一兴个数象拷兴的函copy~可以用兴制一相同的兴来个象副本。 兴色(Color) 在Opengl中我兴可以使用多兴兴色方式~比如int和float~或者rgb模式,rgba模式等等~代兴兴清1-7所示~是我兴定兴的三兴兴色操作。 代兴兴清1-7,兴色兴兴 view plaincopy to clipboardprint? 1.public class YFSColor3B { 2. public int r; 3. public int g; 4. public int b; 5. public YFSColor3B() { 6. this.r = 255; 7. this.g = 255; 8. this.b = 255; 9. } 10. //... 11.} 12.public class YFSColor4B { 13. public static final int GL_SIZE = 4; 14. public int r; 15. public int g; 16. public int b; 17. public int a; 18. public YFSColor4B() { 19. this.r = (this.g = this.b = this.a = 255); 20. } 21. //... 22.} 23.public class YFSColor4F { 24. public float r; 25. public float g; 26. public float b; 27. public float a; 28. public YFSColor4F() { 29. this.r = (this.g = this.b = this.a = 1.0F); 30. } 31. //... 32.} 代兴中都省略了一些兴色的构造、兴兴兴色格式等操作。 四兴形(Quad) 四兴形的用兴就更多了~的兴兴兴等~兴兴你清1-8所示我兴分兴定兴了2D和3D的四兴形。 代兴兴清1-8,四兴形定兴 view plaincopy to clipboardprint? 1.public class YFSQuad2D { 2. public static final int GL_SIZE = 32; 3. public float tl_x; 4. public float tl_y; 5. public float tr_x; 6. public float tr_y; 7. public float bl_x; 8. public float bl_y; 9. public float br_x; 10. public float br_y; 11. public YFSQuad2D(float a, float b, float c, float d, flo at e, float f, 12. float g, float h) { 13. this.tl_x = a; 14. this.tl_y = b; 15. this.tr_x = c; 16. this.tr_y = d; 17. this.bl_x = e; 18. this.bl_y = f; 19. this.br_x = g; 20. this.br_y = h; 21. } 22. public YFSQuad2D() { 23. this(new float[] { 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0 .0F, 0.0F }); 24. } 25. //... 26.} 27.public class YFSQuad3D { 28. public static final int GL_SIZE = 48; 29. public float bl_x; 30. public float bl_y; 31. public float bl_z; 32. public float br_x; 33. public float br_y; 34. public float br_z; 35. public float tl_x; 36. public float tl_y; 37. public float tl_z; 38. public float tr_x; 39. public float tr_y; 40. public float tr_z; 41. public YFSQuad3D() { 42. this(new float[] { 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0 .0F, 0.0F, 43. 0.0F, 0.0F, 0.0F, 0.0F }); 44. } 45. public YFSQuad3D(float[] f) { 46. this(f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7], f[8], f[9 ], f[10], 47. f[11]); 48. } 49. //... 50.} 点精灵(YFSPointSprite) 兴据其兴就是点兴数将个个予兴色和尺寸~因此在使用兴我兴就可以直接使用兴点~比如例子系兴中的一点粒子等,其定兴如代兴兴清1-9所示。 代兴兴清1-9,YFSPointSprite定兴 view plaincopy to clipboardprint? 1.public class YFSPointSprite { 2. public float x; 3. public float y; 4. public float size; 5. public YFSColor4F colors = new YFSColor4F(); 6.} 兴点(YFSVertex3D) Opengl中每坐兴都是又个x、y、z构个成一3D空兴中的坐兴,所以每兴点也就都需要兴兴一据兴~兴点个个数构 的定兴如代兴代清1-10所示。 代兴兴清1-10,YFSVertex3D兴兴 view plaincopy to clipboardprint? 1.public class YFSVertex3D { 2. public static final int GL_SIZE = 12; 3. public float x; 4. public float y; 5. public float z; 6. public static YFSVertex3D makeZero() { 7. return new YFSVertex3D(0.0F, 0.0F, 0.0F); 8. } 9. public YFSVertex3D(float x, float y, float z) { 10. this.x = x; 11. this.y = y; 12. this.z = z; 13. } 14. public String toString() { 15. return "<" + this.x + ", " + this.y + ", " + this.z + ">"; 16. } 17.} 兴理兴兴参数(YFSTexParams)有了兴点~接下然就是兴兴了~我兴要在来当参数Opengl中兴制兴形就需要兴理将映射到指定的多兴形上去~因兴兴理兴兴的据定兴如代兴兴参数数清1-1所示。 代兴兴清1-11,YFSTexParams兴兴 view plaincopy to clipboardprint? 1.public class YFSTexParams implements YFSCopyable { 2. public int minFilter; 3. public int magFilter; 4. public int wrapS;//s兴(u) 5. public int wrapT;//t兴(v) 6. public YFSTexParams(int min, int mag, int s, int t) { 7. this.minFilter = min; 8. this.magFilter = mag; 9. this.wrapS = s; 10. this.wrapT = t; 11. } 12. public YFSTexParams copy() { 13. return new YFSTexParams(this.minFilter, this.magFi lter, this.wrapS, 14. this.wrapT); 15. } 16.} 混合(YFSBlendFunc) 有了兴兴功能~我兴在兴行多兴兴理当数映射兴就需要兴兴混合的方式了~混合据的定兴包括了目兴和源~然后兴行混合~定兴如代兴兴清1-12所示。 代兴兴清1-12:,YFSBlendFunc兴兴 public class YFSBlendFunc { view plaincopy to clipboardprint? 1. public int src;//源 2. public int dst;//目兴 3. public YFSBlendFunc(int s, int d) { 4. this.src = s; 5. this.dst = d; 6. } 7. public int getSrc() { 8. return this.src; 9. } 10. public int getDst() { 11. return this.dst; 12. } 13.} 附加(YFSBezierConfig~YFSAffineTransform) 附加的兴些兴了使我兴的引擎更加完善而已~包括了兴塞兴曲兴和放射兴兴~他兴的定兴也兴兴如代兴兴很清1-13所示~其中放射兴兴稍微兴兴一些~但是基本上都是一些数学运懂算~大家都能看。 代兴兴清1-13,YFSBezierConfig和YFSAffineTransform定兴 view plaincopy to clipboardprint? 1.public class YFSBezierConfig { 2. public YFSPoint startPosition; 3. public YFSPoint endPosition; 4. public YFSPoint controlPoint1; 5. public YFSPoint controlPoint2; 6.} 7.public class YFSAffineTransform implements Cloneable, Serializable, YFSCopyable { 8. private static final long serialVersionUID = 13309732105238 60834L; 9. public static final int TYPE_IDENTITY = 0; 10. public static final int TYPE_TRANSLATION = 1; 11. public static final int TYPE_UNIFORM_SCALE = 2; 12. public static final int TYPE_GENERAL_SCALE = 4; 13. public static final int TYPE_QUADRANT_ROTATION = 8; 14. public static final int TYPE_GENERAL_ROTATION = 16; 15. public static final int TYPE_GENERAL_TRANSFORM = 32; 16. public static final int TYPE_FLIP = 64; 17. public static final int TYPE_MASK_SCALE = TYPE_UNIFORM_SCALE | TYPE_GENERAL_SCALE; 18. public static final int TYPE_MASK_ROTATION = TYPE_QUADRANT_ROTATION | TYPE_GENERAL_ROTATION; 19. static final int TYPE_UNKNOWN = -1; 20. static final double ZERO = 1.0E-10D; 21. public double m00; 22. public double m10; 23. public double m01; 24. public double m11; 25. public double m02; 26. public double m12; 27. transient int type; 28. public static YFSAffineTransform makeIdentity() { 29. return new YFSAffineTransform(); 30. } 31. public YFSAffineTransform() { 32. this.type = TYPE_IDENTITY; 33. this.m00 = (this.m11 = 1.0D); 34. this.m10 = (this.m01 = this.m02 = this.m12 = 0.0D); 35. } 36. //... 37.} 那兴兴于兴引擎所使用的据兴型就介兴到兴里~下面我兴兴大家介兴兴引擎的常兴理模兴。数将异 异常兴理 异当异当常兴理其兴就是兴一些兴以兴兴的兴兴兴行捕捉~然兴些常兴理也就是我兴自己定兴的一些兴兴兴型~我兴在代兴中兴兴可能存在兴兴常兴~就异个异即个异抛出一常可。我兴可以自己定兴一常兴理的兴~然后兴承自Exception或者其子兴可。因此兴里我兴兴一例兴如何兴兴常兴理~就不兴兴引擎的所有常兴理兴行介兴了~下面我兴看一即个来异异来 个冲区异兴兴常的定兴如代兴兴兴清1-14所示。 代兴兴清1-14,FrameBufferException兴兴 view plaincopy to clipboardprint? 1.public class FrameBufferException extends RuntimeException { 2. private static final long serialVersionUID = - 2356196710764217179L; 3. public FrameBufferException(String reason) { 4. super(reason); 5. } 6.} 其中包括一个UID~然后一个构数参数异造函~其兴是我兴抛出的常信息。在使用兴我兴就可以直接使用new FrameBufferException("test Exception")即很吧学另个可。兴兴。那兴我兴就不多浪兴大家的兴兴~下面兴本兴一兴要点~也是游兴引擎必不可少的模兴。 事件兴理 要兴理事件~我兴首先需要明确Ophone平台中包含哪些事件需要被兴理,兴里我兴列兴一下~主要兴兴包括,兴兴事件、触摸事件、兴感器(加速器)事件等。 下面我兴的思路是每一事件将个装个个来封兴一接口~然后完成一兴助兴兴理所有的事件~兴理兴程兴~兴游兴中所有的元素能兴兴的事件兴行兴兴~然后可以兴每一元素的事件兴行兴理~也可以触个个当指定兴理某事件。返回兴true兴表示兴次事件兴理完成。 下面我兴首先需要构造每一兴事件的接口。 兴兴事件 兴兴事件主要分兴兴两,分兴是兴兴按下,兴兴抬起,因此我兴可以兴兴如代兴兴清1-15所示的兴兴事件接口. 代兴兴清1-15,兴兴事件接口 view plaincopy to clipboardprint? 1.public abstract interface IKeyHandler { 2. //按下 3. public abstract boolean yfsKeyDown(KeyEvent paramKeyEve nt); 4. //抬起 5. public abstract boolean yfsKeyUp(KeyEvent paramKeyEvent); 6.} 7.public class PriorityKeyHandler implements IKeyHandler { 8. private IKeyHandler mHandler; 9. private int mPriority; 10. public IKeyHandler getWrappedHandler() { 11. return this.mHandler; 12. } 13. public int getPriority() { 14. return this.mPriority; 15. } 16. public void setPriority(int prio) { 17. this.mPriority = prio; 18. } 19. public PriorityKeyHandler(IKeyHandler handler, int priority) { 20. this.mHandler = handler; 21. this.mPriority = priority; 22. } 23. public boolean yfsKeyDown(KeyEvent event) { 24. if (this.mHandler != null) 25. return this.mHandler.yfsKeyDown(event); 26. return false; 27. } 28. public boolean yfsKeyUp(KeyEvent event) { 29. if (this.mHandler != null) 30. return this.mHandler.yfsKeyUp(event); 31. return false; 32. } 33.} 然后兴事件添加了一兴先兴~兴兴方便定事件的兴先兴~我兴可以兴个将确置和取得兴兴先兴兴~兴行不同的兴理。 触摸事件 触儿摸事件比兴兴事件稍微兴兴一点~他需要包括4个数清接口函~分兴定兴如代兴兴1-16所示。 代兴兴清1-16,触摸事件接口 view plaincopy to clipboardprint? 1.public abstract interface ITouchHandler { 2. public abstract boolean yfsTouchesBegan(MotionEvent paramMotionEvent); 3. public abstract boolean yfsTouchesMoved(MotionEvent paramMotionEvent); 4. public abstract boolean yfsTouchesEnded(MotionEvent paramMotionEvent); 5. public abstract boolean yfsTouchesCancelled(MotionEvent paramMotionEvent); 6.} 7.public class PriorityTouchHandler implements ITouchHandler { 8. private ITouchHandler mHandler; 9. private int mPriority; 10. public ITouchHandler getWrappedHandler() { 11. return this.mHandler; 12. } 13. public int getPriority() { 14. return this.mPriority; 15. } 16. public void setPriority(int prio) { 17. this.mPriority = prio; 18. } 19. public PriorityTouchHandler(ITouchHandler handler, int priority) { 20. this.mHandler = handler; 21. this.mPriority = priority; 22. } 23. public boolean yfsTouchesBegan(MotionEvent event) { 24. if (this.mHandler != null) 25. return this.mHandler.yfsTouchesBegan(event); 26. return false; 27. } 28. public boolean yfsTouchesMoved(MotionEvent event) { 29. if (this.mHandler != null) 30. return this.mHandler.yfsTouchesMoved(event); 31. return false; 32. } 33. public boolean yfsTouchesEnded(MotionEvent event) { 34. if (this.mHandler != null) 35. return this.mHandler.yfsTouchesEnded(event); 36. return false; 37. } 38. public boolean yfsTouchesCancelled(MotionEvent event) { 39. if (this.mHandler != null) 40. return this.mHandler.yfsTouchesCancelled(event) ; 41. return false; 42. } 43.} 其中yfsTouchesBegan表示兴始触摸兴兴生~yfsTouchesMove表示触摸移兴兴程~ yfsTouchesEnded表示兴束摸触事件~yfsTouchesCancelled兴表四取消事件。 加速器 加速器的使用比兴少~兴里我兴也兴其兴行兴兴~定兴如代兴兴清1-17所示。 代兴兴清1-17,加速器事件兴兴 view plaincopy to clipboardprint? 1.public abstract interface IAccelerometerHandler { 2. //加速改兴兴兴 触 3. public abstract void yfsAccelerometerChanged(float paramFl oat1, 4. float paramFloat2, float paramFloat3); 5.} 事件兴度 兴里我兴兴了方便的兴理各兴事件~我兴所有事件将个来通兴一“事件兴度器”分派不同的事件兴兴兴的Handler兴行兴理。其兴兴如代兴兴清1-18所示。 代兴兴清1-18,EventDispatcher兴兴 view plaincopy to clipboardprint? 1.public class EventDispatcher implements SensorEventListener { 2. private CopyOnWriteArrayList mTouchH andlers; 3. private CopyOnWriteArrayList mKeyHandl ers; 4. private CopyOnWriteArrayList mAccel Handlers; 5. private boolean mDispatchEvents; 6. private SensorManager mSM; 7. private Sensor mAccelerometer; 8. private boolean mSensorRegistered; 9. private static EventDispatcher sInstance; 10. public boolean getDispatchEvents() { 11. return this.mDispatchEvents; 12. } 13. public void setDispatchEvents(boolean b) { 14. this.mDispatchEvents = b; 15. } 16. public static EventDispatcher getInstance() { 17. synchronized (EventDispatcher.class) { 18. if (sInstance == null) { 19. sInstance = new EventDispatcher(); 20. } 21. return sInstance; 22. } 23. } 24. protected EventDispatcher() { 25. this.mDispatchEvents = true; 26. this.mTouchHandlers = new CopyOnWriteArrayList(); 27. this.mKeyHandlers = new CopyOnWriteArrayList(); 28. this.mAccelHandlers = new CopyOnWriteArrayList(); 29. this.mSM = ((SensorManager) Director.getInstance(). getContext() 30. .getSystemService("sensor")); 31. if (this.mSM != null) 32. this.mAccelerometer = this.mSM.getDefaultSensor(1); 33. else 34. this.mAccelerometer = null; 35. } 36. //添加事件 触笔 37. private void addTouchHandler(PriorityTouchHandler handler) { 38. int i = 0; 39. for (PriorityTouchHandler h : this.mTouchHandlers) { 40. if (h.getPriority() > handler.getPriority()) { 41. ++i; 42. } 43. if (h.getWrappedHandler() == handler.getWrappedHandler()) 44. throw new RuntimeException( 45. "Handler already added to touch dispatcher."); 46. } 47. this.mTouchHandlers.add(i, handler); 48. } 49. //添加按兴事件 50. private void addKeyHandler(PriorityKeyHandler handler) { 51. int i = 0; 52. for (PriorityKeyHandler h : this.mKeyHandlers) { 53. if (h.getPriority() > handler.getPriority()) { 54. ++i; 55. } 56. if (h.getWrappedHandler() == handler.getWrappedHandler()) 57. throw new RuntimeException( 58. "Handler already added to touch dispatcher."); 59. } 60. this.mKeyHandlers.add(i, handler); 61. } 62. //添加TouchHandler 63. public void addTouchHandler(ITouchHandler handler) { 64. addTouchHandler(handler, 0); 65. } 66. public void addTouchHandler(ITouchHandler handler, in t prio) { 67. addTouchHandler(new PriorityTouchHandler(handler, prio)); 68. } 69. //添加KeyHandler 70. public void addKeyHandler(IKeyHandler handler) { 71. addKeyHandler(handler, 0); 72. } 73. public void addKeyHandler(IKeyHandler handler, int pri o) { 74. addKeyHandler(new PriorityKeyHandler(handler, prio)); 75. } 76. //添加AccelHandler 77. public void addAccelHandler(IAccelerometerHandler handler) { 78. this.mAccelHandlers.add(handler); 79. checkAccelHandlers(); 80. } 81. //兴兴AccelHandler 82. //没册有注Sensor兴就注兴兴 听册听 83. private void checkAccelHandlers() { 84. if (this.mAccelHandlers.isEmpty()) 85. if (this.mSensorRegistered) { 86. this.mSM.unregisterListener(this); 87. this.mSensorRegistered = false; 88. } else 89. this.mSensorRegistered = this.mSM.registerListener(this, 90. this.mAccelerometer, 1); 91. } 92. //下面4个数函分兴兴移除Handler 93. public void removeTouchHandler(ITouchHandler h) { 94. if (h == null) { 95. return; 96. } 97. for (PriorityTouchHandler handler : this.mTouchHandlers) 98. if (handler.getWrappedHandler() == h) { 99. this.mTouchHandlers.remove(handler); 100. return; 101. } 102. } 103. public void removeKeyHandler(IKeyHandler h) { 104. if (h == null) { 105. return; 106. } 107. for (PriorityKeyHandler handler : this.mKeyHandlers) 108. if (handler.getWrappedHandler() == h) { 109. this.mKeyHandlers.remove(handler); 110. return; 111. } 112. } 113. public void removeAccelHandler(IAccelerometerHandler h) { 114. this.mAccelHandlers.remove(h); 115. checkAccelHandlers(); 116. } 117. public void removeAllHandlers() { 118. this.mTouchHandlers.clear(); 119. this.mKeyHandlers.clear(); 120. this.mAccelHandlers.clear(); 121. checkAccelHandlers(); 122. } 123. //下面两个数来函用兴置兴先兴 124. public void setTouchPriority(int priority, ITouchHandler h) { 125. if (h == null) { 126. throw new RuntimeException("Got null touch handler"); 127. } 128. int i = 0; 129. for (PriorityTouchHandler handler : this.mTouchHandlers) { 130. if (handler.getWrappedHandler() == h) 131. break; 132. ++i; 133. } 134. if (i == this.mTouchHandlers.size()) { 135. throw new RuntimeException("Touch handler not found"); 136. } 137. PriorityTouchHandler handler = (PriorityTouchHandler) this.mTouchHandlers 138. .get(i); 139. if (handler.getPriority() != priority) { 140. handler.setPriority(priority); 141. this.mTouchHandlers.remove(handler); 142. addTouchHandler(handler); 143. } 144. } 145. public void setKeyPriority(int priority, IKeyHandler h) { 146. if (h == null) { 147. throw new RuntimeException("Got null key handler"); 148. } 149. int i = 0; 150. for (PriorityKeyHandler handler : this.mKeyHandlers) { 151. if (handler.getWrappedHandler() == h) 152. break; 153. ++i; 154. } 155. if (i == this.mKeyHandlers.size()) { 156. throw new RuntimeException("Key handler not found"); 157. } 158. PriorityKeyHandler handler = (PriorityKeyHandler) this.mKeyHandlers 159. .get(i); 160. if (handler.getPriority() != priority) { 161. handler.setPriority(priority); 162. this.mKeyHandlers.remove(handler); 163. addKeyHandler(handler); 164. } 165. } 166. //兴理事件 167. public boolean keyDown(KeyEvent event) { 168. if (this.mDispatchEvents) { 169. for (PriorityKeyHandler handler : this.mKeyHandlers) { 170. if (handler.yfsKeyDown(event)) { 171. return true; 172. } 173. } 174. } 175. return false; 176. } 177. public boolean keyUp(KeyEvent event) { 178. if (this.mDispatchEvents) { 179. for (PriorityKeyHandler handler : this.mKeyHandlers) { 180. if (handler.yfsKeyUp(event)) { 181. return true; 182. } 183. } 184. } 185. return false; 186. } 187. public void touchesBegan(MotionEvent event) { 188. if (this.mDispatchEvents) 189. for (PriorityTouchHandler handler : this.mTouchH andlers) 190. if (handler.yfsTouchesBegan(event)) 191. return; 192. } 193. public void touchesMoved(MotionEvent event) { 194. if (this.mDispatchEvents) 195. for (PriorityTouchHandler handler : this.mTouchH andlers) 196. if (handler.yfsTouchesMoved(event)) 197. return; 198. } 199. public void touchesEnded(MotionEvent event) { 200. if (this.mDispatchEvents) 201. for (PriorityTouchHandler handler : this.mTouchH andlers) 202. if (handler.yfsTouchesEnded(event)) 203. return; 204. } 205. public void touchesCancelled(MotionEvent event) { 206. if (this.mDispatchEvents) 207. for (PriorityTouchHandler handler : this.mTouchH andlers) 208. if (handler.yfsTouchesCancelled(event)) 209. return; 210. } 211. public void onAccuracyChanged(Sensor sensor, int accu racy) { 212. } 213. //Sensor操作 214. public void onSensorChanged(SensorEvent event) { 215. if (event.sensor.getType() == 1) 216. for (IAccelerometerHandler handler : this.mAccel Handlers) 217. handler.yfsAccelerometerChanged(event.values[0], 218. event.values[1], event.values[2]); 219. } 220.} 代兴兴然有点多~但是整兴兴兴程非常兴兴~其核心就是按兴、儿个将触个摸、加速器事件都分兴放入一 CopyOnWriteArrayList中~并指定不同的Handler~然后可以兴置事件不同的兴先兴~然后在兴兴的事件兴理函 数中通兴遍兴CopyOnWriteArrayList来个当兴理每一事件~事件兴理返回兴true兴兴束兴次事件兴理~反之兴兴兴兴行 下一事件的兴理。然后我兴在兴一些兴件和兴;个Layer,兴行封装属兴就可以兴其兴行事件兴理。所以兴兴比兴重要~于引擎所有事件的兴度器。 兴兴 本文主要兴Ophone平台中Opengl ES兴行了兴兴的介兴~然后兴我兴兴兴的游兴引擎的架兴兴行兴兴~即将框构重点兴兴放在Opengl窗体与口和渲染器的兴兴部分~后面我兴可以兴始兴游兴引擎的具模兴兴行兴兴兴兴~由于篇幅兴系~我兴尽清来帮量提供了代兴兴清来笔助兴行理解~同兴也加入了必要的注解~如有不楚的地方~兴迎信交流~兴里兴者提醒一下~兴之前需要了解一些学Opengl基兴和兴形知兴~由于分学会享兴兴的心情急切~兴免出兴一些疏忽或兴兴~兴望不吝兴,教
本文档为【01_OPhone平台2D游戏引擎实现——概述及框架&#46;doc】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_995397
暂无简介~
格式:doc
大小:152KB
软件:Word
页数:0
分类:生活休闲
上传时间:2017-11-13
浏览量:9