Link

首页

Tweet

书单

about me

Command

友情链接

Category

AS3版本的Flash弹性原型


今天,我把一个旧的教程(如何在弹力游戏中控制小球类物体)用AS3来实现。
我做这个教程,是因为在我心目中,这是一个很牛的游戏,它在Box2D已经推出的情况下,使用“非Box2D技术”并且还有市场。
关于全部的理论与物件的使用,可以参考原来的帖子,这里只介绍开始部分。
废话不说,让我们先来看看代码吧…这里有5个原型类:

main class

这是主类,调用其他分类


package {
    import flash.display.Sprite;
    import flash.ui.Mouse
    public class main extends Sprite {
        public var circle:circle_mc = new circle_mc();
        public var crosshair:crosshair_mc = new crosshair_mc();
        public var newmouse:newmouse_mc = new newmouse_mc();
        public var ball:ball_mc = new ball_mc();
        public function main():void {
            Mouse.hide();
            addChild(circle);
            addChild(crosshair);
            addChild(newmouse);
            addChild(ball);
        }
    }
}

circle_mc class

这是你可以移动里面准星的那个大圈圈的类

 

package {
    import flash.display.Sprite;
    public class circle_mc extends Sprite {
        public function circle_mc():void {
            x = 250;
            y = 200;
        }
    }
}

我只是简单的把它放在舞台中央

newmouse_mc class

这是鼠标的替代品

 

package {
    import flash.display.Sprite;
    import flash.events.Event;
    public class newmouse_mc extends Sprite {
        public function newmouse_mc():void {
            addEventListener(Event.ENTER_FRAME,on_enter_frame);
        }
        public function on_enter_frame(e:Event):void {
            x=stage.mouseX;
            y=stage.mouseY;
        }
    }
}

它只是跟随目标而已…

crosshair_mc class

准星跟随鼠标但不能进入大圈圈内

 

package {
    import flash.display.Sprite;
    import flash.events.Event;
    public class crosshair_mc extends Sprite {
        public function crosshair_mc():void {
            addEventListener(Event.ENTER_FRAME,on_enter_frame);
        }
        public function on_enter_frame(e:Event):void {
            var par:main=this.parent as main;
            var circle_limit:Number = par.circle.width/2-width/2
            x=stage.mouseX;
            y=stage.mouseY;
            var dist_x:Number=x-par.circle.x;
            var dist_y:Number=y-par.circle.y;
            var distance:Number=dist_x*dist_x+dist_y*dist_y;
            if (distance>circle_limit*circle_limit) {
                var angle:Number=Math.atan2(dist_y,dist_x);
                x=250+circle_limit*Math.cos(angle);
                y=200+circle_limit*Math.sin(angle);
            }
        }
    }
}

ball_mc class

最后,小球跟随准星并且有弹性效果

 

package {
    import flash.display.Sprite;
    import flash.events.Event;
    public class ball_mc extends Sprite {
        public var friction:Number=0.9;
        public var speed_scale:Number=0.1;
        public var xspeed:Number=0;
        public var yspeed:Number=0;
        public function ball_mc():void {
            addEventListener(Event.ENTER_FRAME,on_enter_frame);
            addEventListener(Event.ADDED_TO_STAGE,on_added_stage);
        }
        public function on_enter_frame(e:Event):void {
            var par:main=this.parent as main;
            var dist_x:Number = (par.crosshair.x-x)*speed_scale;
            var dist_y:Number = (par.crosshair.y-y)speed_scale;
            xspeed+=dist_x;
            yspeed+=dist_y;
            xspeed=friction;
            yspeed*=friction;
            x+=xspeed;
            y+=yspeed;
        }
        public function on_added_stage(e:Event):void {
            var par:main=this.parent as main;
            x=par.circle.x;
            y=par.circle.y;
        }
    }
}

这就是成果啦:


这里有几种方法可以使用这些原型…我将在接下来的几天展示如何在Box2D世界中整合它们。

源码可以在这里下载:

Download the source code.