【问题标题】:Java - Constants and where to hold themJava - 常量以及保存它们的位置
【发布时间】:2014-07-20 16:15:44
【问题描述】:

好的,所以我一直在阅读有关使用常量和枚举的良好做法,但我仍然对我应该做什么感到困惑。

基本上我需要存储带有资产路径的字符串,例如

"/assets/sprites/ball.png"

然后我需要像“ball”这样的简单名称字符串,并且我希望它们相互关联。 这些字符串将在我的游戏代码中的不同文件/包中经常使用。

我有一个TextureAtlas 类,其名称(“球”)已经为我提供了实际资源(准备绘制的图形等)。但是当我需要加载资源时,我需要提供实际路径,而不仅仅是名称。我希望有 1 个地方可以声明所有常量,如果“名称”常量和“路径”常量都以某种方式相关,那就太好了。因此,每当我想要使用该图形时,我都不必输入文件的实际路径,而是我想使用名称为 String 的常量。

希望你能明白我的意思。

好吧,我想我可以使用地图,其中键是名称(“ball”),值是路径(“/assets/ball.png”),但我仍然希望能够说,写这样的东西

Assets.GetSprite(Assets.BALL);

并获得实际资源,甚至更好

Assets.GetSprite(BALL);

所以存在这个常量问题,我需要在一个地方为我的图形定义名称和相应的路径,并且如果我需要的话,可以在程序的任何地方使用它。 这一切都需要在一个地方,这样每当我向游戏添加新资源,比如新声音或新精灵时,我就不必查看整个程序来找到应该手动输入的地方,我想有那个 1 个文件,我会检查并为那个 1 个文件添加新的常量或类似的东西。

干杯, 巴勃罗。

【问题讨论】:

  • 属性文件怎么样?

标签: java libgdx constants


【解决方案1】:

使用属性文件可能是个好主意。

Java Properties

config.properties

ball = /assets/sprites/ball.png
user = /assets/sprites/user.png

要读取这些值,请在游戏启动时执行以下操作

FileHandle propertiesFileHandle = Gdx.files
            .internal(PROPERTIES_FILE_PATH);
PROPERTIES = new Properties();
try {
    PROPERTIES.load(new BufferedInputStream(propertiesFileHandle.read()));
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

现在您可以在任何需要的地方共享此 PROPERTIES 对象。

String ballPath = PROPERTIES.getProperty("ball");

希望这会有所帮助。

【讨论】:

  • 我试试看。
【解决方案2】:

Map 有什么问题?创建一个static HashMap 并将您的映射存储在那里。您可以从那里直接获取您的值。

如果您只需要键和值是常量的映射,那么您可以将它们放在interface 中(变量默认为public staticfinal)。

【讨论】:

    【解决方案3】:

    我会选择这样的:

     public enum Assets {
    
         BALL, PLAYER // and so on
    
     }
    
     public class Configuration {
    
         Map<Assets, String> values= new HashMap<Assets, String>();
    
         public String getPathFor(Assets asset){
    
             if(!values.containsKey(asset)) throw new IllegalArgumentException();
             return values.get(asset);
    
         }
    
         /* Contains further logic to persist configuration */
    
     }
    

    所以你已经很好地定义了Assets 和一个Configuration 对象,你可以在其中存储更多信息。

    【讨论】:

      【解决方案4】:

      您可以使用参数创建更复杂的枚举。看看这个例子中的 Planet 枚举 http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html 或者这里是一个特定于你的项目的例子。请记住,创建构造函数是必需的,并且构造函数必须是私有的。

      public class Asset {
      
          public enum AssetType {
              BALL("/assets/sprites/ball.png"),
              USER("/assets/sprites/user.png");
      
              private final String path;
      
              AssetsType(String path) {
                  this.path = path;
              }
      
              public String getPath() {
                  return this.path;
              }
          }
      
          private AssetType assetType;
      
          public Asset(AssetType assetType) {
              this.assetType = assetType;
          }
      
          // ...
      }
      

      【讨论】:

        猜你喜欢
        • 2021-06-14
        • 1970-01-01
        • 1970-01-01
        • 2011-07-30
        • 2012-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-09
        相关资源
        最近更新 更多