正确引用对象

时间:2013-10-31 19:01:37

标签: java libgdx

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

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

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

  1. 我有一个GameScreen类,它包含了所有对象 屏幕。
  2. 我有一个WorldRenderer类,可以处理所有动画和 渲染,以及相机。
  3. 最后但并非最不重要的是,一个控制器 处理用户所有输入的类。
  4. 现在一切正常,游戏画面创建了我的对象,我的渲染器根据我的对象状态和用户输入来完成它。所以一切都很好。

    例如,如果按A键,控制器将Jim(角色)更改为WALKING STATE并将布尔值更改为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方法吗?在我能够找到创建的吉姆之前,我该如何避免不得不重新使用GameScreen?这是不可能的吗?

    对于文本墙感到抱歉,最好有充足的信息并解释我在嘿嘿之后的情况。

1 个答案:

答案 0 :(得分:2)

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

import static GameScreen.*;

如果它不在同一个包装中:

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

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

if (jim.currentState == 1) {

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