【问题标题】:Static int is not the same for different processes不同进程的静态int不一样
【发布时间】:2016-07-13 09:41:47
【问题描述】:

我正在 LibGDX 中开发一个游戏,我有一个名为 TILE_ID 的静态 int,每次创建图块时都会分配给每个图块,如下所示:

{loop in Level.class}

Tile t = null;

            switch (material) {
                case HOME: {
                    t = new Home(x, y);
                    break;
                }
                case WALL_IRON:
                case WALL_BRICK: {
                    t = new Tile(x, y, material, type);
                    break;
                }
            }

            if (t != null) {
                if (t instanceof Home) {
                    this.home = t;
                }
                t.tileID = TILE_ID++;
                tileArray.add(t);
            }

{loop-end in Level.class}

所以当我开始一个新游戏时,第一个实例会说:

private final Listener clientListener = new Listener() {
    @Override
    public void connected(Connection connection) {
        PacketEntity p = (PacketEntity) Packet.createPacket(
                PacketEntity.class, Packet.TYPE.CONNECTED);
        p.name = pTank.getName();
        connection.sendTCP(p);

        System.out.println("MAX TILES: " + Level.TILE_ID);
        System.out.println("connected to server!");
    }

输出是:

:desktop:run
new manager
disposed main menu!
Initializing local server...
Client connected! ID# 1
MAX TILES: 76
connected to server!

然后我运行第二个实例,连接到本地主机服务器,输出是:

:desktop:run
new manager
disposed main menu!
A server is already running on localhost. Trying to connect....
MAX TILES: 152
connected to server!

我不明白为什么会这样。如果我连接第三个客户端等等,最大图块总是 152。

tileid 增加的唯一位置是 Level.class 内部,每个玩家都是本地的(不通过网络发送)。

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 你试过调试代码吗?从(相当稀疏的)信息来看,如果启动第二个实例,“Level-Creation-Loop”可能会执行两次(152 = 2 * 76)。
  • 这有点令人困惑,因为所有大写字段名称通常仅用于 final 静态字段。
  • 谢谢。正确答案是 dpr。我的代码中有一个错误,即即使您连接到另一台服务器也会创建一个新的服务器实例。

标签: java libgdx desktop-application kryonet


【解决方案1】:

您应该在新流程实例中增加 Level.TILE_ID = 0 之前设置它们 - 问题是您正在使用 TILE_ID 启动新流程,因为 76 的值已经设置,因此新流程正在增加变量设置

    76 + 76 = 152

它总是152,因为如果你从第二个开始,你就会从第一个开始盯着新客户

    152 + 76 = 228

等等

【讨论】:

  • 如果他将 TILE_ID 重置为零那么为什么他需要将其设置为静态属性,我认为他可能需要在客户端 scoop 中设置此类而不是在服务器 scoop 中
  • 这取决于他如何使用客户端应用程序中的变量(也许他需要静态才能从类外部访问它)
  • 谢谢。今晚我试试这个。也许是因为我从 IDE 运行了几个瞬间。我也会尝试运行编译后的代码,看看这是否继续发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
相关资源
最近更新 更多