一个 android游戏框架 转载.doc_第1页
一个 android游戏框架 转载.doc_第2页
一个 android游戏框架 转载.doc_第3页
一个 android游戏框架 转载.doc_第4页
一个 android游戏框架 转载.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android 游戏框架 楼主 发表于 2011-7-13 08:50:22 | 查看: 1849| 回复: 16Android SDK中游戏示例代码的框架也剥出来共享给大家,自称为真正实用的游戏框架。已拿其开发过一款游戏,感觉还可以。 其主要“实用”之处在于: 1.框架整体很小,上手快,做大游戏的公司没多少,做小游戏的个人开发者铺天盖地,相比动则上升到引擎级的庞然大物,小型的框架更加实用,更加考虑大多数开发者的利益。 2.小不等于不完善,之所以剥SDK的游戏示例代码的框架出来,就是学习后发现它对于系统事件的处理比较完善,另外我个人还修正了它对于来电处理等异常事件不完美之处,使其更加完善。 R.layout.main 布局文件java代码: 1. 2.3. 10.11. 15.16. 19.20. 28.29. 30.31. 复制代码 Activity类java代码:1. package eoe.demo;2.3. import com.mstanford.gameframe.R;4. import android.app.Activity;5. import android.os.Bundle;6. import android.util.Log;7. import android.view.Menu;8. import android.view.MenuItem;9. import android.widget.TextView;10.11. public class GameActivity extends Activity 12.13. private GameSurfaceView gameSurfaceView;14. private GameThread gameThread;15.16. Override17. public void onCreate(Bundle savedInstanceState) 18. super.onCreate(savedInstanceState);19. setContentView(R.layout.main);20.21. gameSurfaceView = (GameSurfaceView) this.findViewById(R.id.gameview);22. gameThread = gameSurfaceView.getThread();23. gameSurfaceView.setTextView(TextView) findViewById(R.id.textview);24.25. if (savedInstanceState = null) 26. / 游戏第一次启动时,初始化游戏状态27. gameThread.doStart();28. Log.w(this.getClass().getName(), SIS is null);29. else 30. / 从其他应用界面切回游戏时,如果Activity重新创建,则恢复上次切出游戏时的各项数据31. gameThread.restoreState(savedInstanceState);32. Log.w(this.getClass().getName(), SIS is nonnull);33. 34. 35.36. /*37. * 当Activity被切换到后台时调用,存储Activity重新创建时需要恢复的游戏数据38. */39.40. Override41. protected void onSaveInstanceState(Bundle outState) 42. super.onSaveInstanceState(outState);43. gameThread.saveState(outState);44. Log.w(this.getClass().getName(), SIS called);45. 46.47. /*48. * 当Activity被切换到后台时调用,在这里对游戏做暂停的处理49. */50.51. Override52. protected void onPause() 53. super.onPause();54. / 暂停游戏55. gameSurfaceView.getThread().pause();56. 57.58. /*59. * 当Activity切换到前台时调用60. */61.62. Override63. protected void onResume() 64. super.onResume();65. / 游戏结束暂停状态,游戏正常进行66. gameSurfaceView.getThread().unpause();67. 68.69. /*70. * 创建游戏菜单71. */72.73. Override74. public boolean onCreateOptionsMenu(Menu menu) 75. / TODO Auto-generated method stub76. return super.onCreateOptionsMenu(menu);77. 78.79. /*80. * 定义游戏菜单的点击事件处理81. */82.83. Override84. public boolean onOptionsItemSelected(MenuItem item) 85. / TODO Auto-generated method stub86. return super.onOptionsItemSelected(item);87. 88.89. Override90. protected void onDestroy() 91. super.onDestroy();92. Log.v(this.getClass().getName(), onDestroy);93.94. /停止游戏95. gameThread.setRunning(false);96. boolean retry = true;97. while (retry) 98. try 99. /阻塞Activity的主线程直到游戏线程执行完100. gameThread.join();101. retry = false;102. catch (InterruptedException e) 103. 104. 105. 106.107. 复制代码SurfaceView类java代码:1. package eoe.demo;2.3. import android.content.Context;4. import android.os.Handler;5. import android.os.Message;6. import android.util.AttributeSet;7. import android.util.Log;8. import android.view.KeyEvent;9. import android.view.SurfaceHolder;10. import android.view.SurfaceView;11. import android.view.SurfaceHolder.Callback;12. import android.widget.TextView;13.14. public class GameSurfaceView extends SurfaceView implements Callback 15. private GameThread gameThread;16. private TextView textview;17.18. public GameSurfaceView(Context context, AttributeSet attrs) 19. super(context, attrs);20. SurfaceHolder holder = getHolder();21. holder.addCallback(this);22.23. gameThread = new GameThread(holder, context, new Handler() 24.25. Override26. public void handleMessage(Message m) 27. textview.setText(m.getData().getString(text);28. 29. );30.31. / 设置可获得焦点,确保能捕获到KeyEvent32. setFocusable(true);33. 34.35. /*36. * 获取一个Activity传来的View协助SurfaceView显示游戏视图,View的具体类型可以根据游戏需要来定37. */38.39. public void setTextView(TextView view) 40. this.textview = view;41. 42.43. public GameThread getThread() 44. return gameThread;45. 46.47. Override48. public boolean onKeyDown(int keyCode, KeyEvent event) 49. return gameThread.doKeyDown(keyCode, event);50. 51.52. Override53. public boolean onKeyUp(int keyCode, KeyEvent event) 54. return gameThread.doKeyUp(keyCode, event);55. 56.57. /*58. * 当SurfaceView得到或失去焦点时调用,使游戏暂停/恢复运行,59. */60.61. Override62. public void onWindowFocusChanged(boolean hasWindowFocus) 63. if (!hasWindowFocus) 64. gameThread.pause();65. else 66. gameThread.unpause();67. 68. 69.70. Override71. public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) 72. Log.v(this.getClass().getName(), surfaceChanged();73. gameThread.setSurfaceSize(width, height);74. gameThread.setRunning(true);75.76. if (gameThread.isAlive() 77. Log.v(this.getClass().getName(), unpause gameThread);78. gameThread.unpause();79. else 80. Log.v(this.getClass().getName(), start gameThread);81. gameThread.start();82. 83.84. 85.86. Override87. public void surfaceCreated(SurfaceHolder holder) 88. Log.v(this.getClass().getName(), surfaceCreated();89. 90.91. /*92. * 为防止surface还会被创建(比如来电)导致gameThread再次启动出现错误,且Activity的onPause方法中已做暂停处理,93. * 这边不对gameThread做处理94. * param holder95. */96.97. Override98. public void surfaceDestroyed(SurfaceHolder holder) 99. Log.v(this.getClass().getName(), surfaceDestroyed);100. 复制代码游戏线程类java代码:1. package eoe.demo;2.3. import android.content.Context;4. import android.graphics.Canvas;5. import android.os.Bundle;6. import android.os.Handler;7. import android.util.Log;8. import android.view.KeyEvent;9. import android.view.SurfaceHolder;10.11. public class GameThread extends Thread 12. / 游戏状态值:ready13. public final static int GS_READY = 0;14. /游戏线程每执行一次需要睡眠的时间15. private final static int DELAY_TIME = 100;16. /上下文,方便获取到应用的各项资源,如图片、音乐、字符串等17. private Context context;18. /与Activity其他View交互用的handler19. private Handler handler;20. /由SurfaceView提供的SurfaceHolder21. private SurfaceHolder surfaceHolder;22. /游戏线程运行开关23. private boolean running = false;24. /游戏状态25. private int gameState;26. /当前surface/canvas的高度,在surfaceChanged方法中被设置27. private int mCanvasHeight = 1;28. /当前surface/canvas的宽度,在surfaceChanged方法中被设置29. private int mCanvasWidth = 1;30.31. /*32. * 游戏是否暂停33. */34.35. private boolean isPaused = false;36. public GameThread(SurfaceHolder holder, Context context, Handler handler) 37. this.surfaceHolder = holder;38. this.context = context;39. this.handler = handler;40. 41.42. /*43. * 设置游戏状态44. * param mode 游戏状态45. */46.47. public void setState(int mode) 48. synchronized (surfaceHolder) 49. setState(mode, null);50. 51. 52.53. /*54. * 设置游戏状态55. * param mode 游戏状态56. * param message 设置游戏状态时的附加文字信息57. */58.59. public void setState(int mode, CharSequence message) 60. synchronized (surfaceHolder) 61. 62.63. 64.65. /*66. * 暂停游戏67. */68. public void pause() 69. synchronized (surfaceHolder) 70. isPaused = true;71. 72.73. 74.75. /*76. * 恢复运行游戏77. */78. public void unpause() 79. /如果游戏中有时间,别忘记应将其在这里调整到正常80. synchronized (surfaceHolder) 81. isPaused = false;82. 83. 84.85. /*86. * 当Activity因销毁而被重新创建时,在这里恢复游戏上次运行的数据87. * param saveState Activity传来的保存游戏数据的容器88. */89. public void restoreState(Bundle saveState) 90. 91.92. /*93. * 在Activity切到后台时保存游戏的数据94. * param outState 保存游戏数据的容器95. */96.97. public void saveState(Bundle outState)98. 99.100. /*101. * 设置游戏线程运行开关102. * param b 开/关103. */104.105. public void setRunning(boolean b) 106. running = b;107. 108.109. /*110. * 处理按下按键的事件111. * param keyCode 按键事件动作值112. * param msg 按键事件对象113. * return 是否处理完114. */115. public boolean doKeyDown(int keyCode, KeyEvent msg) 116. synchronized (surfaceHolder) 117. return false;118. 119. 120.121. /*122. * 处理弹起按键的事件123. * param keyCode 按键事件动作值124. * param msg 按键事件对象125. * return 是否处理完126. */127.128. public boolean doKeyUp(int keyCode, KeyEvent msg) 129. synchronized (surfaceHolder) 130. 131.132. return false;133. 134.135. /*136. * 设置surface/canvas的宽度和高度137. * param width 由SurfaceHolder传来的宽度138. * param height 由SurfaceHolder传来的高度139. */140.141. public void setSurfaceSize(int width, int height) 142. / synchronized to make sure these all change atomically143. synchron

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论