首页 > 解决方案 > 侧滚动背景移出框架

问题描述

对于游戏,我需要实现侧滚动背景。我已经尝试过了,但是我的照片超出了框架。

我究竟做错了什么?

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

标签: javamultithreadingalgorithmswingjpanel

解决方案


如果需要将图像始终向左或向右移动,可以使用 的模数(例如oneInt%anotherIntimageCoordX来获取可用绘图空间范围内的值。

这是一个这样做的例子。

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

推荐阅读