Java中的闪烁图像?

时间:2013-10-29 03:38:00

标签: java image game-engine

好的,所以我现在正在为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方法的地方有关,所以看看那里。

2 个答案:

答案 0 :(得分:3)

问题和建议:

  • 一个问题是你直接在JFrame的paint方法中绘图,这会导致闪烁,因为你没有获得自动双缓冲。而是使用JPanel的paintComponent方法来利用swing JComponents附带的自动双缓冲。
  • 接下来,您正在repaint()内调用paint,这是一种糟糕且无法控制的动画制作方式。使用Swing Timer代替动画循环。
  • 接下来,您将在paint方法中创建图像对象。任何减慢paint方法或paintComponent方法的因素都会降低绘图和动画的响应速度。不要这样做。避免在这些方法中创建对象,而是仅使用paintComponent方法进行绘制和绘制。
  • 接下来,您不要调用super方法。在super.paintComponent(g)覆盖中致电paintComponent
  • 此外,每当重写方法时,请务必在其前面加上@Override注释,以便编译器在您的方法签名错误时通知您。

答案 1 :(得分:1)

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

对于动画,你需要计算&每帧更新位置。要使其平滑,请使用System.nanoTime()测量时间增量。这将为您提供更准确的&平滑动画System.currentTimeMillis()new Date()或其他标准时钟源。