刚学AS3.0不久 练习做的一个AS实例与大家分享 有不足之处还望指正!
看看效果
新建一个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; } } } }
谢谢大家! |