Java-Slick2D平铺地图碰撞失败

时间:2013-12-18 12:41:45

标签: java lwjgl slick2d

这是地图: 蓝色方块的图层名称:背景 青色方块的图层名称:对象 白方=玩家 http://prntscr.com/2c2m5l(不要介意黑色空间)。

在观看了几个教程后,我最终编写了这门课程的编码:

public class LevelOne extends BasicGameState{

public int state;
boolean esc;
Input input;

private TiledMap map;

private int x,y;


public LevelOne(int state){
    this.state = state;
}

@Override
public void init(GameContainer arg0, StateBasedGame arg1)
        throws SlickException {
      esc = false;
      map = new TiledMap("res/map/map.tmx");

      x = 1;
      y = 1;
}

@Override
public void render(GameContainer arg0, StateBasedGame arg1, Graphics g)
        throws SlickException {
        map.render(0, 0);

        g.fillRect(x * 32, y * 32, 32, 32);

}

@Override
public void update(GameContainer gc, StateBasedGame sbg, int arg2)
        throws SlickException {
    input = gc.getInput();
    if(esc){
        Mouse.setGrabbed(false);

    }else{
        Mouse.setGrabbed(true);
    }
        if(input.isKeyPressed(Input.KEY_ESCAPE)){
            esc = true;
        }   
    if(esc){
        Mouse.setGrabbed(false);
            if(input.isKeyPressed(Input.KEY_R)){
                esc = false;
            }else if(input.isKeyPressed(Keyboard.KEY_Q)){
                System.exit(0);
            }else if(input.isKeyPressed(Keyboard.KEY_M)){
                esc = false;
                sbg.enterState(0);
                Mouse.setGrabbed(false);
            }
        }

    int objLayer = map.getLayerIndex("Objects");

    map.getTileId(0, 0, objLayer);


    if(input.isKeyPressed(Input.KEY_RIGHT)){
        if(map.getTileId(x+1, y, objLayer) == 0){
            x++;
        }
    }

    if(input.isKeyPressed(Input.KEY_LEFT)){
        if(map.getTileId(x-1, y, objLayer) == 0){
            x--;
        }
    }

    if(input.isKeyPressed(Input.KEY_UP)){
        if(map.getTileId(x, y-1, objLayer) == 0){
            y--;
        }
    }

    if(input.isKeyPressed(Input.KEY_DOWN)){
        if(map.getTileId(x, y+1, objLayer) == 0){
            y++;
        }
    }

        }

@Override
public int getID() {
    return state;
}

}

碰撞检测不起作用,我不明白为什么我需要这两行:

int objLayer = map.getLayerIndex("Objects");

    map.getTileId(0, 0, objLayer);//this one in particular

1 个答案:

答案 0 :(得分:1)

map.getTileId(0, 0, objLayer);  //this one in particular

此行不是必需的。方法getTileID(int x,int y,int layerID)将返回放置在位置(x | y)的tile的id。

int objLayer = map.getLayerIndex("Objects");

此行将为您提供名称为“Objects”的图层的layerID。所以基本上你必须看看你的瓷砖地图文件。 在瓷砖地图中,您可以拥有多个图层。转到地图编辑器并搜索要与其碰撞的图块的名称。 例如,您可以创建一个名为“Objects”的额外图层,然后放置图块以在该图层上发生碰撞。

找到该名称后,使用getLayerIndex(String layerName)将此图层的layerID作为整数。

稍后,您可以在getTileID(int x,int y,int layerID)中使用该值来获取该图层上的特定tile ID。最后要注意的是,你要确保这块瓷砖有什么特色。

检查代码的一种简单方法是在每个if语句中打印getTileID(int x,int y,int layerID)的结果。通过它,您将看到对象ID,您将看到它是否有效。

只需将其放入每个if语句中,例如:

if(input.isKeyPressed(Input.KEY_LEFT)){
    System.out.println( "Try to walk left.Tile id left to the player is:"+
                                               map.getTileId(x-1, y, objLayer) );
    if(map.getTileId(x-1, y, objLayer) == 0){
        x--;
    }
}

所以检查一下  1.正确的图层名称  2.右侧瓷砖ID

最诚挚的问候, 展