模拟中物体的运动

时间:2011-06-06 04:22:34

标签: flash actionscript-3 flash-cs4

我正在制作带有鱼类的闪光“池塘”,我有能力将食物颗粒添加到池塘上,我应该如何将我的鱼类运动到食物x,y位置?所以它会很光滑,而不是将我的鱼的x,y位置设置到食物颗粒的x,y位置。

还有一个学习如何使我的鱼自己移动的好地方吗? 类似于http://abowman.com/google-modules/fish/

鱼类

package  
{
    import flash.display.MovieClip;
    import flash.display.Stage;
    import flash.events.Event;
    import flash.utils.Timer;
    import flash.events.TimerEvent;
    import flash.filters.DropShadowFilter;
    /**
     * ...
     * @author Z
     * Fish class, makes fishes behaviors, find food.
     */
    public class Fish extends MovieClip
    {
        private var stageReference:Stage;
        private var foodArray :Array = new Array();
        public function Fish(stageReference:Stage) 
        {
            this.stageReference = stageReference;
            x = stageReference.stageWidth / 2;
            y = stageReference.stageHeight / 2;
            setUpShadow()

            //adding listener
            addEventListener(Event.ENTER_FRAME, loop, false, 0, true);

        }

        public function loop(e:Event):void
        {
            if (y - 15 < foodArray.pop.y && y + 15 > foodArray.pop.y)
                moveToFood();

        }
        public function moveToFood():void
        {

        }
        public function addFoodTarget(foodTarget:Food):void
        {   
            foodArray.push(foodTarget);
        }
        public function setUpShadow():void
        {
            //http://blog.0tutor.com/post.aspx?id=103
            //First we declare an object, a dropshadow filter and name it my_shadow for further reference.
            var my_shadow:DropShadowFilter = new DropShadowFilter();
            //Now we apply some properties to our new filters object, this first property is the color, and we set that to black, as most shadows are.
            my_shadow.color = 0x000000;
            //These next two properties we set, are the position of our dropshadow relative to the object,
            //This means 8 px from the object on both the x and y axis.
            my_shadow.blurY = 8;
            my_shadow.blurX = 8;
            //And here we set an angle for the dropshadow, also relative to the object.
            my_shadow.angle = 150;
            //Setting an alpha for the shadow. This is to set the strength of the shadow, how "black" it should be.
            my_shadow.alpha = .5;
            //and here we set the distance for our shadow to the object.
            my_shadow.distance = 15; 
            //Now we define an array for our filter with its properties to hold it. This will be the final object we refer to when we need to apply it to something.
            var filtersArray:Array = new Array(my_shadow);
            //The last step is to take our movie clip that we made at the beginning, so we take our object and apply the filtersArray.
            filters = filtersArray;

        }
    }

}

食品类

package  
{
    import flash.display.MovieClip;
    import flash.display.Stage;
    import flash.events.Event;
    import flash.utils.Timer;
    import flash.events.TimerEvent;
    import flash.filters.DropShadowFilter;
    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    /**
     * ...
     * @author Z
     * food class
     */
    public class Food extends MovieClip
    {
        private var stageReference:Stage;
        private var foodDisperseSpeed:Number = 0.4;

        public function Food(stageReference:Stage,xPos:Number,yPos:Number) 
        {
            x = xPos;
            y = yPos;
            this.stageReference = stageReference;
            addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
        }

        private function loop(e:Event):void
        {
                if(Math.random() > 0.5)
                x -= foodDisperseSpeed;
                else
                y -= foodDisperseSpeed;

        }

        public function removeSelf():void
        {
            removeEventListener(Event.ENTER_FRAME, loop);

            if (stageReference.contains(this))
                stageReference.removeChild(this);

        }

    }

}

4 个答案:

答案 0 :(得分:2)

这应该准确解释如何移动物体。显然,您需要将Sprite更改为您用于鱼类/食物/等的任何类别。你的鱼对象要么需要一个属性来提高速度。如:public var speed:int = 5;或者您可以在主模拟中为所有鱼定义一个。 (我希望自己有变速鱼)

    // This can be done faster but this is to show you how it works.
    public function moveObject(obj:Sprite, target:Sprite):void
    {
        // We start by getting the distances along the x and y axis
        var dx:Number = target.x - obj.x;
        var dy:Number = target.y - obj.y;

        // Basic distance check with pythagorean theorem. We don't need
        // to get the Square Roots because if it is smaller squared it
        // will still be smaller once we get the square roots and thus
        // will just be a waste of time.
        if (dx * dx + dy * dy < obj.speed * obj.speed)
        {
            // Since we are within one time step of speed we will go past it
            // if we keep going so just lock the position in place.
            obj.x = target.x;
            obj.y = target.y;
        }
        else
        {
            // we aren't there yet so lets rock.

            // get the angle in radians given the distance along the x and y axis.
            var angleRads:Number = Math.atan2(dy, dx);

            // get our velocity along the x and y axis
            // NOTE: remember how the flash coordinate system is laid out.
            // we need to calc cos along the x and sin along the y.
            var vx:Number = Math.cos(angleRads) * obj.speed;
            var vy:Number = Math.sin(angleRads) * obj.speed;

            // now that we have our speeds we can add it to the objects 
            // current position and thus create a nice smooth movement per
            // frame.
            obj.x += vx;
            obj.y += vy;

            // This will lock the rotation of the object to the direction
            // the object is traveling in.
            // NOTE: don't forget when you make your objects that for flash
            // rotation of Zero = pointing to the right (+x)
            obj.rotation = angleRads * 180 / Math.PI;
        }
    }

希望这有帮助,任何问题都可以问。

编辑: 您不需要在他们已经有权访问舞台的Sprite或MovieClip中添加对舞台的引用。

答案 1 :(得分:1)

这是一种快速简便的方式来完成您的工作:

public function moveToFood(food:Food):void
{
    x -= (x - food.x) / 40;
    y -= (y - food.y) / 40;
}

对于一些更好的东西,你可能需要看一下你自己的鱼类小型人工智能(比如挑选最近的食物,以恒定的速度向它移动,然后开始以它为食)。

答案 2 :(得分:0)

您可以使用几个Tween对象来调整鱼的x / y坐标,以便它们朝向食物移动。有趣的是,你可以通过这种方式轻松获得轻松/缓和效果。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/fl/transitions/Tween.html

答案 3 :(得分:0)

http://www.greensock.com/tweenlite/下载tweenLite库并将其添加到您的项目中。

然后您可以像这样调用tweenlite:

TweenLite.to(fish, timeToGoToFood, {x: food.x, y: food.y, ease: yourEasing});

可以从tweenLite的一些预编程的缓动函数中选择缓动。我认为Cubic.easeout或Cubic.easein最适合您的鱼类。 :)