0

好的,所以我现在正在编写一个游戏来为 Ludum Dare SharkJam 做准备,并且我正在使用一种新的编程方法,因为最后一种方法使我的 PC 崩溃了,所以这个应该可以工作。好吧,它确实有效,而且一切都更好,但是我放入其中的图像会闪烁。这是整个主类(绘制图像的地方)包me.NoahCagle.watermaze;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;

import me.NoahCagle.watermaze.entity.EntityShark;
import me.NoahCagle.watermaze.entity.Player;
import me.NoahCagle.watermaze.input.Keys;
import me.NoahCagle.watermaze.map.Map;

public class Game extends JFrame {
private static final long serialVersionUID = 1L;

Map map = new Map(0, 0);
Player player = new Player(50, 30);
static EntityShark shark = new EntityShark(400, 400);
public Image dbImage;

public Game() {
    setSize(800, 600);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);
    setTitle("Water Maze");
    setResizable(false);
    setBackground(Color.blue);
    addKeyListener(new Keys());
}

public static void main(String[] args) {
    new Game();
    Thread s = new Thread(shark);
    s.start();
}

public void paint(Graphics g) {
    dbImage = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
    g.drawImage(dbImage, map.x, map.y, null);
    g.drawImage(player.player, player.x, player.y, this);
    g.drawImage(shark.shark, shark.x, shark.y, this);
    repaint();
}


}

这段代码对我的作用是使图像正常工作,只是闪烁很多。谁能帮我解决我的问题?编辑:我认为这与我在paint方法中调用repaint方法的位置有关,所以看看那里。

4

2 回答 2

3

问题及建议:

  • 一个问题是您直接在paintJFrame 的方法中绘图,这将导致闪烁,因为您没有获得自动双缓冲。而是paintComponent使用 JPanel 的方法来利用 swing JComponents 附带的自动双缓冲。
  • 接下来,您repaint()从内部调用,paint这是一种可怕且无法控制的动画制作方式。使用 Swing Timer 代替您的动画循环。
  • 接下来,您将在该paint方法中创建一个图像对象。任何减慢paint方法或paintComponent方法的东西都会减慢绘图和动画的响应速度。不要这样做。避免在这些方法中创建对象,而是使用paintComponent 方法进行绘制和仅绘制。
  • 接下来,您不要调用 super 方法。super.paintComponent(g)在您的覆盖范围内调用paintComponent
  • 此外,无论何时覆盖方法,请务必在其前面加上@Override注解,以便编译器在您的方法签名错误时通知您。
于 2013-10-29T03:42:06.457 回答
1

不要从您的 paint() 方法中调用 repaint()。使用双缓冲(你可以为 Swing 组件打开它)并且闪烁应该消失。

对于动画,您需要计算和更新每帧的位置。为了使这一过程顺利进行,请使用 测量时间增量System.nanoTime()System.currentTimeMillis()这将为您提供比、new Date()或其他标准时钟源更准确、更流畅的动画。

于 2013-10-29T03:50:38.977 回答