Java ArrayList 的位置在更新后交替
Java ArrayList of positions alternates after updating
首先,抱歉!
我尝试自己调试所有内容,但我无法找出问题所在。所以从广义上讲,我在网格内创建了一个绿色网格和一个红色播放器。我保留了所有单元格的 ArrayList 以及它们应该是什么颜色。我用 KeyListeners 更新我的播放器的位置。当我 运行 程序时,播放器没有移动。我将 link 我所有的代码都放在下面,这样你们就可以跟进了。这是我的调试过程。请记住我是一个没有经验的程序员
- 首先,我系统排除了所有内容并查看了 运行。一切 运行.
- 所以我最终观察到 Array List 确实跟踪了我的播放器和关键侦听器的工作,因为我只是在按 w(向上移动)几次后才会出现越界错误。然而,在屏幕上它没有移动
- 接下来我查看它是否必须对重绘执行某些操作,因为播放器没有移动但 ArrayList 正在更新。但是我添加了一个新方块,发现当我有 x++ 时它会移动。
- 接下来,我尝试查看它是否与我的线程(计时器)有关。我将时间从 7 毫秒更改为 1000 毫秒。在控制台中,我将 playerX 位置打印到控制台。这是当我看到它是成对打印的时候。我从 5 开始位置 x。货币对如下所示 5 5 5 6 5 7 5 8 5 9 5 10 5.
- 我将玩家 x 的起始位置更改为 10,得到 10 10 10 10 10 11 10 12 10 13。所以这让我相信网格在我的程序中被多次调用。但是,我找不到任何东西。
老实说,我认为这也可能是硬件问题。这台笔记本电脑真的很慢。无论如何,如果有人能提供帮助,我们将不胜感激。
下面的 FYI 代码有多个 类,看起来最简单。很确定错误一定在游戏面板 Class 中。如果我可以澄清或提供任何信息,请询问。那么为什么 PlayerX 会交替出现?
在深入了解您的代码后,我发现了罪魁祸首:您在 Main
class.
的构造函数中创建了 2 个 GamePanel
对象
它应该是这样的:
public Main()
{
frame.setSize(SIZE);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
GamePanel panel = new GamePanel();
frame.add(panel);
frame.setResizable(false);
frame.setFocusable(true);
frame.addKeyListener(panel);
}
它随之移动。它仍然充满错误并且看起来不太好...但它会移动,因此您可以对其进行进一步的处理。
还有:
- 你的
GamePanel
中的 super.addKeyListener()
什么都不做。
- 不要覆盖
paint
但 paintComponent
.
- 如果没有必要,请不要将
Graphics
转换为 Graphics2D
。
- 一定要改进格式并考虑添加一些文档。
- 不要将
KeyListener
添加到父对象并让子对象使用事件。这是一个奇怪的设计。
首先,抱歉! 我尝试自己调试所有内容,但我无法找出问题所在。所以从广义上讲,我在网格内创建了一个绿色网格和一个红色播放器。我保留了所有单元格的 ArrayList 以及它们应该是什么颜色。我用 KeyListeners 更新我的播放器的位置。当我 运行 程序时,播放器没有移动。我将 link 我所有的代码都放在下面,这样你们就可以跟进了。这是我的调试过程。请记住我是一个没有经验的程序员
- 首先,我系统排除了所有内容并查看了 运行。一切 运行.
- 所以我最终观察到 Array List 确实跟踪了我的播放器和关键侦听器的工作,因为我只是在按 w(向上移动)几次后才会出现越界错误。然而,在屏幕上它没有移动
- 接下来我查看它是否必须对重绘执行某些操作,因为播放器没有移动但 ArrayList 正在更新。但是我添加了一个新方块,发现当我有 x++ 时它会移动。
- 接下来,我尝试查看它是否与我的线程(计时器)有关。我将时间从 7 毫秒更改为 1000 毫秒。在控制台中,我将 playerX 位置打印到控制台。这是当我看到它是成对打印的时候。我从 5 开始位置 x。货币对如下所示 5 5 5 6 5 7 5 8 5 9 5 10 5.
- 我将玩家 x 的起始位置更改为 10,得到 10 10 10 10 10 11 10 12 10 13。所以这让我相信网格在我的程序中被多次调用。但是,我找不到任何东西。
老实说,我认为这也可能是硬件问题。这台笔记本电脑真的很慢。无论如何,如果有人能提供帮助,我们将不胜感激。 下面的 FYI 代码有多个 类,看起来最简单。很确定错误一定在游戏面板 Class 中。如果我可以澄清或提供任何信息,请询问。那么为什么 PlayerX 会交替出现?
在深入了解您的代码后,我发现了罪魁祸首:您在 Main
class.
GamePanel
对象
它应该是这样的:
public Main()
{
frame.setSize(SIZE);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
GamePanel panel = new GamePanel();
frame.add(panel);
frame.setResizable(false);
frame.setFocusable(true);
frame.addKeyListener(panel);
}
它随之移动。它仍然充满错误并且看起来不太好...但它会移动,因此您可以对其进行进一步的处理。
还有:
- 你的
GamePanel
中的super.addKeyListener()
什么都不做。 - 不要覆盖
paint
但paintComponent
. - 如果没有必要,请不要将
Graphics
转换为Graphics2D
。 - 一定要改进格式并考虑添加一些文档。
- 不要将
KeyListener
添加到父对象并让子对象使用事件。这是一个奇怪的设计。