【问题标题】:Side scrolling background is moving out of frame侧滚动背景移出框架
【发布时间】:2018-06-09 20:57:53
【问题描述】:

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

我做错了什么?

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

【问题讨论】:

  • 附带说明,到处使用常量字面量是一个非常糟糕的习惯。而不是500, 500 可能使用sizeX, sizeY
  • 我的图片是800*600。但是上面的代码也是同样的问题。

标签: java multithreading algorithm swing jpanel


【解决方案1】:

如果需要将图像始终向左或向右移动,可以使用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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多