我正在使用移动平台开发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 lib, with "movingBox" on the stage
Zip file containing the Flash Develop project and all the rest
答案 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;
}
}
现在您可以管理此动画并每帧调整其他坐标