2017-10-28 7 views
1

Ich mache gerade ein Spiel. Es ist ein 2D-Kachel-basiertes Spiel. Ich habe versucht, es so zu machen, dass sich die Geschwindigkeit und Größe der Spieler ändert, wenn man auf Wasser tritt.Wie kann ich den Ort einer Kachel von einer Zelle in libGDX mithilfe von Floats erhalten?

Ich betreibe diese jeden 60stel Sekunde:

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; 
} 

Die map.getTileTypeByCoordinate(int layer, float x, float y); Methode ist folgende:

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; 
} 

Wenn ich auf ganze Zahlen nicht col gegossen und die Reihe, dann bekomme ich ein Fehler, offensichtlich.

Der Grund dafür ist, dass ich Box2D verwende, um Kollisionen zu überprüfen. Ich teile alles durch meine Skala (10.0f), so dass die Physik-Simulationen genauer sind und ich den Spieler schneller bewegen kann.

Ich frage mich, ob es eine Möglichkeit gibt, eine Kachel von einer Float-Position anstelle einer int-Position zu bekommen. Muss ich Box2D für die Kollisionserkennung nicht mehr verwenden? Mir geht es gut, aber ich bin nicht gut darin, meine eigene Kollisionserkennung zu programmieren. Wenn das der Fall ist, wie würde ich dann meine eigene machen?

Antwort

1

Wenn Sie Box2D mit einer Waage verwenden, müssen Sie Ihre Koordinaten erneut skalieren.

Wenn Sie Sprite sind bei Pixel 100 dann ist es Box2D-Koordinate ist 10m. Tiled benötigt Koordinaten in Pixeln, also multipliziere einfach mit deiner Skala.

player.sprite.getX() * scale

Natürlich könnte es einige Gießen mit dem Maßstab sein.

Hoffe das geholfen und kommentieren, wenn Sie weitere Fragen haben! Diese

+0

schien nicht zu arbeiten, ich habe vergessen, dies zu beachten in meinem Code ist: 'tiledMapRenderer = new OrthogonalTiledMapRenderer (tiledMap, 4f/Main.scale);' – xBegin

+0

änderte ich die if-Anweisung dazu: 'wenn (map.getTileTypeByCoordinate (0, (player.sprite.getX() * (Hauptskala) * 1.0f), player.sprite.getY() * (Main.scale) * 1.0f) == TileType.WATER) { ' – xBegin

+0

Auch das funktioniert perfekt für die Herstellung der Boxen: ' if (! GetTileTypeByCoordinate (Schicht, (int) (x * (16/Main.scale)), (int) (y * (16/Main.scale))). isCollidable()) { // Körper für die Kachel erstellen } ' – xBegin

Verwandte Themen