在 JFrame 上移动图像而不使用 repaint()
我正在尝试制作一款 2d 游戏。
我有一个静态的背景图像和一个角色图像。当我按下移动键(WASD)时,主类(按键监听器是)调用名为 Player 的类中的函数该函数正在更改角色(图像)的位置。调用此函数后,我使用 repaint() 在新位置重新绘制角色。 如果我删除背景,我可以看到其他位置仍然留下的旧图像。所以这意味着我必须为每一步重新绘制播放器和背景。
对此可能有更好的解决方案吗?最坏的情况:这是一款在线游戏,有很多玩家在移动,每 100 毫秒就会调用重绘来更新每个玩家的位置。我有一种感觉,这会耗尽玩家电脑的所有内存,或者至少游戏感觉不会那么好
I'm trying to build a 2d game.
I have a background-image that static and an Image of the character. When i press a move-key (WASD) the Mainclass (were the keylistener is) calling a function in a class called Player The function is changing the location of the character (Image). And after this function is called i use repaint() to repaint the character on new position.
If i remove the background i can see the old images still left from the other positions. So this meens i have to repaint the player and the background for each step.
There might be a better solution for this? Worst case scenario: It's an onlinegame and there are many players moving around and each 100 milliseconds the repaint is called for update every players posisions. I have a feeling this will take out all the memory of the players computer or at least the game will not feel so good
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
不要直接在
JFrame
内容窗格中绘制。相反,请在JComponent
中重写paintComponent()
。这个AnimationTest
绘制到JPanel
中,默认情况下它是双缓冲的。该示例还展示了一种检查绘画时间预算的方法。Don't paint directly in the
JFrame
content pane. Instead, overridepaintComponent()
in aJComponent
. ThisAnimationTest
draws into aJPanel
, which is double buffered by default. The example also shows one approach to examining the time budget devoted to painting.据我所知,没有其他解决办法。在大多数计算机上,每 100 毫秒重新绘制一次通常不会占用太多内存。
As far as I know, there is no other solution. Repainting every 100 ms generally isn't too memory intensive on most computers.
我认为重新绘制是唯一的解决方案,我曾经创建了一个 2d 汽车模拟游戏,这就是我所做的,我还更改了所有汽车对象的坐标,然后重新绘制整个事物。我尝试模拟 2000 个以 100 毫秒重新绘制速度运行的汽车对象,并且没有出现任何问题。呵呵有趣
I think repaint is the only solution, I once created a 2d car simulation game and that's what i do, I also change the coordinates of all Car objects and then repaint the whole thing. I tried to simulate 2000 Car objects running at 100 ms repaint on all of them without trouble. hehe fun
相反,您可以尝试使用带有图标的 JLabel。然后您要做的就是调用标签的
setLocation(...)
方法。 Swing RepaintManager 将在重新绘制旧位置和新位置后进行处理。这是一个帮助您入门的示例。此示例对每个图像使用单独的计时器。在游戏中,当单个计时器触发时,您将同时重置所有图像的位置。
您需要为代码创建 ImageIcon 的标签提供背景图像和图像。
Instead you can try using a JLabel with Icons. Then all you do is invoke the
setLocation(...)
method of the label. The Swing RepaintManager will look after repainting the old location and the new location.Here's an example to get you started. This example uses separate Timers for each image. In your game you would reset the location of all images at the same time when your single Timer fires.
You will need to provide a background image and an image for the label where the code creates an ImageIcon.
仅重绘组件的一部分是有效的。阅读此教程。
基本上你必须调用
component.repaint(posX, posY, length, height)
两次:一次在旧玩家图像位置(将重新绘制背景),然后在新位置。
(这个解决方案也是G_H在评论中提出的。)
There is efficient to redraw only part of your component. Read this tutorial.
Basically you have to call
component.repaint(posX, posY, length, height)
twice:once at he old player image position (will repaint the background) and then at the new position.
(This solution was also proposed by G_H in the comments.)