flash as3.0关于碰撞的检测

2025-05-08 06:10:06
推荐回答(3个)
回答(1):

  我觉得应该在主舞台写,毕竟这涉及到两个类
  一楼的思路是对的,就是语法有点问题,而且碰撞检测可以考虑用hitTestObject或hitTestPoint

  我之前给同学写过一个游戏,大量饼干人从右到左飞,玩家要碰到所有饼干人,不然就会减生命值,你可以参考一下这段代码(主要是懒得重新写了,以前写的这个注释很好)
  这里面碰撞和删除的代码都有了
  要注意if(bmList.length>0)这句,如果忘了这个条件,屏幕上没有子弹(数组为空)的时候就会出问题

  addEventListener(Event.ENTER_FRAME,always);
  function always(e:Event):void{
  //当屏幕上有饼干人的时候
  if(bmList.length>0){
  //控制所有的饼干人
  for(i=0;i  //饼干人向左飞
  bmList[i].x -= 5;

  //当饼干人飞出屏幕的时候
  if(bmList[i].x<-100)
  {
  //把饼干人删掉
  bg.removeChild(bmList.splice(i,1)[0]);
  //生命值减一
  life--;
  //更新显示生命值的text box
  ts.life.text = "Life: "+life;
  }

  //如果玩家碰到饼干人
  if(player.hitTestObject(bmList[i])){
  //把饼干人删掉
  bg.removeChild(bmList.splice(i,1)[0]);
  //分数加一
  mark++;
  //更新显示分数的text box
  ts.mark.text = "Mark: "+mark;
  }
  }
  }
  }

  以上是我程序的一部分,原代码太长,这里就不贴声明变量和创建mc的部分了
  如果有什么不懂的可以再问

回答(2):

我的解决办法是:
先定义一个数组:var aaa:array
然后在你把子弹复制到舞台上的时候:
aaa.push(你复制出来的mc) 意思就是一个mc被数组里面的一个元素装起来了
那么你控制数组里面的一个元素 就等于控制了一个mc
比如说:aaa[0].x=500 就是你第一个复制出来的 mc的x坐标 等于 500
如果你是在进入帧的时候判断的话,那么就是:
this.addEventListener(Event.ENTER_FRAME, fun);
function fun(event:Event):void{
for(var i:string in aaa){//这里的意思是aaa数组每个元素都经历一遍
var n=Math.abs(飞机.x-aaa[i].x)//绝对值
var m=Math.abs(飞机.y-aaa[i].y)
if(n<10&&m<10){//飞机和子弹的距离同时小于10,就算它们碰撞吧
//这里面就是 碰撞之后你想做的事情了,我猜你要做的事情是把复制出来的子弹移除,呵呵
}
}
}

回答(3):

Animate如何实现元件间碰撞检测(AS3)