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。但是上面的代码也有同样的问题。