Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
public class Play implements Screen { private SpriteBatch batch; private TiledMap map; private OrthogonalTiledMapRenderer renderer; private OrthographicCamera camera; private ArrayList<Tile> tileList; @Override public void show() { // TODO Auto-generated method stub batch = new SpriteBatch(); map = new TmxMapLoader().load("map.tmx"); renderer = new OrthogonalTiledMapRenderer(map); // After "show", "resize" will be called anyway, so we have not to give the size here camera = new OrthographicCamera(); TiledMapTileLayer tileLayer = (TiledMapTileLayer)map.getLayers().get(0); tileList = new ArrayList<Tile>(); // Go through all tiles for (int x = 0; x < tileLayer.getWidth(); x++) { for (int y = 0; y < tileLayer.getHeight(); y++) { //Cell cell = tileLayer.getCell(x, y); // Create a new "tile" Tile tile = new Tile(); tile.setPosition((15 * x) / 2 - tile.getWidth() / 2, (15 * y) / 2 - tile.getHeight()); // Add the tile to the list tileList.add(tile); } } } @Override public void render(float delta) { // TODO Auto-generated method stub // Handle the user's input handleInput(); Gdx.gl.glClearColor(0, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); renderer.setView(camera); renderer.render(); batch.begin(); for (int i = 0; i < tileList.size(); i++) { // EDIT: HIER IST DAS HAUPTPROBLEM! // //tileList.get(i).draw(batch); } batch.end(); } |
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
public class Tile extends Sprite { private Vector2 position; private Sprite sprite; private Texture texture; public Tile() { position = new Vector2(0,0); texture = new Texture(Gdx.files.internal("tile2.png")); sprite = new Sprite(texture); // DEBUG OUTPUT System.out.println("TILE"); } //********// // SETTER // //********// public void setPosition(float x, float y) { position.set(x, y); sprite.setPosition(position.x, position.y); } public void setPosition(Vector2 pos) { position.set(pos); sprite.setPosition(position.x, position.y); } //********// // GETTER // //********// public Vector2 getPosition() { return position; } public float getPosition_X() { return position.x; } public float getPosition_Y() { return position.y; } public Sprite getSprite() { return sprite; } } |
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Mal was ganz anderes: Du solltest nicht für jedes Tile die Textur immer und immer wieder laden. Lade sie irgendwo zentral und lass dir die geladene Textur zurückgeben. Ich würde dir außerdem empfehlen nicht von Sprite abzuleiten. Ein Tile ist kein Sprite, es wird durch ein Sprite dargestellt.
Quellcode |
|
1 |
tileList.get(i).getSprite().draw(batch); |
Wird die Position falsch übergeben, sobald es in die Liste "gepusht" wird?
Wie soll das Ergebnis denn aussehen?
Am Ende soll jede Zelle ein Tile "in sich haben". Was auch ein Problem ist, dass ich nicht genau weiß, wo Tiled die Position 0|0 setzt. Bei LibGDX ist das unten links. Da frage ich mich, warum der Ursprung der Map in der Screenmitte gezeichnet wird (sieht man bei dem Bild nicht, da die Kamera bereits bewegt wurde).
Am Ende soll jede Zelle ein Tile "in sich haben". Was auch ein Problem ist, dass ich nicht genau weiß, wo Tiled die Position 0|0 setzt. Bei LibGDX ist das unten links. Da frage ich mich, warum der Ursprung der Map in der Screenmitte gezeichnet wird (sieht man bei dem Bild nicht, da die Kamera bereits bewegt wurde).
Mir ist grad tatsächlich nicht klar welchen Ausschnitt ein Tile einnimmt. Kannst du das vielleicht mal markieren? In deinem Screenshot gibt es ja einerseits die weißen Umrisse und andererseits die roten Punkte.
Das mit der Mitte des Bildschirms liegt vielleicht an der Kamera. Ich habe ewig nicht mit LibGDX gearbeitet aber möglicherweise ist das einfach der Punkt. Wie sieht das ganze denn aus wenn du die Kamera nicht bewegst? Wie sieht das ganze aus wenn du überhaupt keine Kamera nutzt? Zusätzlich noch mal, wie soll es denn aussehen Entweder beschreibst du wie es sein soll oder machst vielleicht ein kleines Beispiel mit Gimp oder Paint.
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Das war jetzt ehrlich gesagt auch nicht ganz die Verbesserung, die ich im Kopf hatte. Damit greifst du auf die Interna eines Tiles zu. Warum gibst du einem Tile nicht eine Draw-Funktion und lässt es das Sprite selbst zeichnen? Da muss der Aufrufer überhaupt nicht wissen, wie ein Tile intern funktioniert.tileList.get(i).getSprite().draw(batch);
Eigentlich bin ich jetzt mehr verwirrt als vorher. Eine TileMap besteht üblich ja aus Tiles. Die sind bei dir aber angeblich nur 3x3 Pixel groß, was extrem winzig ist. Oder sind sie 15x15 groß? Dann verstehe ich aber nicht, was eine Zelle sein soll und wieso die TileMap aus Zellen und nicht aus Tiles besteht. Sollte das dann nicht eine Zellmap sein?Die TileMap besteht aus 15x15 Pixel großen Texturen, welche nur am Rand weiß sind, ansonsten in der Mitte komplett schwarz. Das ist eine Zelle. Ein Tile ist ein 3x3 Pixel großer roter "Punkt". Dieser soll mittig in eine Zelle platziert werden. Das sieht ungefähr so aus: (siehe Anhang). Mehr soll erstmal nicht passieren. Soweit alles klar?
Werbeanzeige