Я хочу перемещать изображения медленно. Но метод drawImage() принимает только int values.Is есть какой-либо метод для перемещения фотографий медленно. Я хочу, чтобы перемещение земли влево немного медленно.
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;
}
}
}
Вы можете использовать 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;
}
}
И не вызывайте метод repaint()
внутри paint()
или paintComponent()
.
drawImage()
принимает только значения int.Is есть способ медленного перемещения изображений.
Конечно. Используйте AffineTransform
перевода AffineTransform
. Они могут работать с двойными значениями. Затем результирующий рисунок изображения будет "затухать" по краям, чтобы показать, что, по-видимому, является "реализацией подпиксельной точности".
Я считаю, что округление до int вашего x не является проблемой. Реальный заключается в том, что вам нужно перемещаться с использованием анимации, основанной на времени, вместо анимации на основе кадра. Вы можете использовать подход, основанный на float (двойной слишком большой для вашей цели) или с целым, делающим несколько простых шагов. Добавить участника:
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 ---
//
}
И вуаля!
System.currentTimeMillis();
, OP нужно использоватьTimer
.