圆形碰撞:主要是利用两圆形的圆心距进行判定的;当两圆的圆心距小于两圆半径之和,判定发生了碰撞。
创建实例:CircleCollsoin
项目效果图:
MySurfaceView.java
创建实例:CircleCollsoin
项目效果图:
MySurfaceView.java
2.package com.circleCollsion; 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 r1 = 20, r2 = 20; 27.private int x1 = 50, y1 = 100, x2 = 150, y2 = 100; 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.drawCircle(x1, y1, r1, paint); 80. canvas.drawCircle(x2, y2, r2, paint); 81. } 82. }catch(Exception e){ 83. 84. }finally{ 85. if(canvas != null) 86. sfh.unlockCanvasAndPost(canvas); 87. } 88.} 89./** 90. * 触屏事件监听 91. */ 92.@Override 93.public boolean onTouchEvent(MotionEvent event) { 94. // TODO Auto-generated method stub 95. x1 = (int) event.getX(); 96. y1 = (int) event.getY() ; 97. //当圆形之间发生碰撞 98. if(isCollsionWithCircle(x1,y1,x2,y2,r1,r2)){ 99. isCollsion = true;//设置标志位为真 100. //当矩形之间没有发生碰撞 101. }else{ 102. isCollsion = false; //设置标志位为假 103. } 104. return true; 105.} 106./** 107. * 圆形碰撞 108. * @param x1圆形1的圆心x坐标 109. * @param y1圆形1的圆心y坐标 110. * @param x2圆心2的圆形x坐标 111. * @param y2圆形2的圆形y坐标 112. * @param r1圆形1的半径 113. * @param r2圆形2的半径 114. */ 115.private boolean isCollsionWithCircle(int x1,int y1,int x2,int y2,int r1,int r2){ 116. //Math.sqrt:开平方 117. //Math.pow(double x,double y):X的Y次方 118. if(Math.sqrt(Math.pow(x1 - x2, 2)+ Math.pow(y1 - y2,2))<= r1 + r2){ 119. //如果两圆的圆心距小于或等于两圆半径则认为发生碰撞 120. return true; 121. } 122. return false; 123.} 124. 125./** 126. * 按键事件监听 127. */ 128.@Override 129.public boolean onKeyDown(int keyCode, KeyEvent event) { 130. // TODO Auto-generated method stub 131. return super.onKeyDown(keyCode, event); 132.} 133./** 134. * 游戏逻辑 135. */ 136.private void logic(){ 137. 138.} 139.@Override 140.public void run() { 141. // TODO Auto-generated method stub 142. while(flag){ 143. long start = System.currentTimeMillis(); 144. myDraw(); 145. logic(); 146. long end = System.currentTimeMillis(); 147. try { 148. if (end - start < 50) { 149. Thread.sleep(50 - (end - start)); 150. } 151. } catch(InterruptedException e){ 152. e.printStackTrace(); 153. } 154. } 155. 156.} 157./** 158. * Surfaceview视图状态发生改变,响应此函数 159. */ 160.@Override 161.public void surfaceChanged(SurfaceHolder holder, int format, int width, 162. int height) { 163. // TODO Auto-generated method stub 164. 165.} 166./** 167. * Surfaceview视图消亡,响应此函数 168. */ 169.@Override 170.public void surfaceDestroyed(SurfaceHolder holder) { 171. // TODO Auto-generated method stub 172. 173.} 174.}