【问题标题】:Multiple animated JPanels - only last one added to JFrame is displaying多个动画 JPanel - 仅显示添加到 JFrame 的最后一个
【发布时间】:2009-04-17 17:48:12
【问题描述】:

我正在制作一个多线程吃豆人游戏。

有一个扩展 JFrame 的 PacmanController 类,一个扩展 JPanel 的 Maze 类,一个在自己的线程中运行并扩展 JPanel 的 Pacman 类,以及一个在自己的线程中运行并扩展 JPanel 的 Ghost 类。每个线程(pacman 和每个 Ghost)都会不断地重新绘制自己并调用 maze.repaint()。

当我将迷宫添加到框架中时,它显示正常,如果我再添加 pacman,它仍然可以正常显示和动画。

但是,当我在 pacman 之后将 Ghost 添加到框架中时,ghost 出现而 pacman 消失。如果我切换添加 pacman 和 ghost 的顺序,则相反,即只显示 pacman 或每个 ghost 实例中的一个 - 最后添加的那个。

例如:

add(maze);
add(pacman);
add(ghostA);

只有迷宫和ghostA出现?

我意识到这与 JFrames BorderLayout 有关,即只能将一个组件添加到中心区域,但不知道如何修复它。我曾尝试将 pacman 和 ghosts 添加到 EAST WEST 等,但这没有奏效。

我也试过

maze.add(pacman);
add(pacman); //etc

但这也没有用。

很抱歉,很长的帖子,非常感谢任何帮助。我无法发布任何代码,因为代码太长并且分布在许多类中。

非常感谢!

【问题讨论】:

    标签: java multithreading swing


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      首先:在 Swing 中从多个线程重新绘制是一个麻烦的秘诀。更好的方法是从主游戏类更新并将Graphics 对象传递给所有演员来绘制自己(我确信还有其他模式,但我有一段时间没有做这种事情了)。

      第二:你的演员(吃豆人,幽灵)不应该是JPanels。这是更糟糕的麻烦的秘诀。让它们扩展 Actor 类或其他东西,但它们不应该是 Swing 组件。

      我知道这并不能直接回答您的问题,但是如果您正确设计游戏,您的一些问题将会消失。网上有很多关于游戏设计的教程;我个人不能推荐其中任何一个,但Killer Game Programming in Java 的前几章看起来很有希望。


      编辑:好的,我会尝试解决实际问题。

      如果你使用BorderLayout,添加多个组件的方法是指定位置:

      setLayout(new BorderLayout());
      add(maze, BorderLayout.CENTER);
      add(pacman, BorderLayout.EAST);
      add(ghostA, BorderLayout.WEST);
      

      或者(也许更好),您可以将玩家添加到迷宫中:

      setLayout(new BorderLayout());
      maze.setLayout(new BorderLayout());
      maze.add(pacman, BorderLayout.EAST);
      maze.add(ghostA, BorderLayout.WEST);
      add(maze, BorderLayout.CENTER);
      

      现在虽然这些应该将所有三个组件都添加到框架中,但我仍然看不出你怎么能拥有一个玩家是 JPanel 试图逃脱 JPanels 的游戏.
      无论如何,如果它们不起作用,接下来要做的就是尝试不同的layout manager

      【讨论】:

      • 许多在 Swing 中遇到麻烦的方法是 :-)
      • 感谢您的回复,但这是作业;因此我真的没有时间重新设计我的程序——总共有 2000 行。我真正想知道的是,我可以使用我到目前为止所做的工作吗?两者都显示正常,只是不是同时显示 - 所以鉴于我所描述的,是否有快速解决此问题的方法?干杯
      • 已经尝试过没有成功的。没关系,无论如何,谢谢。
      【解决方案3】:

      您是否将这些面板直接添加到 JFrame 中?如果是这样,您应该将它们添加到框架的内容窗格中:

      getContentPane().add(maze);
      getContentPane().add(pacman);
      getContentPane().add(ghostA);
      

      【讨论】:

      • 你可以直接添加到框架中,这个问题在 Java5 中消失了
      【解决方案4】:

      仅供参考,mmyers 是对的。你将与​​这个设计抗争到最后,它永远不会正常工作。你走错路了。

      让我们从解决其中一些问题开始

      • 你如何控制pacman和ghost的位置/定位?
      • 您是在设置 jpanel 的位置,还是在面板内的某个 x/y 处绘图?
      • 您是否希望所有 3 个面板在彼此之上绘制/渲染?
      • 您是否在每个 JPanel 中覆盖 paintComponent() 来绘制 pacman/ghost/maze?
      • 家庭作业的标准是什么?
      • 必须是多线程的吗?

      【讨论】:

      • Pacman 由箭头键控制 + 一个简单的算法使幽灵在随机方向上移动 它必须是多线程的 - 这就是分配的重点。迷宫由 Cell 对象的二维数组表示。每个与单元格关联的图像都在迷宫面板上的正确位置绘制 Pacman 和 Ghost 每次移动时移动 32 个像素[1 个单元格位置] 在每个 JPanel 中覆盖paintComponent() 以绘制迷宫/ghost/pacman
      猜你喜欢
      • 2021-01-29
      • 1970-01-01
      • 1970-01-01
      • 2012-05-02
      • 2011-09-13
      • 2013-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多