android 矩形碰撞
来源:互联网 发布:网络电视播放器排行 编辑:程序博客网 时间:2024/05/16 10:23
矩形碰撞就是利用两个矩形之间的位置关系来进行判断,如果一个矩形的像素在另外一个矩形之中,或者之上都可以认为这两个矩形发生了碰撞。其实两个矩形不发生碰撞的情况就只有四种,其他情况就是发生碰撞了
创建实例:RectCollion, 游戏框架为SurfaceView
项目效果图:
MySurfaceView.java
RectCollsionActivity.java
创建实例:RectCollion, 游戏框架为SurfaceView
项目效果图:
MySurfaceView.java
1.2.package com.rectCollsion;3.import android.content.Context;4.import android.graphics.Canvas;5.import android.graphics.Color;6.import android.graphics.Paint;7.import android.view.KeyEvent;8.import android.view.MotionEvent;9.import android.view.SurfaceHolder;10.import android.view.SurfaceHolder.Callback;11.import android.view.SurfaceView;12.public class MySurfaceView extends SurfaceView implements Callback,Runnable{13. //用于控制SurfaceView14. private SurfaceHolder sfh;15. //声明一个画笔16.private Paint paint;17. //声明一个线程18.private Thread th;19. //线程消亡的标志位20.private boolean flag;21. //声明一个画布22.private Canvas canvas;23. //声明屏幕的宽高24.private int screenW,screenH;25. //定义两个矩形的宽高坐标26.private int x1 = 10,y1 = 110,w1 = 40,h1 = 40;27. private int x2 = 10,y2 = 110,w2 = 40,h2 = 40;28. //便于观察是否发生碰撞设置一个标识位29.private boolean isCollsion;30.31. /**32. * SurfaceView初始化函数33. */34.public MySurfaceView(Context context){35. super(context);36. //实例SurfaceHolder37. sfh = this.getHolder();38. //为SurfaceView添加状态监听39. sfh.addCallback(this);40. //实例一个画笔41. paint = new Paint();42. //设置画笔颜色为白色43. paint.setColor(Color.WHITE);44. //设置焦点45. setFocusable(true);46. }47. @Override48. public void surfaceCreated(SurfaceHolder holder) {49. // TODO Auto-generated method stub50. screenW = this.getWidth();51. screenH = this.getHeight();52. flag = true;53. //实例线程54. th = new Thread(this);55. //启动线程56. th.start();57. }58.59.60. /**61. * 游戏绘图62. */63.public void myDraw(){64. try {65. canvas = sfh.lockCanvas();66. if(canvas != null){67. //刷屏68. canvas.drawColor(Color.BLACK);69. //判断是否发生了碰撞70. if(isCollsion){//发生碰撞71. paint.setColor(Color.RED);72. paint.setTextSize(20);73. canvas.drawText("Collision!", 0, 30, paint);74. 75. } else{//没发生碰撞76. paint.setColor(Color.WHITE);77. }78. //绘制两个矩形79. canvas.drawRect(x1, y1, x1 + w1, y1 + h1, paint);80. canvas.drawRect(x2, y2, x2 + w2, y2 + h2, paint);81. 82. }83. }catch(Exception e){84. 85. }finally{86. if(canvas != null)87. sfh.unlockCanvasAndPost(canvas);88. }89. }90. /**91. * 触屏事件监听92. */93. @Override94. public boolean onTouchEvent(MotionEvent event) {95. // TODO Auto-generated method stub96. //让矩形1随着触屏位置移动(触屏点设为此矩形的中心点)97. x1 = (int) event.getX() - w1/2;98. y1 = (int) event.getY() - h1/2;99. //当矩形之间发生碰撞100. if(isCollsionWithRect(x1,y1,w1,h1,x2,y2,w2,h2)){101. isCollsion = true;//设置标志位为真102. //当矩形之间没有发生碰撞103. }else{104. isCollsion = false; //设置标志位为假105. }106. return true;107. }108. /**109. * 矩形碰撞的函数110. * @param x1 第一个矩形的X坐标111. * @param y1 第一个矩形的Y坐标112. * @param w1 第一个矩形的宽113. * @param h1 第一个矩形的高114. * @param x2 第二个矩形的X坐标115. * @param y2 第二个矩形的Y坐标116. * @param w2 第二个矩形的宽117. * @param h2 第二个矩形的高118. */119.public boolean isCollsionWithRect(int x1,int y1,int w1,int h1,int x2,int y2,int w2,int h2){120. //当矩形1位于矩形2的左侧121. if (x1 >= x2 && x1>= x2 + w2){122. return false;123. //当矩形1位于矩形2的右侧124. } else if (x1<= x2 && x1 + w1 <= x2){125. return false;126. //当矩形1位于矩形2的上方127. } else if (y1 >= y2 && y1>= y2 + h2){128. return false;129. } else if (y1 <= y2 && y1 + h1 <= y2){130. return false;131. }132. //所有不会发生碰撞都不满足时,肯定就是碰撞了133. return true;134. }135.136. /**137. * 按键事件监听138. */139. @Override140. public boolean onKeyDown(int keyCode, KeyEvent event) {141. // TODO Auto-generated method stub142. return super.onKeyDown(keyCode, event);143. }144. /**145. * 游戏逻辑146. */147.private void logic(){148. 149. }150. @Override151. public void run() {152. // TODO Auto-generated method stub153. while(flag){154. long start = System.currentTimeMillis();155. myDraw();156. logic();157. long end = System.currentTimeMillis();158. try {159. if (end - start < 50) {160. Thread.sleep(50 - (end - start));161. }162. } catch(InterruptedException e){163. e.printStackTrace();164. }165. }166. 167. }168. /**169. * Surfaceview视图状态发生改变,响应此函数170. */171. @Override172. public void surfaceChanged(SurfaceHolder holder, int format, int width,173. int height) {174. // TODO Auto-generated method stub175. 176. }177. /**178. * Surfaceview视图消亡,响应此函数179. */180. @Override181. public void surfaceDestroyed(SurfaceHolder holder) {182. // TODO Auto-generated method stub183. 184. }185.}
1.2.package com.rectCollsion;3.import android.app.Activity;4.import android.os.Bundle;5.import android.view.Window;6.import android.view.WindowManager;7.public class RectCollsionActivity extends Activity {8. /** Called when the activity is first created. */9. @Override10. public void onCreate(Bundle savedInstanceState) {11. super.onCreate(savedInstanceState);12. this.requestWindowFeature(Window.FEATURE_NO_TITLE);13. this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 14. WindowManager.LayoutParams.FLAG_FULLSCREEN);15. setContentView(new MySurfaceView(this));16. }17.}18.
0 0
- android 矩形碰撞
- 矩形碰撞
- Android碰撞检测——矩形检查
- android 学习:多矩形碰撞检测
- android 线段与矩形碰撞检测
- 矩形与矩形碰撞2
- Android碰撞检测——多矩形检查
- Android碰撞检测——多矩形检查
- Android中判断矩形和圆的碰撞
- 矩形碰撞检测
- 矩形检测碰撞算法
- 矩形碰撞检测
- 圆,矩形碰撞检测
- cocos2d-x:矩形碰撞
- 矩形打印和碰撞
- 矩形圆形碰撞检查
- 矩形判断碰撞
- 碰撞检测算法:点和矩形碰撞、矩形碰撞
- c语言lesson02
- Linux网络编程必看书籍推荐
- Web Service--java代码实现客户端编写---[小结]
- 使用Run-Time c 函数open的注意事项
- TCP/IP、Http、Socket的区别
- android 矩形碰撞
- shell变量的替换
- 盘点被App Store拒绝的79个原因
- Sun JDK自带JVM内存使用分析工具HProf
- 「leetCode」:Sort List
- 人工智能:互联网巨头全产业扩张的注脚
- 编写一个算法将顺序表A分成两部分,大于0 的在A的左边,小于0的在A的右边
- 出现“XXX“列名无效,请检查列名、数据表的情况
- easyUI中,前端Pagination,数据的收不到的问题,已解决