返回列表 回复 发帖

小球与自定义不规则物体的碰撞下落as3

  1. /*
  2. 原创flash教程尽在自娱自乐 www.MyGameMyLove.com
  3. smallerbird 2010-7-22 mygamemylove@qq.com
  4. 源码下载地址:http://www.mygamemylove.com/index.php?t=1&id=338

  5. 小球碰撞检测的原理:
  6. 就是以小球为圆形。以一定的角度旋转半径获得其端点的若干坐标(就是圆形线上的一些点,这里是用4度为单位旋转的。这样每次会检测90次,4*90=360),然后分别用hitTest(x,y,true)
  7. 进行碰撞检测,如果碰撞了,就速度方向取反。

  8. */
  9. //////////////////////////////////////////画线//////////////////////////////////////////
  10. import flash.filters.BlurFilter;
  11. import fl.events.ColorPickerEvent;
  12. //
  13. var _root:MovieClip=this;
  14. //画线滤镜
  15. var arrFilter:Array=new Array();
  16. var levelBevel = new flash.filters.BevelFilter(2, 45, 16777215, 100, 6710886, 100, 7, 7);
  17. arrFilter.push(levelBevel);
  18. var levelGlow = new flash.filters.GlowFilter(0, 100, 5, 5, 150);
  19. arrFilter.push(levelGlow);
  20. var dropB = new flash.filters.DropShadowFilter(1, 45, 0, 100, 0, 0);
  21. //画线的参数
  22. var lineSize:Number=20;
  23. var px:Number,py:Number;
  24. px=py=0;
  25. //画板
  26. var spPad:Sprite=new Sprite();
  27. spPad.x=spPad.y=0;
  28. spPad.filters=arrFilter;
  29. var GBrush:Graphics=spPad.graphics;
  30. //设置线色
  31. function setGBrush(numC:Number):void {
  32. //trace("setGBrush")
  33. GBrush.lineStyle(lineSize,numC,1);
  34. }
  35. setGBrush(0xff0000);
  36. _root.addChild(spPad);
  37. //拾色器
  38. function colorChange(e:Event):void {
  39. var cp:ColorPicker = e.target as ColorPicker;
  40. setGBrush(cp.selectedColor);
  41. }
  42. myColor.addEventListener(ColorPickerEvent.CHANGE, colorChange);
  43. myColor.selectedColor=0xff0000;
  44. //鼠标画线
  45. var isDown:Boolean=false;
  46. function mouse_down(e:MouseEvent):void {
  47. isDown=true;
  48. }
  49. function mouse_up(e:MouseEvent):void {
  50. isDown=false;
  51. px=py=0;
  52. }
  53. function mouse_move(e:MouseEvent):void {
  54. if (isDown) {
  55. //trace("move")
  56. var x0:Number=_root.mouseX;
  57. var y0:Number=_root.mouseY;
  58. if (px!=0&&py!=0) {
  59. GBrush.moveTo(px,py);
  60. } else {
  61. GBrush.moveTo(x0,y0);
  62. }
  63. GBrush.lineTo(x0,y0);
  64. px=x0;
  65. py=y0;
  66. }
  67. }
  68. stage.addEventListener(MouseEvent.MOUSE_DOWN,mouse_down);
  69. stage.addEventListener(MouseEvent.MOUSE_UP,mouse_up);
  70. stage.addEventListener(MouseEvent.MOUSE_MOVE,mouse_move);

  71. //////////////////////////////////////////小球运动//////////////////////////////////////////
  72. //碰撞目标
  73. var mcHit:Sprite=spPad;
  74. //是否开始运动
  75. var isGo:Boolean=false;
  76. //小球
  77. var spC:Sprite=new Sprite();
  78. var spCG:Graphics=spC.graphics;
  79. var r:Number=10;
  80. spCG.lineStyle(1);
  81. spCG.beginFill(0xff0000);
  82. spCG.drawCircle(0,0,r);
  83. spCG.endFill();
  84. //初使位置
  85. var iniX:Number=160
  86. var iniY:Number=160
  87. spC.x=iniX;
  88. spC.y=iniY;
  89. //Math.PI/180
  90. var oneHuDu:Number=0.017453;//
  91. //trace(Math.PI/180)
  92. //速度的一些参数
  93. var vx:Number=0;
  94. var vy:Number=0;
  95. var va:Number=1;
  96. var vg:Number=0.4;
  97. var vspeed:Number=0.5;
  98. //碰撞检测用的旋转度数
  99. var rSpeed:Number=4;
  100. var numChkCount:Number=360/rSpeed;
  101. /*
  102. 原创flash教程尽在自娱自乐 www.MyGameMyLove.com
  103. smallerbird 2010-7-22 mygamemylove@qq.com
  104. 源码下载地址:http://www.mygamemylove.com/index.php?t=1&id=338
  105. */
  106. //小球的循环
  107. function spC_enterFrame(e:Event):Boolean {
  108. if (!isGo) {
  109. return false;
  110. }
  111. var mcMe:Sprite=e.target as Sprite;
  112. var xTem:Number,yTem:Number;
  113. //碰撞检测
  114. for (var i:Number=1; i<=numChkCount; i++) {
  115. xTem=r*Math.cos(rSpeed*i*oneHuDu);
  116. yTem=r*Math.sin(rSpeed*i*oneHuDu);
  117. if (mcHit.hitTestPoint(mcMe.x+xTem,mcMe.y+yTem,true)) {
  118. //速度去反
  119. vx=-xTem*vspeed;
  120. vy=-yTem*vspeed;
  121. //reak;
  122. }
  123. }
  124. //运动
  125. vx*=va;
  126. vy*=va;
  127. vy+=vg;
  128. mcMe.x+=vx;
  129. mcMe.y+=vy;
  130. //
  131. if(mcMe.y>400){
  132. mcMe.x=iniX;
  133. mcMe.y=iniY;
  134. isGo=false
  135. vx=vy=0
  136. btnPlay.label="Play";
  137. }
  138. //
  139. return true;
  140. }
  141. spC.addEventListener(Event.ENTER_FRAME,spC_enterFrame);
  142. this.addChild(spC);
  143. //控制按钮
  144. //
  145. function fun_PlayBall(e:MouseEvent):void {
  146. var btnName:String=(e.target as Button).name;
  147. if (btnName=="btnPlay") {
  148. isGo=!isGo;
  149. if (isGo) {
  150. btnPlay.label="stop";
  151. } else {
  152. btnPlay.label="Play";
  153. }
  154. } else if (btnName=="btnBallLeft") {
  155. if (!isGo){
  156. spC.x-=5
  157. }

  158. } else if (btnName=="btnBallRight") {
  159. if (!isGo){
  160. spC.x+=5
  161. }
  162. }
  163. }
  164. btnPlay.addEventListener(MouseEvent.CLICK,fun_PlayBall);
  165. //
  166. btnBallLeft.addEventListener(MouseEvent.CLICK,fun_PlayBall);
  167. btnBallRight.addEventListener(MouseEvent.CLICK,fun_PlayBall);
复制代码
看了 不错不错!做游戏的一个好例子,里面的算法还是比较精妙的
不错的例子,赞一个!!
好东西  顶一下
返回列表