2014-02-19 44 views
1

此代码显示奇怪的行为。 BaseActor类只需按顺序调用:initPhysics,initGraphics和onCreate(仅一次),然后执行(针对每个帧)。预期的行为是在onCreate方法中,我保持fixX值(实际上是-6)使用该值来设置对象的每个帧的X位置,以使对象的X轴为静态。我在onCreate中添加了一个调试点并采取行动,并且他被适当调用。 当重置其值的实例变量

fixX = getBody().getPosition().x; 

他获得价值6,符合市场预期,但在行动的fixX回0 当我改变fixX变量静态的东西就像预期。我不知道如何。我将一个System放在BirdActor的构造函数中,以确保该对象只创建一次。 body的方法setTransform是一个Jni接口,用于带有Box2d引擎的Libgdx的C++代码。

public class BirdActor extends BaseActor { 


    private float fixX = 0; 

    public BirdActor() { 
     System.out.println("Created"); 
    } 

    @Override 
    protected Body initPhysics() { 
     return Assets.scene.getNamed(Body.class, "bird").get(0); 
    } 

    @Override 
    protected void onCreate() { 
     fixX = getBody().getPosition().x; 
    } 

    @Override 
    public void act() { 
     getBody().setTransform(fixX, getBody().getPosition().y, 0); 
     super.act(); 


    } 

    @Override 
    protected Sprite initGraphics() { 
     Sprite sprite = new Sprite(Assets.textureBird); 
     return sprite; 
    } 

} 
+0

BaseActor类中有什么? – Sanjeev

+0

您的代码是否在多线程环境中执行?如果是,那么你应该向fixX变量添加一个volatile变量。 –

+0

我的猜测是,您每次都创建一个新的对象实例,所以第二次查看该值时会看到不同对象中的值。 –

回答

1

问题可能是因为您在构造函数中调用虚方法。

所以通话清单:

1. BaseActor() 
2. onCreate() of BirdActor 
3. BirdActor() whitch inits the fixX = 0. 

所以初始化fixX之后onCreate()方法调用。尝试删除fixX初始化(= 0)。

+0

hmmmmm你是对的:) – lexpfb