矩形碰撞就是利用两个矩形之间的位置关系来进行判断,如果一个矩形的像素在另外一个矩形之中,或者之上都可以认为这两个矩形发生了碰撞。其实两个矩形不发生碰撞的情况就只有四种,其他情况就是发生碰撞了
创建实例: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. //用于控制SurfaceView 14. 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. //实例SurfaceHolder 37. 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. @Override 48. public void surfaceCreated(SurfaceHolder holder) { 49. // TODO Auto-generated method stub 50. 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. @Override 94. public boolean onTouchEvent(MotionEvent event) { 95. // TODO Auto-generated method stub 96. //让矩形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. @Override 140. public boolean onKeyDown(int keyCode, KeyEvent event) { 141. // TODO Auto-generated method stub 142. return super.onKeyDown(keyCode, event); 143. } 144. /** 145. * 游戏逻辑 146. */ 147.private void logic(){ 148. 149. } 150. @Override 151. public void run() { 152. // TODO Auto-generated method stub 153. 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. @Override 172. public void surfaceChanged(SurfaceHolder holder, int format, int width, 173. int height) { 174. // TODO Auto-generated method stub 175. 176. } 177. /** 178. * Surfaceview视图消亡,响应此函数 179. */ 180. @Override 181. public void surfaceDestroyed(SurfaceHolder holder) { 182. // TODO Auto-generated method stub 183. 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. @Override 10. 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.
1万+

被折叠的 条评论
为什么被折叠?



