我是 android 新手,正在开发一个基于 AndEngine (www.andengine.org) 的小游戏。
游戏显示背景的平铺地图,带有不同类型的瓷砖(一些可移动,一些可旋转)。我还在屏幕上画了一些线条。
问题是,当游戏第一次运行时(在手机上运行,从 Eclipse 启动)它运行完美,但如果我使用手机的 BACK 按钮退出游戏并从手机主屏幕图标重新启动游戏,则应用程序非常有问题。线条不再出现在屏幕上,移动和旋转图块的功能只工作一次,然后游戏无法运行。它不会崩溃,但由于游戏重新启动引起的错误使其无用。
我已经阅读了有关应用程序生命周期的所有内容,并尝试在 onDestroy() 方法中将各种对象设置为 null,但我所做的一切都没有产生任何影响。第一次运行应用程序时,显然有些东西“徘徊”,并在第二次启动时引起问题。请帮助,24 小时谷歌搜索和破坏我的大脑一直没有结果。
谢谢,史蒂夫
PS 在模拟器中运行时的行为相同。
更新:
我进一步调查了我的代码:
我创建了一个小程序来调查上述问题的一部分,画一条线并且在重新运行应用程序时没有画出它。
使用 AndEngine 必须重写 onLoadScene()。在此方法中,您可以在启动时指定您想要在屏幕上显示的内容,并且该方法返回一个 Scene 对象。场景处理您在屏幕上看到的内容,因此如果您想说,向屏幕添加新行(或精灵,或其他),您调用 myScene.addEntity(myLine)。我创建了一个主要的活动类和一个名为 MyLine 的类来画线。
我的主要活动:
public class LineTest extends BaseGameActivity {
@Override
public Scene onLoadScene() {
scene = new Scene(1);
myLine = new MyLine();
myLine.displayLine();
return scene;
}
}
MyLine 类:
public class MyLine {
static final Scene SCENE = LineTest.scene;
static final int LINE_WIDTH = 4;
Line line = new Line(0,0,0,0);
public MyLine() {
}
public void displayLine() {
line.setLineWidth(4);
line.setColor(1f, 0f, 0f);
line.setPosition(10, 10, 400, 400);
SCENE.getBottomLayer().addEntity(line);
}
public void removeLine() {
SCENE.getBottomLayer().removeEntity(line);
}
}
您可能会注意到上述问题,在我的辩护中,我是 Java 和 OOP 的新手。我的活动只使用一个场景,所以我想,在我的 MyLine 类中,我可以将 SCENE 声明为静态最终,因为它不会改变。错误的!调试程序我发现静态最终 SCENE 一旦设置,就永远不会改变,即使程序已经停止(使用返回键)并重新启动。但是,当程序重新启动代码 Scene scene = new Scene(1); 使用新 ID 创建一个新场景,因此静态最终 SCENE 指向旧场景而不是新场景,因此在新场景中不会创建线。
我发现有两个选项可以解决这个问题:
任何一个:
Scene SCENE = LineTest.scene;
或者:
static Scene SCENE;
在构造函数中:
SCENE = LineTest.scene; //I could also pass scene as param to
constructor which may be better OOP practice.
我怀疑我的游戏应用程序的其他问题都与在不应该的情况下将事物声明为 static 或 static final 有关。
在决定应该是什么类型变量(和方法)时,我可以使用经验法则吗?
更新:我在我的 Game 类中声明了三个变量,它们应该只是静态的。将它们更改为静态并在构造函数中分配它们已经解决了所有问题,WOOHOO!{:-)