如何在不搞乱补间的情况下设置MovieClip位置?

时间:2011-02-04 12:16:03

标签: flash actionscript-3 box2d

我正在使用移动平台开发AS3和Box2D游戏。平台在Flash中是动画的,在动作中我可以读取它们当前的位置并调整物理体以匹配。

然而,总有一个延迟,动画比物理学领先一帧。我想通过读取剪辑的当前位置,将其存储以供日后使用,然后将剪辑放回到最后一帧的位置来解决此问题。

但是当我这样做时,它会系统地拒绝让步。

我用一个移动的盒子编写了一个简单的测试来测试这个想法,我得到了同样的问题(“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值。

更新:我提出了例子:

The output

The lib, with "movingBox" on the stage

The Flash file

Zip file containing the Flash Develop project and all the rest

1 个答案:

答案 0 :(得分:0)

<强> UPD:

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;
    }    
 }

现在您可以管理此动画并每帧调整其他坐标