我试图用Java创建这个小游戏,但我似乎偶然发现了一个变量引用问题。 Player扩展的My Entity类保留Dimension类型的变量。 这个Dimension通过Entity类的构造函数设置,如下所示:
protected Dimension dimension;
public Entity(Dimension dimension) {
this.dimension = dimension;
}
在我的播放器类中,这是我通过构造函数传递维度对象的方式:
public Player(Dimension dimension) {
super(dimension);
}
我还有一个Game类,它保留所有可能的维度,加上一个名为activedimension的额外变量,它保留对活动游戏维度的引用。
private Dimension activedimension;
private Dimension overworld;
private Dimension otherdimension;
public Game() {
overworld = new OverWorldDimension();
otherdimension = new OtherDimension();
activedimension = overworld;
}
当我想重置我的世界范围时,我使用这种方法:
public void resetOverWorld() {
overworld = new OverWorldDimension();
activedimension = overworld;
}
现在,每当我从任何地方调用这个resetOverWorld方法时,似乎我的activedimension确实刷新了,但是我的Player / Enitity类中存储的维度并没有。 我对Java很新,所以我不知道我是否通过构造函数和方法传递了变量引用。 我的应用程序似乎在某处复制了维度对象而不是传递引用,但我无法弄清楚在哪里。
欢迎任何帮助或想法。 提前致谢 〜Krikke
答案 0 :(得分:3)
问题是您没有更新Player
课程中的参考资料。将Dimension
存储在Entity
构造函数中时,您将在内存中存储对该Dimension
的引用。在resetOverWorld()
方法中,您将overworld
和activedimension
变量更改为指向新的OverWorldDimension
,但其他地方的所有引用(例如您的Entity
对象)都没有改变了。它们仍然引用它们构造的初始Dimension
。
您可能希望考虑使用DimensionTracker
可以容纳的Entity
课程,允许您从单个位置更改内部Dimension
。否则,您需要更新每个Entity
以引用新的Dimension
。
public class DimensionTracker {
public Dimension dimension;
public DimensionTracker(Dimension d) {
dimension = d;
}
}
...
protected DimensionTracker dimensionTracker;
public Entity(DimensionTracker dt) {
dimensionTracker = dt;
}
...
public Player(DimensionTracker dt){
super(dt);
}
...
private DimensionTracker activedimension;
private Dimension overworld;
private Dimension otherdimension;
public Game() {
overworld = new OverWorldDimension();
otherdimension = new OtherDimension();
activedimension.dimension = overworld;
}
...
public void resetOverWorld() {
overworld = new OverWorldDimension();
activedimension.dimension = overworld;
}
答案 1 :(得分:1)
public void resetOverWorld() {
overworld = new OverWorldDimension();
activedimension = overworld;
}
这只会更新Game类变量private Dimension activedimension ;
调用resetOverWorld()
后,您必须通过执行类似
entity.setDimension(activedimension)
答案 2 :(得分:0)
你不能保存对变量世界的引用,而是保存对世界的价值:
this.dimension = dimension;
因此,当游戏中的引用发生变化时,您必须手动更新实体的引用,否则它将指向旧值,因为它独立于变量的世界。
答案 3 :(得分:0)
您将维度对象传递给iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 1234 -j DNAT --to 10.x.x.x:1234
对象,并在其某个字段中存储对该对象的引用。
在Player
对象中,您设置Game
以引用activedimension
对象。通过更改其值,您可以将其更改为引用不同的Dimension
对象。
即使Dimension
用于引用传递给activedimension
的相同Dimension
对象,将其更改为其他Player
对象也不会更改引用的对象在Dimension
。
考虑一下,如果系统像这样开始:
Player
Game
- activedimension --> Dimension object A
Player
- dimension --> Dimension object A
和Dimension object A
对象都会看到对Player
的更改。
但是,将Game
更改为指向activedimension
,完全不同的对象不会使Dimension object B
更改为指向它。
dimension