【发布时间】:2014-07-05 08:06:21
【问题描述】:
我有一个匿名类,我想从匿名访问外部类的一些变量。问题是,当我尝试访问它时,它的值与初始化时的值相同,即使我正在更改它在其他匿名类上的值。
这是修剪后的代码
public class WeaponCircle extends Entity {
public static int TAG = gWorld.getNextTag();
float power=99; // <<<--the variable
public WeaponCircle(final gWorld world) {
super(world);
this.tag = TAG;
setGroups(Scene.SLOWABLE);
addMechanism(new IntervalMechanism(this,10) {
@Override
public void init() {
super.init();
world.worldrenderer.setWorldShader("punchShockWave");
world.worldrenderer.getShader("punchShockWave").getShader().setUniformf("screenSize", Tools.tempVec2.set(Gdx.graphics.getWidth(),Gdx.graphics.getHeight()));
power=4;
}
@Override
public void die() {
super.die();
world.worldrenderer.setClearWorldShader();
}
@Override
public void tick() {//this is called every frame
if(power>0)power-=0.1f*Director.delta;
Tools.con("debug0:"+power); //<<--------------------debug0 ,prints correct value
}
});
addMechanism(new MovementMechanism(this));
addMechanism(new SpriteMechanism(this,"sprites/sprites.png",714,284,1,235,235,gWorld.RENDER_LAYER4));
world.worldrenderer.addShader("punchShockWave", new Shader("shaders/default.ver","shaders/punch_shock_wave.frag",Shader.SCENE_SHADER));
world.worldrenderer.getShader("punchShockWave").setListener(new ShaderParrametersListener(this) {
@Override
public void setParameters(Shader shader) {//called every frame
WeaponCircle wc=(WeaponCircle)entity;//entity is the object that i passed in the constractor
/*irrelevant code*/
Tools.con("debug1:"+wc.power); //<<--------------------debug1 ,prints always 99
Tools.con("debug2:"+power); //<<--------------------debug2 ,prints always 99
/*irrelevant code*/
}
});
}
}
ShaderParrametersListener(它是 Shader 类中的一个静态类)
public abstract static class ShaderParrametersListener{
public Entity entity;
abstract public void setParameters(Shader shader);
public ShaderParrametersListener(){};
public ShaderParrametersListener(Entity entity){this.entity=entity;}
}
我的实体系统基于匿名类,到目前为止我没有遇到任何问题,如果我再使用 1 个 IntervlMechanism 并从那里打印功率变量,我将得到正确的值。这只发生在 ShaderParrametersListener 类中。
【问题讨论】:
-
if(power>0)power-=0.1f*Director.delta;- 我敦促您考虑空格(以及大括号)的可读性优势。 -
IntervalMechanism是否声明了power字段? -
@Henry ,不,不是,所有的电源外观都是指 WeaponCircle 类中的那个,三重检查
-
debug0、debug1、debug2的打印顺序是什么?
-
@newacct ,顺序为 debug0,debug1,debug2 。tick 和 setParameters() 都在同一个事件上执行,但 setParameters() 是最后调用的。而且一切都在一个线程上运行。跨度>
标签: java class anonymous-class