我正在开发一个java游戏。对于我的游戏我设计了一个关卡。现在我想为我的游戏设计另一个关卡。如果我可以扩展我以前的关卡,对我的新关卡真的很有用。
在游戏中我正在进行各种级别的阶段更改。为此我必须扩展Application类。由于java不支持多重继承,有没有其他方法可以在不进行阶段更改的情况下进入不同的级别?
阶段变化:
//LevelOne selection
levelOneIm = new ImageView();
levelOne = new Image("minion/image/levelOne.jpeg");
levelOneIm.setImage(levelOne);
levelOneIm.setTranslateX(300);
levelOneIm.setTranslateY(200);
levelOneIm.setOnMouseClicked(e -> {
popUp.show();
popUpOk.setOnAction(ab -> {
try {
userName = popUpUserName.getText();
} catch(Exception a){
System.out.println("Exception handled");
}
//Going to Main Game and popup stage closing
Minion minion = new Minion();
popUp.close();
minion.gameRun = true;
minion.start(stage);//Level1 stage change
});
});
//LevelTwo selection
levelTwoIm = new ImageView();
levelTwo = new Image("minion/image/levelTwo.jpg");
levelTwoIm.setImage(levelTwo);
levelTwoIm.setTranslateX(500);
levelTwoIm.setTranslateY(200);
levelTwoIm.setOnMouseClicked(e -> {
popUp.show();
popUpOk.setOnAction(ab -> {
try {
userName = popUpUserName.getText();
} catch(Exception a){
System.out.println("Exception handled");
}
//Going to LevelTwo and popup stage closing
LevelTwo levelTwo= new LevelTwo();
popUp.close();
levelTwo.gameRun = true;
levelTwo.start(stage);
});
});
级别1:
public class Minion extends Application implements Runnable{
private Group root;
private StackPane stackpane;
private Scene mainbgscene;
private ImageView mainbgv,heartIm1,heartIm2,heartIm3,characterIm,obsIm,obsIm2,obsIm3,obsIm4,obsIm5,obsIm6,obsIm7;
private Image mainbg,heart1,character,obs,obs2,obs3,obs4,obs5,obs6,obs7;
private VBox mainvbox,scoreVbox,characterVbox,obsVbox;
private HBox heartHbox,scoreHbox;
private Stage stageContainer;
private Label scoreLabel;
private Rectangle scoreBox;
级别2:
public class LevelTwo extends Application implements Runnable{
private Group root;
private StackPane stackpane;
private Scene mainbgscene;
private ImageView mainbgv,heartIm1,heartIm2,heartIm3,characterIm,obsIm,obsIm2,obsIm3,obsIm4,obsIm5,obsIm6,obsIm7;
private Image mainbg,heart1,character,obs,obs2,obs3,obs4,obs5,obs6,obs7;
private VBox mainvbox,scoreVbox,characterVbox,obsVbox;
private HBox heartHbox,scoreHbox;
private Stage stageContainer;
private Label scoreLabel;
private Rectangle scoreBox;
private Runnable r1;
private int characterBoundary,life;
private boolean flag1 =true;
private boolean obf1,obf2,obf3,obf4,obf5,obf6,obf7;
private double characterX,characterY;
public static int score,lastScore;
答案 0 :(得分:2)
更改您的设计。重构您的应用程序以使用Single Responsibility Principle。应用程序不应该负责实现级别的逻辑,也不应该实现Runnable。您的应用程序类应仅负责实现JavaFX应用程序生命周期,如JavaFX application javadoc中所定义。实际上,您的应用程序应该是一个非常小的类。
相反,应该将实现游戏级别等任务委托给处理这些事情的其他类。 Favoring composition over inheritance可以让您更轻松地将不同的功能属性与项目相关联,而不是坚持严格且有时不灵活的层次结构,这可能会遇到问题和限制,例如diamond problem。
对于可能看起来最适合通过多重继承来解决的问题的解决方案,您可以尝试使用twin pattern,这实际上只是本文中之前建议的一种委派形式。
要了解如何重构您的程序,研究面向对象的设计原则和技术,例如responsibility driven design和crc modeling,然后验证您的设计是否在运行时基础上相互配合使用一些简单的sequence diagrams。至于学习这些东西的书籍建议,也许会选择Object Design: Roles, Responsibilities, and Collaborations
的副本