Как я могу получить местоположение плитки из ячейки в libGDX с помощью поплавков?

Я сейчас делаю игру. Это игра, основанная на 2D-плитках. Я пытался сделать так, чтобы когда вы наступаете на воду, ваши игроки меняли скорость и размер.

Я запускаю это каждые 60 секунд:

if(map.getTileTypeByCoordinate(0, player.sprite.getX()/4.0f, player.sprite.getY()/4.0f) == TileType.WATER){
    player.sprite.setScale(2, 1.75f);
    player.speed = 3;
} else {
    player.sprite.setScale(2, 2);
    player.speed = 5;
}

Метод map.getTileTypeByCoordinate(int layer, float x, float y); заключается в следующем:

public TileType getTileTypeByCoordinate(int layer, float col, float row) {
    Cell cell = ((TiledMapTileLayer) tiledMap.getLayers().get(layer)).getCell((int)(col), (int)(row));

    if(cell != null){
        TiledMapTile tile = cell.getTile();

        if(tile != null){
            int id = tile.getId();
            return TileType.getTileTypeById(id);
        }
    }

    return TileType.GRASS;
}

Если я не преобразую col и row в целые числа, то, очевидно, получу ошибку.

Причина, по которой это проблема, заключается в том, что я использую Box2D для проверки столкновений. Я делю все на свою шкалу (10.0f), чтобы симуляции физики были более точными, и я мог заставить игрока двигаться быстрее.

Мне было интересно, есть ли способ получить плитку из местоположения с плавающей запятой вместо местоположения int. Придется ли мне прекратить использовать Box2D для обнаружения столкновений? Меня это устраивает, но я не умею программировать собственное обнаружение столкновений, поэтому, если это так, как мне сделать свое собственное?


person xBegin    schedule 28.10.2017    source источник


Ответы (1)


Если вы используете масштаб для использования Box2D, вам нужно будет снова масштабировать свои координаты.

Если ваш спрайт имеет размер 100 пикселей, то его координата box2d равна 10 м. Tiled требует координаты в пикселях, поэтому просто умножьте их на свой масштаб.

player.sprite.getX() * scale

Конечно, может быть какое-то литье с масштабом.

Надеюсь, это помогло и прокомментируйте, если у вас есть дополнительные вопросы!

person Micheal O'Dwyer    schedule 29.10.2017
comment
Это не сработало, я забыл отметить, что это в моем коде: tiledMapRenderer = new OrthogonalTiledMapRenderer(tiledMap, 4f/Main.scale); - person xBegin; 29.10.2017
comment
Я изменил оператор if на это: if(map.getTileTypeByCoordinate(0, (player.sprite.getX()*(Main.scale)*1.0f), player.sprite.getY()*(Main.scale)*1.0f) == TileType.WATER){ - person xBegin; 29.10.2017
comment
Кроме того, это отлично работает для изготовления коробок: if(!getTileTypeByCoordinate(layer, (int)(x*(16/Main.scale)),(int)(y*(16/Main.scale))).isCollidable()){ //Create body for the tile } - person xBegin; 29.10.2017
comment
Я использую шкалу единиц измерения 1 / Main.scale. Кроме того, почему вы делили на четыре в исходном коде вопроса? Попробуйте распечатать player.sprite.getX()*(Main.scale)*1.0f и player.sprite.getY()*(Main.scale)*1.0f, и они должны дать вам значения X и Y. Это то, что ожидает метод getCell(). Также вы уверены, что ваш масштаб - это PPM (пиксели на метр), потому что Box2D использует метры, а TiledMaps используют пиксели, поэтому ваш масштаб должен быть таким. - person Micheal O'Dwyer; 29.10.2017