这是地图: 蓝色方块的图层名称:背景 青色方块的图层名称:对象 白方=玩家 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
答案 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
最诚挚的问候, 展