java - 侧滚动背景移出框架
问题描述
对于游戏,我需要实现侧滚动背景。我已经尝试过了,但是我的照片超出了框架。
我究竟做错了什么?
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);
}
}
解决方案
如果需要将图像始终向左或向右移动,可以使用 的模数(例如oneInt%anotherInt
)imageCoordX
来获取可用绘图空间范围内的值。
这是一个这样做的例子。
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);
}
}
推荐阅读
- hash - 查找密码哈希的秘密消息(知道密码和哈希密码)
- java - 如何将 map() 结果添加到列表
- java - VScode java项目从命令行构建和运行
- ios - iOS 是否从手机信号塔或 Wifi 热点知道手机的位置,即没有 GPS?
- sapui5 - 图标选项卡栏文本颜色更改
- python - 有没有办法使用 Paho MQTT for Python 确保将消息传递到 MQTT 中的代理?
- visual-studio-code - 更漂亮的 VSCode JSON 格式错误 - SyntaxError: ';' 预期的
- c# - 表达式代替语句
- python - 如果您有数字区间,请计算分组中位数
- flutter - Flutter:如何从 Firebase 通知负载中获取 Json 数据