好的,所以我现在正在为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方法的地方有关,所以看看那里。
答案 0 :(得分:3)
paint
方法中绘图,这会导致闪烁,因为你没有获得自动双缓冲。而是使用JPanel的paintComponent
方法来利用swing JComponents附带的自动双缓冲。repaint()
内调用paint
,这是一种糟糕且无法控制的动画制作方式。使用Swing Timer代替动画循环。paint
方法中创建图像对象。任何减慢paint方法或paintComponent方法的因素都会降低绘图和动画的响应速度。不要这样做。避免在这些方法中创建对象,而是仅使用paintComponent方法进行绘制和绘制。super.paintComponent(g)
覆盖中致电paintComponent
。@Override
注释,以便编译器在您的方法签名错误时通知您。答案 1 :(得分:1)
不要从paint()方法调用repaint()。使用双缓冲(你可以为Swing组件打开它),闪烁应该消失。
对于动画,你需要计算&每帧更新位置。要使其平滑,请使用System.nanoTime()
测量时间增量。这将为您提供更准确的&平滑动画System.currentTimeMillis()
,new Date()
或其他标准时钟源。