我正在创造一个简单的游戏,玩家基本上控制一个左右移动的角色,避开危险的岩石并试图抓住不同的宝石来增加他们的分数。
但是我正在尝试练习我的OO设计,所以我尝试使用MVC布局。
这是我所拥有的,希望我做错了,因为这是第一次没有问题:p:
现在一切正常,游戏画面创建了我的对象,我的渲染器根据我的对象状态和用户输入来完成它。所以一切都很好。
例如,如果按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?这是不可能的吗?
对于文本墙感到抱歉,最好有充足的信息并解释我在嘿嘿之后的情况。
答案 0 :(得分:2)
要减少一些混乱,可以使用GameScreen
类的静态导入。假设它在同一个包中:
import static GameScreen.*;
如果它不在同一个包装中:
import static your.package.here.GameScreen.*;
然后你至少可以直接引用jim
,例如:
if (jim.currentState == 1) {
这应该有效,因为您声明已经创建了jim
对象。