gpt4 book ai didi

Java 2d 游戏平铺 map 裁剪?

转载 作者:行者123 更新时间:2023-12-01 13:40:48 25 4
gpt4 key购买 nike

我已经创建了一个简单的图 block map 加载,从 .txt 文件加载然后绘制。

25
15
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

因此,如果当前图 block 为 1,则它将是一个绿色 block 。

现在游戏窗口看起来像这样(忽略顶部的黄点):

img
(来源:gyazo.com)

好吧,一切都很好,但是现在你能看到红色框吗?这就是角色,当它行走时,我不希望它越过大门(任何绿色方 block )。

我怎样才能做到这一点?

我的尝试:

private void makeClips() {
int[][] tiledMap = this.map.getMap();
for (int i = 0; i < this.map.getHeight(); i++) {
for (int j = 0; j < this.map.getWidth(); j++) {
if (tiledMap[i][j] == 1) {
clips.add(new Clip(j * 30, i * 30, 0, 0));
System.out.println("Added clip: " + j + " " + i + " " + (j + 30) + " " + (i + 30));
}
}
}
}

这应该创建一个剪辑数组,这样我们就可以检查玩家的下一个行走是否等于剪辑坐标,但我在设置剪辑 x、y 时遇到了问题,比如它的位置是什么。

30 是图 block 大小,因此每个 block 的宽度为 30,高度为 30。

然后在步行方法中我这样做了:

    for (Clip clip : clips) {
if (myPlayer.getX() + x >= clip.getFirstX() && myPlayer.getX() + x <= clip.getSecX()
&& myPlayer.getY() + y >= clip.getFirstY() && myPlayer.getY() + y <= clip.getSecY()) {
System.out.println("Bad");
return;
}
}

但我不知道,这100%不正确,主要是坐标计算部分。

遇到这种情况你会怎么做?

这是 map 的绘制部分:

private void renderMap(Graphics2D g) {
int[][] tiledMap = this.map.getMap();
for (int i = 0; i < this.map.getHeight(); i++) {
for (int j = 0; j < this.map.getWidth(); j++) {
int currentRow = tiledMap[i][j];

if (currentRow == 1) {
g.setColor(Color.green);
}
if (currentRow == 0) {
g.setColor(Color.black);
}
g.fillRect(0 + j * map.getTileSize(), 0 + i * map.getTileSize(),
map.getTileSize(), map.getTileSize());

g.setColor(Color.yellow);
for (Clip clip : clips) {
g.fillRect(clip.getFirstX(), clip.getFirstY(), 2, 2);

}
}
}
}

我能做什么?

最佳答案

为什么不在每次将玩家移动到您想要将其移动到的图 block 上时进行检查。

假设玩家位于这张小 map 上的 (0,0)。

0 0 1

0 0 0

0 0 0

我们会尝试将他移到右侧两次。第一次将在位置 (1,0) 处的图 block 等于 0。第二次我们尝试此操作时,在 (2,0) 处的图 block 将返回 1 并且玩家不会移动。

if (tiledMap[player.getX() + 1)[player.getY()] == 1) {
//do nothing
} else {
//move player
}

关于Java 2d 游戏平铺 map 裁剪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20802793/

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