1

我正在创建一个简单的游戏,玩家基本上控制一个左右移动的角色,避开危险的岩石,并试图抓住不同的宝石来增加他们的分数。

但是我正在尝试练习我的 OO 设计,所以我正在尝试使用 MVC 布局。

这就是我所拥有的,希望我做错了,因为这是第一次没有问题地这样做:p:

  1. 我有一个 GameScreen 类,它包含屏幕上存在的所有对象。
  2. 我有一个处理所有动画和渲染以及相机的 WorldRenderer 类。
  3. 最后但同样重要的是,一个控制器类处理来自用户的所有输入。

现在一切正常,游戏屏幕创建我的对象,我的渲染器根据我的对象状态和用户输入来完成它的工作。所以一切都很好。

例如,如果我按下 A,控制器将 Jim(角色)更改为行走状态,如果他面向左侧,则将布尔值更改为 true,控制器告诉世界渲染器 A 已被按下,翻转纹理并绘制它们直到 A被释放并相应地移动 Jim,如果按下 D,它会告诉世界渲染器重新翻转等。如果没有按下任何东西,它将 Jim 设置为空闲状态,绘制空闲纹理。

现在让我们看看代码....有一个傻笑:D:

// Draw textures/sprites
    batch.begin();
    if (GameScreen.jim.currentState == 1) {
        if (GameScreen.jim.facingLeft
                && !GameScreen.jim.sprites[1].isFlipX()) {
            for (int i = 0; i < GameScreen.jim.sprites.length; i++) {
                GameScreen.jim.sprites[i].flip(true, false);
            }
        } else if (!GameScreen.jim.facingLeft
                && GameScreen.jim.sprites[1].isFlipX()) {
            for (int i = 0; i < GameScreen.jim.sprites.length; i++) {
                GameScreen.jim.sprites[i].flip(true, false);
            }

        }
        batch.draw(GameScreen.jim.currentFrame, GameScreen.jim.bounds.x,
                GameScreen.jim.bounds.y, GameScreen.jim.bounds.getWidth(),
                GameScreen.jim.bounds.getHeight());
    }
    if (GameScreen.jim.currentState == 0) {
        if (GameScreen.jim.facingLeft && !GameScreen.jim.jim0.isFlipX()) {
            GameScreen.jim.jim0.flip(true, false);
        } else if (!GameScreen.jim.facingLeft
                && GameScreen.jim.jim0.isFlipX()) {
            GameScreen.jim.jim0.flip(true, false);
        }
        batch.draw(GameScreen.jim.jim0, GameScreen.jim.bounds.x,
                GameScreen.jim.bounds.y, GameScreen.jim.bounds.getWidth(),
                GameScreen.jim.bounds.getHeight());
    }
    batch.end();

是的,看看那完全的缺口。这真的很有效,不要修复没有损坏的东西,在我了解更多之前我不会修改此代码,但很高兴知道什么可以更好。我不喜欢所有这些东西:

GameScreen.jim.jim0, GameScreen.jim.bounds.x,
                GameScreen.jim.bounds.y,

我经常不得不引用 GameScreen 来访问我的 Jim,然后是创建 Jim 中的变量、字段数组等。这不仅很可能是一种糟糕的编码方式,而且看起来非常可怕:)。

现在我在想,如果我可以直接引用 GameScreen,我怎么能不为 Jim 类这样做,而只是这样做:

Jim.jim0;

这会引发一个空异常,因为 Jim 很好,什么都没有。我没有创造他。

现在,如果我在班上做到这一点:

Jim jim;

然后使用:

jim.jim0;

仍然是空异常。

我应该为此使用 get 方法吗?在找到我创建的 Jim 之前,我将如何避免必须先引用 GameScreen?这是不可能的吗?

对不起,文字墙,最好有大量的信息并解释我在呵呵。

4

1 回答 1

2

为了减少一些混乱,您可以使用GameScreen类的静态导入。假设它在同一个包中:

import static GameScreen.*;

如果不在同一个包中:

import static your.package.here.GameScreen.*;

然后你至少可以jim直接引用,例如:

if (jim.currentState == 1) {

这应该有效,因为您声明您已经创建了该jim对象。

于 2013-10-31T19:07:04.567 回答