Du bist nicht angemeldet.

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

KeksX

Community-Fossil

  • »KeksX« ist der Autor dieses Themas

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

1

08.02.2010, 22:02

Benötige Denkanstöße für 2D TileEngine

Hallo Community!

Ich habe nun ein paar Spiele mit der SFML gebastelt und bin mit diesen ganz zufrieden. Jetzt möchte ich mit Hilfe der SFML eine (vorerst wirklich simple) Tile Engine basteln, um Erfahrung mit größeren Projekten zu machen.

Ich bin die Arbeit mit einem Framework, das dem Heikos ähnelt, gewohnt. Das heißt die Klasse CFramework behandelt alles wichtige, was die SFML und Events etc angeht, und die Klasse CGame kümmert sich dann um die Spiellogik.
Das ist kein Problem, das kenn ich mittlerweile aus dem FF.
Allerdings habe ich, was dann die Umsetzung der TileEngine angeht, soviele Ideen und komme doch irgendwie nicht zum Punkt.
Hat jemand hier Erfahrung mit simplen TileEngines(vielleicht sogar speziell für die SFML) und kann mir ein paar Denkanstöße oder sogar ein bisschen Pseudo-Code spendieren?


Meine Überlegungen, die meiner Meinung nach was taugen:

- Eine Klasse CTile, die die Ebene, Kollisionsart(wird geblockt oder nicht), und generell das Aussehen des Tiles festhält(Hier das Problem: wie schaffe ich es, in einem sf::Sprite nur einen Auschnitt eines sf::Image zu speichern?
Und noch dazu: Ich benötige mehr als ein Tile. Also wie schaffe ich es, mit Hilfe solch einer Klasse mehrere Teils laden und benutzen zu können?)

- Ein mehrdimensionales array oder "verschachtelter" Vektor, der die Daten der Map speichert. (Hier das Problem: Das zeichnen sollte klargehen. Das jeweilige Sprite des Tiles von der App zeichnen lassen. Aber wie überprüfe ich dann auf Kollisionen?)

- Mehrere Layer. Also die Zeichen-Schleife geht zuerst alle Tiles mit dem Layer "0" durch, sowas wie der Boden, unteren Teile von Objekten undso. Dann die Ebene von beweglichen Sachen wie der Spieler, der ja dann automatisch drübergerendert wird, und zum Schluss dann Sachen die den Spieler überdecken sollen(Dach vom Baum etc). Hier sollte es eigentlich kein Problem geben.


Ihr seht, es sind eigentlich grundlegende Sachen, über die ich mir grad den Kopf zerbreche.
Primär geht es halt darum, dass ich die Klasse CTile noch nicht genau "entschlüsselt" habe. Ich weiß zwar, was sie grundlegend machen soll, aber mir fehlt der entscheidende Hinweis zu dem, wie ich es umsetzen muss. Ich sitze nun schon einige Zeit davor und habe immer wieder an Lösungen rumgeschrieben, aber dann sofort verworfen, weil das alles ins Nichts geführt hat. (Da ist einfach der Wurm drin grad.)

Ich hoffe, dass jemand von euch mir helfen kann. Wie gesagt:
Denkanstöße, Pseudo-Code oder richtiger Code. Ich nehme alles, was mir weiterhilft :].

Danke im Voraus!

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

08.02.2010, 22:26

Hmm. Kommt halt drauf an, was du alles mit den Tiles machen willst. Ein einfaches Tile hat vielleicht lediglich eine ID drin, die beschreibt was es für ein Tile ist. Alleine mit dem kann man allerdings schon recht viel machen.

Kollision lässt sich in einer Tilemap sehr einfach lösen. Da üblicherweise die Abstände jedes Tiles gleich gross ist, kannst du von einer Position direkt auf das Tile schliessen.
z.B
Du hast eine 100x100 Grosse Tilemap. Jedes Tile ist 1x1 Gross. Wenn du jetzt ein Spieler an Position (23.23,12.12) hast, dann weisst du, dass er sich auf dem Tile 23x12 befindet. (ein wenig rumrechen für die Grösse des Spieler usw. muss dann nat. schon auch noch sein).

Ich habe auch mal einen kleinen Artikel über generische Tilemaps geschrieben:
http://www.drakon.ch/?id=&offset=4&mobile=0&show_entry=69

3

08.02.2010, 22:50

Re: Benötige Denkanstöße für 2D TileEngine

Zitat von »"KeksX"«


- Eine Klasse CTile, die die Ebene, Kollisionsart(wird geblockt oder nicht), und generell das Aussehen des Tiles festhält(Hier das Problem: wie schaffe ich es, in einem sf::Sprite nur einen Auschnitt eines sf::Image zu speichern?


sf::Sprite.SetSubRect(int obenlinks, int untenlinks, int obenrechts, untenrechts)

:)

KeksX

Community-Fossil

  • »KeksX« ist der Autor dieses Themas

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

4

08.02.2010, 22:52

Also zur Zeit möchte ich nichts anderes als sie zeichnen und ein Sprite darauf bewegen, dass aber eben nicht überall hinkann. Eben einfach die Funktionalität einer simplen Tilemap.

Ich will also eine Klasse, die bestimmen kann
- welchen Abschnitt eines Bildes das Objekt darstellt(welches Tile es ist)
- auf welchem Layer es gerendert werden muss
- ob das Tile begehbar ist oder nicht.

Deinen Artikel habe ich mir durchgelesen und ich muss sagen, dass ich davon jetzt einiges gelernt hab. Ich habe zwar ähnliche Ansätze, aber auf Templates wäre ich nicht gekommen.

Das heißt, ich brauch eine Struktur für das Tile. Diese Tile-Struktur muss dann nur noch die Textur und alle anderen Infos speichern, und ich kann in der Klasse TileMap speichere ich dann verschiedene Tiles in einem Vektor. In CGame, die ja die Spiellogik behandelt, werden dann eben Mapschemata geladen(aus einem zweidimensionalem Array?) und die einzelnen Teils an den entsprechenden Stellen gerendert. Die Eigenschaften über Blockierung etc werdenn dann mitgeliefert.

Ist da jetzt ein Denkfehler oder habe ich was vergessen?

Zum Thema Kollision:
Wie überprüfe ich denn "im Voraus", ob ein Tile begehbar ist? Wenn ich mich auf 23x12 befinde, muss ich ja vor dem Betreten von 23x11 wissen, ob es begehbar ist. Das habe ich noch nicht so richtig verstanden...(Aber ich muss auch sagen, dass das eher sekundär ist, weil ja nichtmal die Grundlage steht. Wäre über weitere Informationen dennoch dankbar :])

Aber schonmal danke für deinen Post. Wie du hoffentlich uch siehst hat der mir schon was gebracht. ^^


@Môr:
Ja, die Funktion nutze ich bereits brav bei Animationen einzelner Sprites. XD Aber es ist doch so, dass das ganze Bild vorhanden ist, aber nur der Teil gezeigt wird. Für jedes Teil dann das ganze TileSet zu laden und immer nur einen Teil zu zeigen wäre doch ein wenig übertrieben. Oder hab ich da jetzt wieder einen Denkfehler?

5

08.02.2010, 22:55

Du kannst doch nur ein einziges mal das Bild mit allein Tiles laden und dann für die Sprites einfach das SubRect verschieben. So ists zumindestens gedacht. :)

KeksX

Community-Fossil

  • »KeksX« ist der Autor dieses Themas

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

6

08.02.2010, 22:59

Zitat von »"Môr"«

Du kannst doch nur ein einziges mal das Bild mit allein Tiles laden und dann für die Sprites einfach das SubRect verschieben. So ists zumindestens gedacht. :)


Mhm... Ja, irgendwie war ich grad zu blöd auf den Gedanken zu kommen.

Dann könnte ich für jedes Tile ein Sprite mit geändertem Rect auf dieses Bild setzen. Also, stimmt! So dürfte es gehen. :)

So langsam strukturieren sich die Gedanken dazu.^^

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

7

08.02.2010, 23:01

Zitat von »"KeksX"«


Zum Thema Kollision:
Wie überprüfe ich denn "im Voraus", ob ein Tile begehbar ist? Wenn ich mich auf 23x12 befinde, muss ich ja vor dem Betreten von 23x11 wissen, ob es begehbar ist. Das habe ich noch nicht so richtig verstanden...(Aber ich muss auch sagen, dass das eher sekundär ist, weil ja nichtmal die Grundlage steht. Wäre über weitere Informationen dennoch dankbar :])



da innerhalb eines frames weisst du ja wo du gerade stehst. und wenn eine taste gedrückt wird zum laufen, dann aktualisierst du deine position. und dann überprüfst du einfach, ob deine neue position gültig ist. ist sie das nicht, setzte sie einfach zurück ;) also zum beispiel einfach die alte position in einer anderen variablen speichern und die neue position setzen. tritt eine kollision auf, nimm die alte position.
die etwas bessere möglichkeit wäre dass du schaust, wie weit du weitergehen kannst, ohne eine kollision zu haben. das lässt sich mit abstandsberechnugnen sehr einfach bewerkstelligen. das hängt aber auch davon ab, wie du deine kollision gestaltest ;)

reicht dir das als denkanstoß?^^

drakon wenn du wieder über meine rechtschreibung meckerst komm ich mitm gummiknüppel :D hab mir echt mühe gegeben^^

8

08.02.2010, 23:01

Steht auch alles in den guten SFML Tuts. :D
Jedes sf::Image sollte so selten wie möglich geladen werden.
Deswegen ist nen Ressourcenmanager ein großer Vorteil. :)

KeksX

Community-Fossil

  • »KeksX« ist der Autor dieses Themas

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

9

08.02.2010, 23:07

Zitat von »"Môr"«

Steht auch alles in den guten SFML Tuts. :D
Jedes sf::Image sollte so selten wie möglich geladen werden.
Deswegen ist nen Ressourcenmanager ein großer Vorteil. :)


Ja das stimmt. Ich hab einfach in zu kleinen Dimensionen gedacht, denke ich. Ich hatte die ganze Zeit auch sowas im Kopf, aber dann immer mit verschiedenen Images die nur ein paar Tiles haben und was weiß ich. Einfach wirres Zeug... (Wie gesagt, habs ja bei Animationen undso genauso gemacht. Die Tuts habe ich btw auch durch, aber ich bin extrem gut in "Denk soviel über eine Sache nach, die eigentlich viel einfacher ist als du sie dir ausmalst, und denk dann nochmal drüber nach, sodass du dann überhaupt nicht mehr weißt worüber du gerade nachgedacht hast."...)

@TrommlBomml:
Ok. "Jetzt sitzts". Ich hatte es hier auch so auf dem Blatt stehen, auf dem ich die Ideen gesammelt habe. Ich denke, dass ich das versuchen werde.^^


Zum Thema Rechtschreibung:
Für mich ist das kein Problem. Hab voll und ganz verstanden was du sagen wolltest - das zählt.^^

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

10

08.02.2010, 23:19

Zitat von »"TrommlBomml"«


drakon wenn du wieder über meine rechtschreibung meckerst komm ich mitm gummiknüppel :D hab mir echt mühe gegeben^^

Ich mach das eigentlich nur, wenn es wirklich unleserlich ist wird, was bei dir als Berliner ab und zu mal vor kommt.. :P
Aber bei dir scheint wohl die Umschalt Taste zu klemmen, nicht? :lol:

Zitat von »"KeksX"«

Das heißt, ich brauch eine Struktur für das Tile. Diese Tile-Struktur muss dann nur noch die Textur und alle anderen Infos speichern, und ich kann in der Klasse TileMap speichere ich dann verschiedene Tiles in einem Vektor. In CGame, die ja die Spiellogik behandelt, werden dann eben Mapschemata geladen(aus einem zweidimensionalem Array?) und die einzelnen Teils an den entsprechenden Stellen gerendert. Die Eigenschaften über Blockierung etc werdenn dann mitgeliefert.

Ist da jetzt ein Denkfehler oder habe ich was vergessen?

Nein eigentlich ist es das. Es muss kein 2 Dimensionales Array sein. Du kannst den Zugriff dann ja selbst berechnen, aber wenn es dir leichter geht, kannst dus ja mal mit einem 2 Dimensionalem machen.

Also du musst ja nicht alle Daten in einem Tile drin haben. Eine ID ist das wesentlich gescheiter, wenn es sich um statische Daten handelt. Also z.B hat ja jedes Wasser Tile die gleichen Eigenschaften (Textur, Nicht begehbar usw. ). Da macht eine solche Indirektion schon Sinn. Kommt aber halt ein wenig drauf an, was noch so für Daten kommen.

Werbeanzeige