Ошибка столкновения карты Java-Slick2D Tiled

Это карта: Имя слоя синих квадратов: Фон Имя слоя голубых квадратов: Объекты Белый квадрат = игрок 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;
}

}

Обнаружение столкновений не работает и я не понимаю, зачем мне эти 2 строчки:

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

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

person user3029101    schedule 18.12.2013    source источник


Ответы (1)


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

Эта строка не нужна. Метод getTileID(int x, int y, int layerID) вернет идентификатор тайла, размещенного в позиции (x|y).

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

Эта строка даст вам идентификатор слоя с именем «Объекты». Таким образом, в основном вам придется взглянуть на файл карты тайлов. В вашей тайловой карте вы можете иметь несколько слоев. Перейдите в редактор карт и найдите имя слоя, на котором размещены плитки, с которыми нужно столкнуться. Например, вы можете пойти и создать дополнительный слой под названием «Объекты», а затем поместить плитки, чтобы сталкиваться с ними на этом слое.

После того, как вы нашли это имя, вы используете getLayerIndex( String layerName ), чтобы получить идентификатор слоя этого слоя в виде целого числа.

Позже вы можете использовать это значение в getTileID( int x , int y , int layerID ), чтобы получить определенный идентификатор тайла на этом слое. Последнее, о чем нужно позаботиться, это то, что вы хотите убедиться, что какая плитка имеет какой идентификатор.

Один из простых способов проверить ваш код — напечатать результат getTileID(int x, int y, int layerID) в каждом операторе if. При этом вы увидите идентификаторы объектов и увидите, работает ли он.

Просто поместите это в каждый оператор 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. правильный идентификатор плитки

С уважением, Чин

person Florian Fritz    schedule 18.12.2013