Как я могу двигать изображение медленно?

1

Я хочу перемещать изображения медленно. Но метод 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;
    }
}
}
Теги:
image
swing
animation
java-2d

3 ответа

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;
    }
}

И не вызывайте метод repaint() внутри paint() или paintComponent().

1

drawImage() принимает только значения int.Is есть способ медленного перемещения изображений.

Конечно. Используйте AffineTransform перевода AffineTransform. Они могут работать с двойными значениями. Затем результирующий рисунок изображения будет "затухать" по краям, чтобы показать, что, по-видимому, является "реализацией подпиксельной точности".

0

Я считаю, что округление до 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 ---

    //
}

И вуаля!

  • 0
    Вместо того, чтобы манипулировать с System.currentTimeMillis(); , OP нужно использовать Timer .
  • 0
    Таймер - это планировщик потоков. Вам не нужно что-то подобное в процедуре розыгрыша. Какой-то другой фрагмент кода каким-то образом вызовет перерисовку всего представления, и фон будет реагировать в соответствии с ним. Для меня это не может быть запланировано.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню