Измените метод movement
, чтобы просто обновить дельту
public void movement(){
x_position = x_position +10;
}
Удалить вызов movement
из вашего paintComponent
метода
Обновите вас Timer
, чтобы вызвать movement
метод
Timer timer = new Timer(50, e -> {
canvas.movement();
canvas.repaint();
});
а как насчет операторов if, где, если версия исчезает с экрана, она возвращается к началу? я должен был бы сделать отдельный метод для проверки? и если так, я бы назвал это в графике или в таймере? Спасибо
Вы продолжаете задавать этот вопрос и продолжаете получать один и тот же ответ, я не уверен, что вы ожидаете изменить.
Я бы хотел использовать что-то вроде , например, , которое просто закрашивает «переполнение» изображения, чтобы заполнить оставшееся пространство, или , например, или даже , это пример , который использует BufferedImage#getSubImage
, что, вероятно, более эффективно.
Исходя из первых двух примеров, вы также можете сделать что-то вроде ...
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
BufferedImage background = new BufferedImage(800, 200, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = background.createGraphics();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, 800, 200);
g2d.setColor(Color.RED);
g2d.drawLine(0, 0, 800, 200);
g2d.drawLine(0, 200, 800, 0);
JFrame frame = new JFrame();
frame.add(new RenderPane(background));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class RenderPane extends JPanel {
private BufferedImage bgMaster;
private BufferedImage bgImage;
private Timer timer;
private double delta = 1.0;
private double backgroundXPos = 0;
public RenderPane(BufferedImage background) {
this.bgMaster = background;
bgImage = new BufferedImage(getPreferredSize().width, getPreferredSize().height, bgMaster.getType());
renderBackground();
timer = new Timer(5, new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
backgroundXPos -= delta;
if (backgroundXPos + background.getWidth() < 0) {
System.out.println("Reset");
backgroundXPos = 0;
}
renderBackground();
repaint();
}
});
timer.start();
}
protected void renderBackground() {
Graphics2D g2d = bgImage.createGraphics();
g2d.drawImage(bgMaster, (int)backgroundXPos, 0, null);
double overflow = bgMaster.getWidth() - (backgroundXPos * -1) - getWidth();
if (overflow < 0) {
double overflowX = getWidth() + overflow;
g2d.drawImage(bgMaster, (int)overflowX, 0, null);
}
g2d.dispose();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
if (bgImage != null) {
g2d.drawImage(bgImage, 0, 0, this);
}
g2d.dispose();
}
}
}