java - 在高级 Java 游戏中存储全局/静态变量的最佳方式是什么?

标签 java variables static storage

我是一个自学成才的 java 程序员,所以我不知道做很多事情的正确方法。

我写过一些简单的游戏(例如 Asteroids、Snake 等),所以我知道如何做基础知识。现在我正在开发一个更复杂的游戏,一个僵尸角色扮演游戏。我开始写它时并没有考虑我将如何构建它。首先,我创建了一个“项目”类来保存一个简单项目的数据(值(value)、重量、损坏)。然后我做了一个类来保存玩家的变量(健康、盔甲、元素)。我最终制作了菜单,它自己需要变量来保存当前正在选择的菜单项。

我很快意识到我需要以某种方式存储大量全局变量。我需要在单独的类中使用变量(例如打印到屏幕的类必须知道所有内容的位置)。

那么编写大量全局变量的最佳方式是什么?就像我说的,我不知道做事的正确方法,而且我找不到一个很好的网站来大规模解释变量声明。我会创建一个包含所有变量的类,并使“Main”类具有该“VariableStorage”类的静态声明吗?

提前致谢!

附言可以的话请提供链接! :D

最佳答案

频繁使用静态字段是有原因的,这个原因是静态字段不如非静态字段灵活,因为静态字段只能有一个副本,但非静态字段可以为每个对象实例保存不同的值。

通过使用静态字段,您将限制自己只能有一名玩家。如果你想做多人游戏模式,你做不到——除非重写很多东西。

通常的做法是这样的:

class Player {
    String name;
    Location loc;
    List<Item> inventory;

    void pickup() {
        if (itemsOnGround.isEmpty()) {
            throw new InvalidActionException("There appears to be nothing to pick up here");
        }
        inventory.add(loc.itemsOnGround.get(0));
        loc.itemsOnGround.remove(0);
    }
}

class Location {
    List<Items> itemsOnGround;

    /** null if there isn't a monster here */
    Monster monster;
}

class Game {
    Player player;
}

class Ui {
    Game game;

    void keypressed(char key) {
        try {
            if (key == 'p') {
                game.player.pickup();
            } else {
                showKeyboardHelp();
            }
        } catch (InvalidActionException e) {
            showErrorMessage(e.getMessage());
        }
    }
}

如您所见,找不到静态字段。这允许您在不重新启动应用程序的情况下切换游戏(只是覆盖所有静态字段很容易出错 - 如果您忘记了一个怎么办?在之前的游戏中获得了 yendor 护身符的玩家真的应该继承吗?),同时允许您创建附加元素、玩家(或类似玩家的角色,在 RPG 术语中通常称为 NPC)由您自行决定,并且仍然允许您在逻辑上将相关字段分组到类中,这样当您在几个月后再次查看您的代码时,您可以再次找到它们.

如果您的游戏变得非常重要,您还应该考虑封装。我通常在小型项目中使用的策略是字段只能由声明它们的类中的代码写入,但在整个程序中读取。在一个较大的项目中,特别是如果它涉及多个人,您可能希望编译器通过将字段设为私有(private)并通过为此目的编写的公共(public)方法(通常称为“getter”)访问它们的状态来强制执行此操作。

关于java - 在高级 Java 游戏中存储全局/静态变量的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5399821/

相关文章:

java - 在 spring-kafka 中禁用连接和消费者创建

php - 如何从另一个变量名创建变量?

variables - Ansible:检查变量是否等于字符串

java - Java 中的静态 block 未执行

java - 如何等待一段时间,然后才返回默认值?

java - 如何使用 Selenium 和 POI 从 Excel 的第一行迭代并尝试登录,然后再次迭代到第二行并尝试再次登录?

java - 使用 Spring MVC 和 Hibernate 每个请求的单个事务

javascript - 引用对象方法时是否应将其存储在变量中? (JavaScript)

Java继承: "Casting" variable in abstract class as static

swift - 关于在 Swift 中重写类属性的困惑