Java 2d游戏平铺地图剪辑?

时间:2013-12-27 14:58:08

标签: java map 2d

我已经创建了一个简单的瓷砖地图加载,来自.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

因此,如果当前图块为1,则它将为绿色块。

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

img http://gyazo.com/2dc01f6057372a6db5e5173387c60f42.png

好的,一切都很好,但现在你能看到红色的盒子吗?这就是角色,当它走路时,我不希望它越过大门(任何绿色区块)。

我该怎么做?

我的尝试:

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时遇到了问题,就像它的位置一样。

30是瓷砖尺寸,因此每个块的宽度为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%不正确的,主要是坐标计算部分。

在这种情况下你会做什么?

这是地图的绘图部分:

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

            }
        }           
    }
}

我该怎么办?

1 个答案:

答案 0 :(得分:1)

为什么不在每次将玩家移动到要移动他的牌上时都进行检查。

让我们假设玩家在这张小地图上的(0,0)。

0 0 1

0 0 0

0 0 0

我们会尝试将他移到右边两次。第一次将在位置(1,0)处工作,因为平铺等于0.第二次我们尝试这个时,(2,0)处的平铺将返回1并且玩家将不会移动。

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