2011-03-23 44 views
3

我是一个自学成才的Java程序员,所以我不知道正确的方式做的事情很多。什么是存储在一个先进的java游戏全局/静态变量的最佳方式?

我已经写了几个简单的游戏(如小行星,蛇,等。),所以我知道该怎么做的基本知识。现在我正在研究一个更复杂的游戏,一个有僵尸的角色扮演游戏。我开始写这篇文章时没有考虑到我将如何构造它。首先,我制作了一个'物品'类来保存一个简单物品的数据(价值,重量,伤害)。然后我制作了一个课程来保存玩家的变量(生命值,装甲值,物品)。我最终创建了菜单,它自己需要变量来保存当前正在选择的菜单项。

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

那么,什么是写全局变量的一个大的量的最佳方法?就像我说的,我不知道正确的方式做事情,我无法找到一个很好的网站,说明大规模变量声明。我会做一个拥有所有变量的类,并让'Main'类有一个'VariableStorage'类的静态声明?

在此先感谢!

P.S.如果可以,请提供链接! :d

回答

8

经常使用静态字段是有原因的,原因是静态字段比非静态字段更不灵活,因为只能有一个静态字段的副本,而非静态字段字段可以为每个对象实例保存不同的值。

通过使用静态字段,你是限制自己永远只能有一名球员。如果你想要做多人游戏模式,你不能 - 如果没有重写那么多。

这通常做的方法是这样的:

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),并且仍然允许您将相关字段逻辑地分组到类中,以便在从现在起数月后再次查看代码时再次找到它们。

如果你的游戏变得不平凡的你也应该考虑封装。我通常是在小项目中使用的策略是,字段可能只能通过代码在声明它们的类写入,但整个程序中读取。在一个较大的项目,特别是当它涉及到几个人,你可能会想,编译器执行的是通过使私人领域,并通过公开方式访问他们的状态(通常被称为“干将”)为目的编写的。

+1

谢谢!代码对我非常有帮助! :D你是一个很棒的程序员!我将用这个结构来制作我的游戏。当我进一步下调生产时,请让我知道它的进展情况如何? – 2011-03-23 02:29:10

1

没有一个答案,可以给出。在一般情况下,“大量的全局变量”是一个反模式 - 谁也不需要知道的一切的位置不应该是能 - 这样你的那部分代码不能搞砸了。因此,请一个案例。

您需要一种方法来了解所有对象的位置?例如,有一个名为ObjectMap的类,并将所有位置放在那里。

话又说回来,你总是可以有类似

public class Everything { 
    public static HashMap<Object, Object> everythingHolder = new HashMap<Object, Object>(); 
} 

,但如果你沿着这些路线走,你的代码很快就会变得难以维护。

+1

我会尽可能地说,它不可维护*立即*。将位置存储为项目的一个字段而不是地图会不会更加地道?玩家库存中物品的位置是多少?每当玩家移动时都需要更新吗? – meriton 2011-03-23 01:54:44

+0

当然,对象的位置应该与对象一起存储。我建议使用地图作为将所有对象位置感兴趣的对象组合在一起的方式 – iluxa 2011-03-23 01:57:08

1

老实说,我会做的类结构进行彻底的检查,看是否有更好的设计比把一切都全球。像MVC使用范例真的可以简化您的代码组织。我不知道你的具体需求是什么,但通常一个好的设计可以让你访问一个简单的方法所需要的数据。

//A possible heirarchy 
PlayableCharacter 
|-Stats 
| |-int totalHealth 
| |-int currentHealth 
| |-int speed 
| \-int strength 
| 
|-List<Equipment> inventory 
|-Helmet head //Helmet would be a subclass of Equipment 
|-HandEquipment leftHand 
|-HandEquipment rightHand 
|-ChestEquipment torso 
\-LegEquipment legs 

由于组织结构既符合您的需求,又是游戏世界的良好抽象,访问您的变量将变得简单而有意义。

public int getAttackLevel() { 
    return leftHand.getAttackPoints() + 
     rightHand.getAttackPoints() + 
     stats.getStrength(); 
} 

如果发现,有一些全局变量是不可避免的,我会再次尝试组织他们以有意义的方式。

GameVariables 
|-LocationVariables 
| |-int worldX 
| |-int worldY 
| \-int worldZ 
| 
|-QuestVariables 
| |-String questName 
| \-double questProgress 
| 
|-GameSettings 
| |-int resolutionX 
| |-int resolutionY 
| \-Difficulty difficultyLevel 
| 
| //And so on.... 
相关问题