我想慢慢移动图像。但是drawImage()方法只接受int值。是否有任何方法可以慢慢移动图片。我想让地面向左移动一点点。
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Board extends JPanel {
private Image ground;
private Image city;
private int x = 0;
public Board() {
ground = Toolkit.getDefaultToolkit().getImage("Resources\\ground2.png");
city = Toolkit.getDefaultToolkit().getImage("Resources\\background2.png");
}
public void paint(Graphics g){
super.paint(g);
g.drawImage(ground, x--, 500, 600, 200, this);
g.drawImage(ground, x + 600, 500, 600, 200, this);
repaint();
g.drawImage(city, 0, 0, 600, 500, this);
if(x == -600){
x = 0;
}
}
}
答案 0 :(得分:2)
您可以使用Swing Timer
更改x
变量并重新绘制。将下一个代码添加到Board
构造函数中:
Timer t = new Timer(100, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
x--;
repaint();
}
});
t.start();
也可以使用paintComponent()
方法而不是paint()
来自定义绘画:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(ground, x, 500, 600, 200, this);
g.drawImage(ground, x + 600, 500, 600, 200, this);
g.drawImage(city, 0, 0, 600, 500, this);
if (x == -600) {
x = 0;
}
}
请勿在{{1}}或repaint()
方法中致电paint()
。
答案 1 :(得分:1)
drawImage()
方法只接受int值。是否有任何方法可以慢慢移动图片。
不确定。使用AffineTransform
translate instance。他们可以使用双值。然后,所得到的图像绘制将被抖动'沿着边缘显示出看起来像素的子像素精度'渲染。
答案 2 :(得分:0)
我相信你x的四舍五入不是问题所在。真正的一个是你需要使用基于时间的动画而不是基于帧的动画来移动。您可以使用基于float的方法(double用于您的目的太多)或使用整数执行一些简单的步骤。 添加成员:
private long startTime = 0;
删除int x作为成员。
然后使用以下内容更改绘图例程中的代码:
public void paint(Graphics g){
super.paint(g);
long delta;
if ( startTime == 0 ) {
startTime = System.currentTimeMillis();
delta = 0;
} else {
long now = System.currentTimeMillis();
delta = now - startTime;
}
//using startTime instead of lastTime increase very slow speed accuracy
const long speed = 30; //pixel/sec
//threshold with your image width
int x = (int)((( speed * delta ) / 1000l)%600l);
//
//--- your draw code ---
//
}
Et瞧!