Движение объектов в симуляции - PullRequest
0 голосов
/ 06 июня 2011

В настоящее время я делаю флеш-пруд с рыбами в нем, и у меня есть возможность добавлять пищевые шарики на пруд, как я должен перемещать своих рыб в кормовой точке 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 ]

2 голосов
/ 06 июня 2011

Это должно объяснить, как именно перемещать ваши объекты. Очевидно, вам нужно будет изменить 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;
        }
    }

Надеюсь, это поможет, любые вопросы просто задайте.

Edit: Вам не нужно добавлять ссылку на сцену в Sprite или MovieClip, они уже имеют доступ к сцене.

1 голос
/ 06 июня 2011

Это быстрый и простой способ сделать то, что вам нужно:

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

Для чего-то более приятного вам, вероятно, придется взглянуть на собственный маленький искусственный интеллект для рыбы (что-то вроде выбора ближайшей пищи, движения к ней в постоянном темпе и начала кормления).

0 голосов
/ 07 июня 2011

Загрузите библиотеку tweenLite по адресу http://www.greensock.com/tweenlite/ и добавьте ее в свой проект.

затем вы можете вызвать tweenlite следующим образом:

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

Параметр замедления можно выбрать из некоторых предварительно запрограммированных функций замедления tweenLite. Я думаю, что Cubic.easeout или Cubic.easein будут работать лучше всего для ваших рыб. :)

0 голосов
/ 06 июня 2011

Вы можете использовать пару объектов Tween, чтобы отрегулировать координаты x / y ваших рыб так, чтобы они двигались к еде. Что хорошо, так это то, что вы могли бы легко получить / облегчить эффект таким образом.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...