gpt4 book ai didi

java - 如何实现图像无限循环?

转载 作者:行者123 更新时间:2023-12-02 06:51:12 26 4
gpt4 key购买 nike

我目前正在开发一款具有移动背景的 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);
}

所以这是我的问题:如何获取图像中位于框架可见部分之外的部分?

最佳答案

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

然后,您需要填充其之前和之后的区域(如果图像小于可用高度),直到空间被填满。

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

enter image description here

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

您可能可以通过使用后备缓冲区和/或子图像来乐观地看待这一点,但您明白了......

关于java - 如何实现图像无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18011545/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com