Zip*_*ppy 16 java resources android accessor law-of-demeter
概观
在我的(Android)Java游戏中,我有一个名为resources的类.顾名思义,这个班级掌握了游戏的资源.我在这里创建了所有的OpenGL对象(Sprite)
它看起来像下面的内容(显然,这是一个简化的版本,与真实项目中出现的版本相比):
public class Resources {
Hero hero;
Enemy enemy;
MenuButtons mainMenuButtons;
Background background;
Scene mainMenu;
public void createObjects(){
hero = new Hero();
enemy = new Enemy();
mainMenuButtons = new MenuButtons();
background = new Background();
mainMenu = new Scene(this);
}
}
Run Code Online (Sandbox Code Playgroud)
所以,在我的mainMenu场景中,我需要访问我的对象,所以我们可能会看到这样的东西:
public class mainMenu implements Scene {
Resources resources;
public mainMenu(Resources resources){
this.resources = resources;
}
@Override
public void render(){
resources.background.draw();
resources.hero.draw();
resources.enemy.draw();
mainMenuButtons.draw();
}
@Override
public void updateLogic(){
resources.hero.move();
resources.enemy.move();
resources.mainMenubuttons.animate();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,上述方法只是一个方式来获得访问对象的资源 和他们的方法.但这实际上是否违反了得墨忒耳法则? 如果没有,为什么不呢?如果是这样,以不违反LOD的方式访问这些对象的最佳方法是什么?
访问器?
一个选项(我已经排除了TBH - 见下文)将访问器方法放入我的资源类中.所以我可以这样做:
resources.drawBackround();
Run Code Online (Sandbox Code Playgroud)
我有很多对象,我需要每个对象的每个方法/变量的访问器.不太实际,似乎我正在编写大量的额外代码,最重要的是,它使资源类变得荒谬,因为它充满了这些访问器.因此,我不会走这条路.
将对象传入场景的构造函数
当然,我也可以这样做:
hero = new Hero();
enemy = new Enemy();
mainMenuButtons = new MenuButtons();
background = new Background();
mainMenu = new Scene(hero, enemy, mainMenuButtons, background);
Run Code Online (Sandbox Code Playgroud)
所以我可以这样做:
background.draw(); //etc....
Run Code Online (Sandbox Code Playgroud)
这对于简单的场景(例如不需要很多对象的菜单系统)是可行的,但对于主游戏,它很快就会变得一团糟,因为我必须将对30多个对象的引用传递给构造函数.听起来不是很对......
所以如果有人能指出最好的方法和原因,我真的很感激.
因此,如果有人能指出最好的方法以及原因,我将非常感激。
在我看来,最好的方法是保留 Resources 类,将所有对象设为私有,以免违反法律并编写访问器(但不是像您已经排除的那样针对每个对象)。
我有很多对象,我需要每个对象的每个方法/变量的访问器。不太实用,似乎我正在编写大量额外的代码,最重要的是,当资源类充满这些访问器时,它使资源类变得非常长。因此,我不会走这条路。
我假设许多对象属于同一类。因此,您不必为每个对象创建一个访问器,这会真正破坏类。在一款游戏中,通常有一个英雄、一个或多个敌人和许多精灵。
public class Resources {
private Hero hero;
private Enemy enemy;
private MenuButtons mainMenuButtons;
private Background background;
private Scene mainMenu;
public void createObjects(){
hero = new Hero();
enemy = new Enemy();
mainMenuButtons = new MenuButtons();
background = new Background();
mainMenu = new Scene(this);
}
public Hero getBackground() {
return background;
}
public Hero getHero() {
return hero;
}
public List<Enemy> getEnemies() {
ArrayList<Enemy> list = new ArrayList<Enemy>();
list.add(enemy);
list.add(next_enemy);
return list;
}
public List<Sprite> getSprites() {
ArrayList<Sprite> list = new ArrayList<Sprite>();
list.addAll(enemy.getActiveSprites());
return list;
}
}
Run Code Online (Sandbox Code Playgroud)
如果 Hero 和 Enemy 派生自同一个类,您还可以创建 getActor() 方法,而不是 getHero() 和 getEnemy() 。getSprites() 方法只是一个示例。
如果该解决方案不适合您,我还有另一个建议。
让资源类做一些工作。
public class ResourceManager {
private Hero hero;
private Enemy enemy;
private MenuButtons mainMenuButtons;
private Background background;
private Scene mainMenu;
public void createObjects(){
hero = new Hero();
enemy = new Enemy();
mainMenuButtons = new MenuButtons();
background = new Background();
mainMenu = new Scene(this);
}
public void render(Scene scene) {
this.background.draw();
if (scene != mainMenu) {
this.hero.draw();
this.enemy.draw();
}
this.mainMenuButtons.draw();
}
public void updateLogic(Scene scene){
this.hero.move();
this.enemy.move();
this.mainMenubuttons.animate();
}
}
Run Code Online (Sandbox Code Playgroud)
然后,mainMenu 直接调用 ResourceManager 类中的逻辑方法。
public class mainMenu implements Scene {
ResourceManager resourceManager;
public mainMenu(ResourceManager resourceManager){
this.resourceManager = resourceManager;
}
@Override
public void render(){
resourceManager.render(this);
}
@Override
public void updateLogic(){
resourceManager.updateLogic(this);
}
}
Run Code Online (Sandbox Code Playgroud)
我希望我的建议能帮助您弄清楚如何继续您的项目。
| 归档时间: |
|
| 查看次数: |
494 次 |
| 最近记录: |