我正在创建一个简单的游戏,玩家基本上控制一个左右移动的角色,避开危险的岩石,并试图抓住不同的宝石来增加他们的分数。
但是我正在尝试练习我的 OO 设计,所以我正在尝试使用 MVC 布局。
这就是我所拥有的,希望我做错了,因为这是第一次没有问题地这样做:p:
- 我有一个 GameScreen 类,它包含屏幕上存在的所有对象。
- 我有一个处理所有动画和渲染以及相机的 WorldRenderer 类。
- 最后但同样重要的是,一个控制器类处理来自用户的所有输入。
现在一切正常,游戏屏幕创建我的对象,我的渲染器根据我的对象状态和用户输入来完成它的工作。所以一切都很好。
例如,如果我按下 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?这是不可能的吗?
对不起,文字墙,最好有大量的信息并解释我在呵呵。