flash小游戏及flash片头等等的flash资源源码都是新丁flash资源网为大家提供娱乐和学习以及为相关flash工作者提供方面之门!
  首页 | 片头欣赏 | Banner 欣赏 | Flash 特效 | 网站欣赏 | 技术文档 | 视频教程 | 网页模板 | flash小游戏 | 源码下载 | 相关下载 | 声音下载 | 
  flash Action应用   您当前的位置是:首页 >> 技术文档 >> flash Action应用 >> 详细内容
Flash Actionscript教程:游戏中的碰撞检测
加入时间:2007-10-4  浏览:32   录入:启能Flash资源网   来源:网络

简单碰撞

下面是代码:
//把你舞台上的MC实例名放入数组,测试
var ballA:Array = [ball1, ball2, ball3, ball4, ball5];
//随机初始化每个MC的运动速度和方向
for (var i = 0; i<ballA.length; i++) {
ballA.dx = 11*rand1_1();
ballA.dy = 7*rand1_1();
}
//随机产生1或-1
function rand1_1():Number {
return random(2) ? -1 : 1;
}
Stage.scaleMode = "noScale";
Stage.align = "TL";
var sw:Number = Stage.width;
var sh:Number = Stage.height;
var stageListener:Object = new Object();
//舞台大小改变时,重置sw、sh
stageListener.onResize = function() {
sw = Stage.width;
sh = Stage.height;
};
Stage.addListener(stageListener);
onEnterFrame = function () {
for (var i = 0; i<ballA.length; i++) {
  //检测所有MC之间是否有碰撞,有就根据情况改变“增量”方向
  for (var j = i+1; j<ballA.length; j++) {
   if (ballA.hitTest(ballA[j])) {
    mc12(ballA, ballA[j]);
    ballA._x += ballA.dx;
    ballA[j]._x += ballA[j].dx;
    ballA._y += ballA.dy;
    ballA[j]._y += ballA[j].dy;
   }
  }
  //如果到了边界,就反射
  if ((ballA._x<ballA._width/2 && ballA.dx<0) or (ballA._x>sw-ballA._width/2 && ballA.dx>0)) {
   ballA.dx *= -1;
  }
  if ((ballA._y<ballA._height/2 && ballA.dy<0) or (ballA._y>sh-ballA._height/2 && ballA.dy>0)) {
   ballA.dy *= -1;
  }
  //移动一个“增量”          
  ballA._x += ballA.dx;
  ballA._y += ballA.dy;
}
};
//碰撞函数,根据两球碰撞方向和自身运动方向合成新的增量值
function mc12(mc1:MovieClip, mc2:MovieClip) {
var ang:Number = Math.atan2(mc2._y-mc1._y, mc2._x-mc1._x);
var ang1:Number = Math.atan2(mc1.dy, mc1.dx);
var ang2:Number = Math.atan2(mc2.dy, mc2.dx);
var r1:Number = (mc1.dy/Math.sin(ang1))*Math.cos(ang-ang1);
var r2:Number = (mc2.dy/Math.sin(ang2))*Math.cos(ang-ang2);
var dx1:Number = r1*Math.cos(ang)+r2*Math.cos(ang);
var dy1:Number = r1*Math.sin(ang)+r2*Math.sin(ang);
mc1.dx = -mc1.dx+dx1;
mc1.dy = -mc1.dy+dy1;
mc2.dx = -mc2.dx+dx1;
mc2.dy = -mc2.dy+dy1;
}

  加入反弹效果

  代码:

//把你舞台上的MC实例名放入数组,测试
var ballA:Array = [ball1, ball2, ball3, ball4, ball5];
//随机初始化每个MC的运动速度和方向
for (var i = 0; i<ballA.length; i++) {
ballA[i].dx = 5*rand1_1();
ballA[i].dy = 5*rand1_1();
ballA[i].N=i;
}
//随机产生1或-1
function rand1_1():Number {
return random(2) ? -1 : 1;
}
Stage.scaleMode = "noScale";
Stage.align = "TL";
var sw:Number = Stage.width;
var sh:Number = Stage.height;
var stageListener:Object = new Object();
//舞台大小改变时,重置sw、sh
stageListener.onResize = function() {
sw = Stage.width;
sh = Stage.height;
};
Stage.addListener(stageListener);
onEnterFrame = function () {
for (var i = 0; i<ballA.length; i++) {
  //如果到了边界,就反射
  if ((ballA[i]._x<ballA[i]._width/2 && ballA[i].dx<0) or (ballA[i]._x>sw-ballA[i]._width/2 && ballA[i].dx>0)) {
   ballA[i].dx *= -1;
  }
  if ((ballA[i]._y<ballA[i]._height/2 && ballA[i].dy<0) or (ballA[i]._y>sh-ballA[i]._height/2 && ballA[i].dy>0)) {
   ballA[i].dy *= -1;
  }
  //检测所有MC之间是否有碰撞,有就根据情况改变“增量”方向
  for (var j = i+1; j<ballA.length; j++) {
   if (myHitTest(ballA[i],ballA[j])) {
   //if (ballA[i].hitTest(ballA[j])) {
    mc12(ballA[i], ballA[j]);
    ballA[i]._x += ballA[i].dx;
    ballA[j]._x += ballA[j].dx;
    ballA[i]._y += ballA[i].dy;
    ballA[j]._y += ballA[j].dy;
   }
  }
  //移动一个“增量”          
  ballA[i]._x += ballA[i].dx;
  ballA[i]._y += ballA[i].dy;
}
updateAfterEvent();
};
//碰撞函数,根据两球碰撞方向和自身运动方向合成新的增量值
function mc12(mc1:MovieClip, mc2:MovieClip) {
//碰撞角
var ang:Number = Math.atan2(mc2._y-mc1._y, mc2._x-mc1._x);
//运动角
var ang1:Number = Math.atan2(mc1.dy, mc1.dx);
var ang2:Number = Math.atan2(mc2.dy, mc2.dx);
//反射角
var _ang1:Number = 2*ang-ang1-Math.PI;
var _ang2:Number = 2*ang-ang2-Math.PI;
//运动矢量
var r1:Number=Math.sqrt(mc1.dx*mc1.dx+mc1.dy*mc1.dy);
var r2:Number=Math.sqrt(mc2.dx*mc2.dx+mc2.dy*mc2.dy);
//碰撞矢量
var a1:Number = (mc1.dy/Math.sin(ang1))*Math.cos(ang-ang1);
var a2:Number = (mc2.dy/Math.sin(ang2))*Math.cos(ang-ang2);
//碰撞矢量合成
var dx1:Number = a1*Math.cos(ang)+a2*Math.cos(ang);
var dy1:Number = a1*Math.sin(ang)+a2*Math.sin(ang);
//碰撞后的增量
mc1.dx = r1*Math.cos(_ang1)+dx1;
mc1.dy = r1*Math.sin(_ang1)+dy1;
mc2.dx = r2*Math.cos(_ang2)+dx1;
mc2.dy = r2*Math.sin(_ang2)+dy1;
}
//碰撞侦测
function myHitTest(mc1:MovieClip,mc2:MovieClip):Boolean{
var a:Number=Math.sqrt((mc1._x-mc2._x)*(mc1._x-mc2._x)+(mc1._y-mc2._y)*(mc1._y-mc2._y));
if(a-5<=(mc1._width+mc2._width)/2){
  return true;
}else{
  return false;
}
}

  带旋转效果:

  代码:

//把你舞台上的MC实例名放入数组,测试
var ballA:Array = [ball1, ball2, ball3, ball4, ball5];
//随机初始化每个MC的运动速度、方向、旋转
for (var i = 0; i<ballA.length; i++) {
ballA[i].dx = 5*rand1_1();
ballA[i].dy = 5*rand1_1();
ballA[i].dr = 0;//增加旋转属性
ballA[i].N=i;//球编号
}
//随机产生1或-1
function rand1_1():Number {
return random(2) ? -1 : 1;
}
//舞台属性
Stage.scaleMode = "noScale";
Stage.align = "TL";
var sw:Number = Stage.width;
var sh:Number = Stage.height;
var stageListener:Object = new Object();
//舞台大小改变时,重置sw、sh
stageListener.onResize = function() {
sw = Stage.width;
sh = Stage.height;
};
Stage.addListener(stageListener);
//------
onEnterFrame = function () {
for (var i = 0; i<ballA.length; i++) {
  //如果到了边界,就反射
  if (ballA[i]._x<ballA[i]._width/2 && ballA[i].dx<0) {
   ballA[i].dx *= -1;
   ballA[i].dr += ballA[i].dy;
  }
  if (ballA[i]._x>sw-ballA[i]._width/2 && ballA[i].dx>0) {
   ballA[i].dx *= -1;
   ballA[i].dr += -ballA[i].dy;
  }
  if (ballA[i]._y<ballA[i]._height/2 && ballA[i].dy<0) {
   ballA[i].dy *= -1;
   ballA[i].dr += -ballA[i].dx;
  }
  if (ballA[i]._y>sh-ballA[i]._height/2 && ballA[i].dy>0) {
   ballA[i].dy *= -1;
   ballA[i].dr += ballA[i].dx;
  }
  //检测所有MC之间是否有碰撞,有就根据情况改变“增量”方向
  for (var j = i+1; j<ballA.length; j++) {
   if (myHitTest(ballA[i],ballA[j])) {
   //if (ballA[i].hitTest(ballA[j])) {
    mc12(ballA[i], ballA[j]);
    ballA[i]._x += ballA[i].dx;
    ballA[j]._x += ballA[j].dx;
    ballA[i]._y += ballA[i].dy;
    ballA[j]._y += ballA[j].dy;
   }
  }
  //移动一个“增量”          
  ballA[i]._x += ballA[i].dx;
  ballA[i]._y += ballA[i].dy;
  ballA[i]._rotation += ballA[i].dr;
  ballA[i].dr -= ballA[i].dr*0.01;

};
//碰撞函数,根据两球碰撞方向和自身运动方向合成新的增量值
function mc12(mc1:MovieClip, mc2:MovieClip) {
//碰撞角
var ang:Number = Math.atan2(mc2._y-mc1._y, mc2._x-mc1._x);
//运动角
var ang1:Number = Math.atan2(mc1.dy, mc1.dx);
var ang2:Number = Math.atan2(mc2.dy, mc2.dx);
//反射角
var _ang1:Number = 2*ang-ang1-Math.PI;
var _ang2:Number = 2*ang-ang2-Math.PI;
//运动矢量
var r1:Number=Math.sqrt(mc1.dx*mc1.dx+mc1.dy*mc1.dy);
var r2:Number=Math.sqrt(mc2.dx*mc2.dx+mc2.dy*mc2.dy);
//碰撞矢量
var a1:Number = (mc1.dy/Math.sin(ang1))*Math.cos(ang-ang1);
var a2:Number = (mc2.dy/Math.sin(ang2))*Math.cos(ang-ang2);
//碰撞矢量合成
var dx1:Number = a1*Math.cos(ang)+a2*Math.cos(ang);
var dy1:Number = a1*Math.sin(ang)+a2*Math.sin(ang);
//旋转矢量,这里还有点问题,旋转方向有时不对。
mc1.dr += r1*Math.sin(ang-ang1);
mc2.dr += r2*Math.sin(ang-ang2);
//碰撞后的增量
mc1.dx = r1*Math.cos(_ang1)+dx1;
mc1.dy = r1*Math.sin(_ang1)+dy1;
mc2.dx = r2*Math.cos(_ang2)+dx1;
mc2.dy = r2*Math.sin(_ang2)+dy1;
}
//碰撞侦测
function myHitTest(mc1:MovieClip,mc2:MovieClip):Boolean{
var a:Number=Math.sqrt((mc1._x-mc2._x)*(mc1._x-mc2._x)+(mc1._y-mc2._y)*(mc1._y-mc2._y));
if(a-2<=(mc1._width+mc2._width)/2){
  return true;
}else{
  return false;
}
}

关于我们 | 联系方式 | 广告赞助 | 免责声明 | 站点留言 | 友情链接 | 推荐站点
Copyright 2007-2008 新丁flash资源网 All Rights Reserved
本站版权所有 新丁flash资源网 保留所有权利 未经许可请勿任意转载或复制使用 
请使用1024*768分辨率浏览本站以达到浏览新丁flash资源网的最佳视觉效果
新丁flash资源网中所有的解压密码均为:www.qnflash.com
粤ICP备08010396号