Java-Slick2D Tiled map сблъсък неуспешен

Това е картата: Име на слоя със сини квадрати : Фон Име на слой със сини квадрати : Обекти Бял квадрат = играч 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");

Този ред ще ви даде слоя ID на слоя с името "Обекти". Така че основно ще трябва да погледнете файла с картата на плочките. Във вашата карта с плочки можете да имате няколко слоя. Отидете до вашия редактор на карти и потърсете името на слоя, където са поставени плочките, с които да се сблъскат. Можете например да създадете допълнителен слой, наречен „Обекти“, и след това да поставите плочки, с които да се сблъскате върху този слой.

След като откриете това име, използвате 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