如何实现无限图像循环?

马库斯

我目前正在研究具有动态背景的2D射击游戏。背景只是一个简单的图像。我想实现图像从上到下无尽的移动。

我考虑过确定图像的一部分,该部分位于框架可见部分之外的底部,然后再次将其绘画在顶部。

@Override
public void paint(Graphics go) {
    Graphics2D g = (Graphics2D) go;

    g.fillRect(0, 0, this.getWidth(), this.getHeight());
    g.drawImage(this.imgBackground, 0, this.yBackground, this);
}

yBackground是绘制图像左上角的坐标。它是从另一个线程更改的:

while (!this.paused) {
    try {
        Thread.sleep(10);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    int y = this.display.getBackgroundY();

    if (y == this.display.getHeight()) {
        y = 0;
    } else {
        y++;
    }
    this.display.setBackgroundY(y);
}

所以这是我的问题:如何获得图像的一部分,该部分在框架的可见部分之外?

疯狂程序员

您可能有多种方法可以实现此目的,但基本前提是,您需要某种滚动偏移量来确定基本图像的开始。

然后,您需要在其前后填充区域(以防图像小于可用高度),直到空间被填充为止。

以下示例使用ajavax.swing.Timer将偏移量更新为给定值。paintComponent然后,方法将渲染之前和之后的所有空间,包括当前图像位置。

在此处输入图片说明

import java.awt.BorderLayout;
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 java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class ScrollingBackground {

    public static void main(String[] args) {
        new ScrollingBackground();
    }

    public ScrollingBackground() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new BackgroundPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class BackgroundPane extends JPanel {

        private BufferedImage bg;
        private int yOffset = 0;
        private int yDelta = 4;

        public BackgroundPane() {
            try {
                bg = ImageIO.read(new File("Background.png"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }

            Timer timer = new Timer(40, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    yOffset += yDelta;
                    if (yOffset > getHeight()) {
                        yOffset = 0;
                    }
                    repaint();;
                }
            });
            timer.start();
        }

        @Override
        public Dimension getPreferredSize() {
            return bg == null ? new Dimension(200, 200) : new Dimension(bg.getWidth(), bg.getHeight());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (bg != null) {
                Graphics2D g2d = (Graphics2D) g.create();

                int xPos = (getWidth() - bg.getWidth()) / 2;
                int yPos = yOffset;

                while (yPos > 0) {
                    yPos -= bg.getHeight();
                    g2d.drawImage(bg, xPos, yPos, this);
                }

                yPos = yOffset;
                while (yPos < getHeight()) {
                    g2d.drawImage(bg, xPos, yPos, this);
                    yPos += bg.getHeight();
                }

                g2d.dispose();
            }
        }
    }
}

您可能可以通过使用后备缓冲区和或subImage来对此感到乐观,但是您知道了...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何以功能方式实现无限更新循环

来自分类Dev

如何在 Python 中实现非阻塞无限循环

来自分类Dev

for(;;)如何成为无限循环?

来自分类Dev

如何使jQuery无限循环

来自分类Dev

如何修复无限循环?

来自分类Dev

如何无限循环地图

来自分类Dev

如何阻止循环无限循环?

来自分类Dev

如果我的Pharo图像陷入无限循环,我该如何跳出循环?

来自分类Dev

此代码如何进入无限循环?aka如何在Haskell中实现计数器?

来自分类Dev

在C中实现ls,无限循环

来自分类Dev

迭代器实现导致无限循环

来自分类Dev

广度优先搜索实现陷入无限循环

来自分类Dev

无限循环一组图像

来自分类Dev

图像轮播不会反向无限循环

来自分类Dev

Java Servlet 在无限循环中写入图像

来自分类Dev

Costum Pipe 使图像无限循环(闪烁)

来自分类Dev

如何将 IF 语句实现到 while 循环中,并使 while 循环无限期地运行?(重击)

来自分类Dev

如何处理无限循环

来自分类Dev

如何修复无限循环错误?

来自分类Dev

如何使jQuery无限重复循环

来自分类Dev

如何禁用ViewControllers的无限循环?

来自分类Dev

Python:如何杀死无限for循环?

来自分类Dev

如何防止无限的stdin循环?

来自分类Dev

如何停止componentDidUpdate的无限循环?

来自分类Dev

如何停止CHKDSK无限循环?

来自分类Dev

如何处理无限循环

来自分类Dev

在React中通过onError设置图像源时如何防止无限循环?

来自分类Dev

如何避免循环缓存失效无限循环

来自分类Dev

如何实现循环语句