Java 侧面滚动背景正在移出画面
对于一个游戏,我需要实现一个侧面滚动背景。 我已经试过了,但我的照片正在移出画框 我做错了什么Java 侧面滚动背景正在移出画面,java,multithreading,algorithm,swing,jpanel,Java,Multithreading,Algorithm,Swing,Jpanel,对于一个游戏,我需要实现一个侧面滚动背景。 我已经试过了,但我的照片正在移出画框 我做错了什么 import java.awt.image.BufferedImage; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*; import javax.imageio.ImageIO; public class GameBoard extends JPanel { priv
import java.awt.image.BufferedImage;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import javax.imageio.ImageIO;
public class GameBoard extends JPanel {
private BufferedImage image;
private int imageCoordX = 0;
public GameBoard() throws Exception {
setBackground(new Color(0,0,86));
URL url = new URL("https://i.stack.imgur.com/P59NF.png");
image = ImageIO.read(url);
setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
ActionListener animListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
imageCoordX = imageCoordX + 10;
repaint();
}
};
Timer timer = new Timer(120, animListener);
timer.start();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, imageCoordX, 0, null);
System.out.println(imageCoordX);
if (imageCoordX < 0) {
g.drawImage(image, image.getWidth() + imageCoordX, 0, null); //
}
if (imageCoordX > 0) {
g.drawImage(image, image.getWidth() - imageCoordX, 0, null);
}
}
public static void main(String[] args) {
Runnable r = () -> {
JFrame f = new JFrame("Animation of Gameboard");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
f.add(new GameBoard());
f.pack();
f.setLocationByPlatform(true);
f.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
};
SwingUtilities.invokeLater(r);
}
}
导入java.awt.image.buffereImage;
导入java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入java.net。*;
导入javax.imageio.imageio;
公共类游戏板扩展JPanel{
私有缓冲图像;
私有int-imageCoordX=0;
public GameBoard()引发异常{
挫折背景(新颜色(0,0,86));
URL=新URL(“https://i.stack.imgur.com/P59NF.png");
image=ImageIO.read(url);
setPreferredSize(新维度(image.getWidth(),image.getHeight());
ActionListener animListener=新建ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
imageCoordX=imageCoordX+10;
重新油漆();
}
};
计时器=新的计时器(120,animListener);
timer.start();
}
@凌驾
公共组件(图形g){
超级组件(g);
g、 drawImage(image,imageCoordX,0,null);
System.out.println(imageCoordX);
如果(imageCoordX<0){
g、 drawImage(image,image.getWidth()+imageCoordX,0,null);//
}
如果(imageCoordX>0){
g、 drawImage(image,image.getWidth()-imageCoordX,0,null);
}
}
公共静态void main(字符串[]args){
可运行r=()->{
JFrame f=新JFrame(“游戏板动画”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
试一试{
f、 添加(新游戏板());
f、 包装();
f、 setLocationByPlatform(真);
f、 setVisible(真);
}捕获(例外e){
e、 printStackTrace();
}
};
SwingUtilities.invokeLater(r);
}
}
如果需要将图像一致地向左或向右移动,可以使用imageCoordX
的模数(例如,oneInt%anotherInt
)获得可用绘图空间范围内的值
这里有一个这样做的例子
import java.awt.image.BufferedImage;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import javax.imageio.ImageIO;
public class WorldMapScroll extends JPanel {
private final BufferedImage image;
private int imageCoordX = 0;
private int step = 5; // Travels east. Use negative for west
public WorldMapScroll() throws Exception {
setBackground(new Color(0, 0, 86));
URL url = new URL("https://i.stack.imgur.com/P59NF.png");
image = ImageIO.read(url);
setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
ActionListener animListener = (ActionEvent e) -> {
imageCoordX = imageCoordX + step;
repaint();
};
Timer timer = new Timer(60, animListener);
timer.start();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
int w = image.getWidth();
g.drawImage(image, imageCoordX % w, 0, this);
System.out.println(imageCoordX);
if (step>0) {
g.drawImage(image, (imageCoordX%w)-image.getWidth(), 0, this);
} else {
g.drawImage(image, (imageCoordX%w)+image.getWidth(), 0, this);
}
}
public static void main(String[] args) {
Runnable r = () -> {
JFrame f = new JFrame("Animation of World Map");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
f.add(new WorldMapScroll());
f.setResizable(false);
f.pack();
f.setLocationByPlatform(true);
f.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
};
SwingUtilities.invokeLater(r);
}
}
作为旁注,在任何地方使用常量文字都是一个非常坏的习惯。不要使用
500500
可能使用sizeX,sizeY
。我的图片是800*600。但是上面的代码也有同样的问题。