你的分享就是我们的动力 ---﹥

小球的弹性碰撞

时间:2011-10-12 21:26来源:www.chengxuyuans.com 点击:

刚学AS3.0不久 练习做的一个AS实例与大家分享 有不足之处还望指正!看看效果:

http://www.68design.net/download/20087/20080715155628437.swf


方向键启动小球摆动。

新建一个Flash文档。

创建两个小球Ballblue、Ballred,一个直线line和一个背景颜色变化back的影片剪辑,并在其属性中输入相应的类名。如图:

小球与直线的效果可以自己设计。这里需要注意的是小球的位置不应在影片剪辑的中心点(那样小球就没有旋转的效果),小球应位于中心点正下方位置。具体的应考虑你所画的直线的长度。

关于背景颜色的变化,每一帧都指定不同的颜色。。。。如图:

在构造函数中就显示此对象,否则会出现背景覆盖小球的情况。。。。最后在Flash文档中最下方的文档类中输入类名,如图:

新建一个AS文件,输入以下代码,保存为hitball.as即可,并将Flash文档与此类文件放在同一文件夹中。。。。。。

以下是实现这一效果的类文件。。。

package
{
 //导入需要的类文件
 import flash.display.Sprite;
  import flash.ui.Keyboard;
 import flash.events.Event;
 import flash.events.KeyboardEvent;
 import flash.events.MouseEvent;
 import flash.media.Sound ;
 
 
 public class hitball extends Sprite
 {
 
  private var linered:line;
  private var lineblue:line;
  private var myballred:Ballred;
  private var myballblue:Ballblue;
  private var mybutton:myButton;
  private var myText:TextField;
  //定义一个碰撞声音
  private var mysoud:SWAP=new SWAP();
  //定义控制小球开始运动的变量
  private var red_vr:Number=0;
  private var blue_vr:Number=0;
  private var redback_vr:Number=0;
  private var blueback_vr:Number=0;
  private var red_ar:Number=0;
  private var blue_ar:Number=0;
  private var red_angle:Number=0;
  private var blue_angle:Number=0;
  //定义重力,摩擦力,你也可以更改这些数值看一下有何不同的效果
  private var hr:Number=0.2;
  private var gravity:Number=0.5;
  private var friction:Number=0.99;
  //定义小球在往返运动中的全局变量
  private var newblue_ar:Number=0;
  private var newblue_vr:Number=0;
  private var newred_ar:Number=0;
  private var newred_vr:Number=0;
  private var diguired:Number=0;
  private var diguiblue:Number=0;
 
  private var newbg:back;
  //构造函数
  public function hitball(){
   //---以下几行代码是每次运行Flash Player时随机产生背景颜色
  
   var backcolor:Number=Math.round(Math.random()*11);
   newbg=new back();
   newbg.x=0;
   newbg.y=0;
   this.addChild(newbg);
   newbg.gotoAndStop(backcolor);
   //调用drawBall()函数,在舞台显示所需要的对象
   drawBall();
   //添加侦听器
   stage.addEventListener(Event.ENTER_FRAME,Frame);
   stage.addEventListener(KeyboardEvent.KEY_DOWN,Keydown);
   stage.addEventListener(KeyboardEvent.KEY_UP,Keyup);
   //点击此按钮时,让所有对象回到初始状态,
   mybutton.addEventListener(MouseEvent.CLICK,newHit);
  
   }
  //这个函数作用是当点击按钮的时候影片进入初始时的状态
  private function newHit(event:MouseEvent)
  {
  
   //friction=myText.text;
   newred_ar=0;
   newblue_ar=0;
   red_vr=0;
   blue_vr=0;
   redback_vr=0;
   blueback_vr=0;
   red_ar=0;
   blue_ar=0;
  
   linered.rotation=0;
   myballred.rotation=0;
   lineblue.rotation=0;
   myballblue.rotation=0;
  
   stage.addEventListener(Event.ENTER_FRAME,Frame);
   stage.removeEventListener(Event.ENTER_FRAME,Framered);
   stage.removeEventListener(Event.ENTER_FRAME,Frameblue);
  
   }
   //控制小球运动。当释放小球时,使小球按一定加速度向回摆
  private function Frame(event:Event)
    {
    
       linered.rotation+=red_vr;
    lineblue.rotation+=blue_vr;
    myballred.rotation+=red_vr;
    myballblue.rotation+=blue_vr;
    
    red_ar+=redback_vr*hr;
    blue_ar+=blueback_vr*hr;
   
    linered.rotation+=red_ar;
    lineblue.rotation+=blue_ar;
    myballred.rotation+=red_ar;
    myballblue.rotation+=blue_ar;
   
    newred_vr=blue_ar;
    newblue_vr=red_ar;
    /*当小球myballred碰撞到点(256,250)时添加侦听器执行Framered函数,并移除侦
    听函数Frame。如果不移除小球的运动方式便会发生冲突。
    */
     if(myballred.hitTestPoint(256,250,true))
    {
      mysoud.play();
     stage.addEventListener(Event.ENTER_FRAME,Framered);
     stage.removeEventListener(Event.ENTER_FRAME,Frame);
     }
    //与上一个If句类似
    if(myballblue.hitTestPoint(256,250,true))
    {
     mysoud.play();
     stage.addEventListener(Event.ENTER_FRAME,Frameblue);
     stage.removeEventListener(Event.ENTER_FRAME,Frame);
     }
    }
  
   private function Framered(event:Event):void
   {
       //赋值角加速度 ,这里有一点压注意的就是Math.sin()函数的参数是弧度制。
     newblue_ar=-gravity*Math.sin(Math.PI*blue_angle/180);
     //角速度
     newblue_vr+=newblue_ar;
     //摩擦力,假如不加入摩擦力,小球运动不会停止
     newblue_vr*=friction;
    
    
     lineblue.rotation+=newblue_vr;
     myballblue.rotation+=newblue_vr;
     //将小球旋转的角度赋给变量blue_angle,以计算不同位置小球的角加速度
     blue_angle=myballblue.rotation;
     //将小球的角速度赋给变量diguiblue
     diguiblue=newblue_vr;
    
     //trace(myballblue.rotation);
     linered.rotation=0;
    
     myballred.rotation=0;
   
    if(myballblue.hitTestPoint(256,250,true))
    {
        mysoud.play();
    
    /* 当发生碰撞时将小球myballblue的末速度赋给小球myballred,作为小球myballred运动的
     初速度。
     移除侦听函数Framered();并添加侦听器执行Frameblue()侦听函数。
    */
     newred_vr=diguiblue;
     stage.addEventListener(Event.ENTER_FRAME,Frameblue);
     stage.removeEventListener(Event.ENTER_FRAME,Framered);
     }
    
   
    }
    //这个函数的功能和Framered类似
   private function Frameblue(event:Event):void
   {
   
          newred_ar=-gravity*Math.sin(Math.PI*red_angle/180);
       newred_vr+=newred_ar;
     newred_vr*=friction;
    
    
     linered.rotation+=newred_vr;
     myballred.rotation+=newred_vr;
    
        red_angle=myballred.rotation;
     diguired=newred_vr;
    
       
     lineblue.rotation=0;
     myballblue.rotation=0;
    
    
     if(myballred.hitTestPoint(256,250,true))
    {
     mysoud.play();
     newblue_vr=diguired;
     stage.addEventListener(Event.ENTER_FRAME,Framered);
     stage.removeEventListener(Event.ENTER_FRAME,Frameblue);
     }
    
    
   
    } 
    
     
     
 //初始化小球和摆线
  private function drawBall(){
  
   linered=new line();
   linered.x=235;
   linered.y=100;
   this.addChild(linered);
  
   lineblue=new line();
   lineblue.x=277;
   lineblue.y=100;
   this.addChild(lineblue);
  
   myballred=new Ballred();
   myballred.x=235;
   myballred.y=100;
   this.addChild(myballred);
  
   myballblue=new Ballblue();
   myballblue.x=277;
   myballblue.y=100;
   this.addChild(myballblue);
   
   mybutton=new myButton();
   mybutton.x=400;
   mybutton.y=320;
   this.addChild(mybutton);
    }
 //以下两个函数的作用是用键盘方向键控制小球初始时摆放的角度 以及回摆时的初速度 
 private function Keydown(event:KeyboardEvent):void
 {
 
  switch(event.keyCode){
  
   case Keyboard.LEFT:
   red_vr=1;
   redback_vr=0;
   break;
   case Keyboard.RIGHT:
   blue_vr=-1;
   blueback_vr=0;
   break;
  
   }
  
  }
 
  private function Keyup(event:KeyboardEvent):void{
  
   switch(event.keyCode){
  
   case Keyboard.LEFT:
   red_vr=0;
   redback_vr=-1;
   break;
   case Keyboard.RIGHT:
   blue_vr=0;
   blueback_vr=1;
   break;
   }
  
     
  }
  }
 
 }

谢谢大家!

本文地址http://www.chengxuyuans.com/Flash/24263.html