Как установить позицию MovieClip, не испортив анимацию? - PullRequest
0 голосов
/ 04 февраля 2011

Я работаю над играми для AS3 и Box2D с подвижными платформами. Платформы анимированы во Flash, и в ActionScript я могу читать их текущее положение и настраивать физические тела в соответствии.

Однако всегда есть задержка, когда анимация на один кадр опережает физику. Я хотел исправить это, прочитав текущую позицию клипа, сохранив ее на потом, а затем вернув клип на позицию в последнем кадре.

Но когда я делаю это, он систематически отказывается сдвинуться с места.

Я написал простой тест с одним движущимся блоком, чтобы проверить идею, и у меня возникла та же проблема («movingBox» - это символ, который анимирует один символ «бокса» внутри него):

package 
{
    import flash.display.*;
    import flash.events.*;

    public class Main extends Sprite 
    {

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point

            m_movingBox = new MovingBoxClass();
            addChild(m_movingBox);

            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }

        private function onEnterFrame(i_event:Event) : void
        {
            const box : Sprite = m_movingBox.getChildAt(0) as Sprite;
            trace("frame:", m_movingBox.currentFrame, ", x:", box.x);

            box.x = 0;
        }


        [Embed(source="../lib.swf", symbol="movingBox")]
        private var MovingBoxClass:Class;

        private var m_movingBox : MovieClip;
    }

}

Вместо того, чтобы распечатывать позиции движущегося блока, блок просто остается на месте, и вывод трассировки выводит:

frame: 1 , x: 0
frame: 2 , x: 0
frame: 3 , x: 0
frame: 4 , x: 0
frame: 5 , x: 0
...

Есть идеи? Спасибо

ОБНОВЛЕНИЕ: Просто для ясности, если я уберу строку box.x = 0;, окно будет перемещаться правильно, и вызов трассировки выплевывает увеличивающиеся значения для x.

ОБНОВЛЕНИЕ: Я выставил примеры:

Выход

Библиотека с «movingBox» на сцене

Файл Flash

Zip-файл, содержащий проект Flash Develop и все остальные

1 Ответ

0 голосов
/ 04 февраля 2011

обн .:

package{    
import flash.display.*;
import flash.events.*;    
public class Main extends Sprite {

    public function Main():void {
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);
    }

    private function init(e:Event = null):void {
        removeEventListener(Event.ADDED_TO_STAGE, init);
        // entry point            
        m_movingBox = new MovingBoxClass();
        this.addChild(m_movingBox);
        m_movingBox.stop();
        addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }

    private function onEnterFrame(i_event:Event) : void    {
        var str: String = m_movingBox.getChildAt(0).x + ' - ';
        m_movingBox.gotoAndStop(m_movingBox.currentFrame + 1 < m_movingBox.totalFrames ? m_movingBox.currentFrame + 1 : 0);
        str += m_movingBox.getChildAt(0).x;
        trace(str);
    }        

    [Embed(source="../lib.swf", symbol="movingBox")]
    private var MovingBoxClass:Class;        
    private var m_movingBox : MovieClip;
    }    
 }

теперь вы можете управлять этой анимацией и корректировать другие координаты в каждом кадре

...