【发布时间】:2020-02-08 21:00:00
【问题描述】:
我正在使用 MVC 设计模式(使用 Swing)在 Java 中制作游戏,但我不知道如何将 Controller 类与视图类分开。
到目前为止,我有一个包含所有数据的模型,一个负责所有逻辑的控制器,现在我考虑如何分离视图。
我有 GameView,它扩展了 Jpanel 并有一个paintComonent:
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g;
draw(g2D);
}
public void draw(Graphics2D g2D){
drawComponent(background, g2D);
drawComponent(arenaController.getArena().getPlane(), g2D);
drawComponent(arenaController.getArena().getPlayer().getBoat(), g2D);
ArrayList<PlaneDrop> planeDrops = arenaController.getArena().getPlaneDrops();
for(PlaneDrop planeDrop : planeDrops){
drawComponent(planeDrop, g2D);
}
g2D.drawString("Life: " + arenaController.getArena().getPlayer().getLife(), 10, 30);
g2D.drawString("Score: " + arenaController.getArena().getPlayer().getScore(), GAME_WIDTH - 50, 30);
}
但另一方面,我有负责配置和运行的 GameEngine
@Override
public void run() {
arenaController.init();
long waitTime = 0;
Graphics g = this.getGraphics();
gameViewer.paintComponent(g);
while(arenaController.isRunning()){
long startTime = System.currentTimeMillis();
gameViewer.paintComponent(g);
update(); // update game
gameViewer.repaint();
long endTime = System.currentTimeMillis() - startTime;
waitTime = (MILLISECOND / FPS) - endTime / MILLISECOND;
try{
Thread.sleep(waitTime);
} catch (Exception e){}
}
}
引擎中的 run() 方法调用视图的 paintComponent() 方法(对我来说这听起来像控制器 --> 调用查看器)但我发现这不是最好的方法,它是不建议直接调用paintComponent()。
所以我想要明确分离控制器和视图,但我找不到合适的方法来做到这一点。
【问题讨论】:
-
永远不要自己打电话给
paintComponent,之所以叫protected是有原因的。同样,您永远不应该使用getGraphics。这样做只是与已经存在的油漆系统作斗争。相反,您应该简单地调用repaint并让绘图系统来处理其余的事情。 -
“控制器和视图的清晰分离” - 好吧,如果你花时间看看 MVC 从它的起源,你会发现它的设计更像是“建议”是一种做某事的方式(当时相当复杂),而不是硬性规定或范式。一般来说,控制器的职责是协调模型和视图之间的动作,因此让控制器安排绘制通道在其职责范围内 - 它对模型(游戏状态)的变化做出反应并将变化传递给到视图
-
我想我可能会这样做的一种方法是让您的控制器/游戏循环绘制图像(如 BufferedImage),然后让 GUI 将该图像更新到屏幕上。这将事物分开,也使 Swing 中的实际更新尽可能快。
-
“如果”这仍然对您不起作用,您可以拥有一个游戏引擎与之对话的“绘制控制器”,然后它会在视图上安排绘制通道。这很重要,如果您查看 Swing 架构,就会发现类似。一个控制器可以管理其他控制器。视图可以充当子视图/控制器的控制器
-
如果你决定使用 Swing 看看这个:Low Latency Painting in AWT and Swing 我个人会考虑使用类似 JOGL 或 LWJGL 的东西。
标签: java swing model-view-controller jframe