Laden...

Wie Tiles verwalten?

Erstellt von Thomas B vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.429 Views
T
Thomas B Themenstarter:in
223 Beiträge seit 2006
vor 17 Jahren
Wie Tiles verwalten?

Nabend,

Ich versuche mich zur Zeit an Hexfeld basierten Spielfeldern und das Zeichnen des Spielfeldes klappt auch problemlos. Ich kann die Höhe und Breite des Spielfelds, und die Höhe und Breite eines Hexfelds problemlos verändern.
Auf dem Spielfeld bezeichne ich die einzelnen Hexfelder als Tiles.
Es gibt verschiedene Tiles:
welche, die die Sicht blockieren;
welche die den Weg blockieren;
welche die Weg und Sicht blockieren;
welche, die garnichts blockieren.
Ich habe mir da überlegt, eine Tile Klasse zu erstellen, und je nachdem, wie das Tile sich verhalten soll, könnte der Konstruktor anders initialisiert werden.
Andere Möglichkeit wäre, eine Basisklasse zu machen, und von ihr für jede Möglichkeit eine Ableitung zu bilden, wodurch das "Levelbasteln" etwas übersichtlicher wird.
Wie wird da optimalerweise vorgegangen? Ich tendiere ja zu ersteren.

Nun soll es verschiedene Bilder für die Tiles geben. Nicht jedes passierbare Geländestück muss eine Grasfäche sein, es könnte ja auch eine Straße sein. Wie verwalte ich nun den Zusammenhang zwischen Tiles und Grafik?
Wäre da eine Klasse mit statischen Methoden angebracht, ähnlich der Colors/Brushes Klassen?

Gruß Thomas

T
512 Beiträge seit 2006
vor 17 Jahren

Das Problem bei der Geschichte mit der Basisklasse ist ja, dass sie eigentlich schon alles können muss. Du musst von der Basisklasse aus bestimmen können, ob das Feld blockiert oder nicht.

Also eigentlich läufts darauf hinaus, dass deine Basisklasse genau so aussieht, wie in deinem ersten Ansatz. Trotzdem empfielt es sich das ganze schon im Hinterkopf als Basisklasse zu gestalten. Das heißt die Auswertung der einzelnen Dinge in virtuelle Methoden packen, die bei Bedarf überschrieben werden könnten. So hast du dann kein Problem, wenn später z.B. mal ein Feld hinzukommt, was man nur Nachts durchschreiten kann.

Das Zweite klingt für mich verdächtig nach eine Resourcenverwaltung. Da kenne ich mich jetzt nicht so gut aus, weil ich eher resourcenlose Programme schreibe. Ich weiß nur, dass es dafür in .NET schon viele gute Klassen gibt die du benutzen solltest, bevor du das Rad neu erfindest (wie eigentlich fast immer).

e.f.q.

Aus Falschem folgt Beliebiges

T
Thomas B Themenstarter:in
223 Beiträge seit 2006
vor 17 Jahren

Hi Traumzauberbaum,

Ich meine mich zu erinnern, dass das Factory Pattern da auch helfen könnte...ich werde mal nachsehen, aber falls das jemand gleich bestätigen oder dementieren könnte wäre ich auch nicht dagegen. 😉

Diese Resourcen habe ich mal gesehen, als ich die Spielfeldgrafik für mein 4Gewinnt über den FormDesigner eingefügt habe. Habe jetzt nochmal nachgesehen und kann auch einzelne Bilder dort speichern. Aber wie verwende ich nun diese Bilder? Vielleicht kann mir jemand da weiterhelfen. Gibt es eigentlich noch etwas zu beachten bei diesen Resourcen? Werden diese automatisch in einen bestimmten Ordner verschoben/erzeugt?

Gruß Thomas

H
3 Beiträge seit 2006
vor 17 Jahren

Hallo, ich wuerde das ganze anders angehen.
Z.B. mit Layern. um verdeckende Felder zu machen, oder übergänge.
Dazu ein Array mit Feldern, die man nicht betreten darf.

oder aber du machst das ganze "ID" abhängig.
z.b. das man eine Felstextur nicht betreten kann.

Also einfach ne Liste mit Texturen die man nicht betreten kann (oder andersrum).

Aber das hängt ganz davon ab was du vor hast.


MfG,
HeftiSchlumpf

T
Thomas B Themenstarter:in
223 Beiträge seit 2006
vor 17 Jahren

Hi HeftiSchlumpf,

Übergänge bekomme ich doch, wenn ich die passenden Tiles aneinander setzen würde. Zur Zeit zeichne ich einfach mit GDI+ auf der Form.
Das Hexfeld Brett könnte später für ein rundenbasiertes Strategiespiel herhalten. Aber es geht mir um den Lerneffekt.
Es sollen aber definitiv auch Testeinheiten sich auf den Feldern bewegen.
Ich habe eine Struktur Hexfeld, für die Erzeugung der Felder und eine Klasse Tile, um eben ein Tile abbilden zu können. Im Tile wird die Position gespeichert , sowohl die Position in Pixeln (durch die Hexfeld Struktur, zum Zeichnen), als auch die Position auf dem Spielfeld in Form von X und Y Werten.

Gruß Thomas

T
Thomas B Themenstarter:in
223 Beiträge seit 2006
vor 17 Jahren

Mahlzeit,

Ich habe ein wenig zu Ressourcen gesucht und auch was gefunden. Jetzt habe ich auf folgende Weise meine Ressourcen eingebunden:


this.mResourceManager = new ResourceManager("Resource", this.GetType().Assembly);

            Image Image = (System.Drawing.Image)this.mResourceManager.GetObject("tile_grass");

Beim Aufrufen meiner Form kommt es nun zur Fehlermeldung, dass die Datei Resource.resource nicht gefunden wird. Wieso sucht der nach der Endung resource, wenn die Ressourcen doch die Endung resx haben? Ich habe eine Ressource über Klasse hinzufügen, Ressourcendatei erzeugt. Dort habe ich die einzelnen Bilder eingefügt und wollte nun eins aus dieser Datei (Resource.resx) aufrufen.

Gruß Thomas

664 Beiträge seit 2005
vor 17 Jahren

Hi

du musst den Standardnamespace vor den Namen der Resourcendatei setzen.
<StandardNamespace>.<Resourcendatei>

edit: Bitmap als ressource an Projekt anbinden

T
Thomas B Themenstarter:in
223 Beiträge seit 2006
vor 17 Jahren

Hi langalaxy,

So funktioniert es:


Image Image = (System.Drawing.Image)global::FormTest.Resource.tile_grass_mud;

Ich werds dann erstmal so belassen. Danke dir.

Gruß Thomas

€: Habe den Fehler nun gefunden. Es hätte bei obigen Code ebenfalls FormTest. heißen müssen anstelle von GameName.

T
Thomas B Themenstarter:in
223 Beiträge seit 2006
vor 17 Jahren

Hallo,

Neues Problem:


ResourceManager ResourceManager = new ResourceManager("FormTest.Resource", this.GetType().Assembly));

Ich habe mir nun eine statische Methode zum erzeugen von Tiles gebastelt. Die statische Methode befindet sich in einer statischen Klasse und dort kann ich natürlich nicht mit "this." arbeiten. Was für eine Angabe muss denn nun dahin?

Gruß Thomas

664 Beiträge seit 2005
vor 17 Jahren
ResourceManager ResourceManager = new ResourceManager("FormTest.Resource", Assembly.GetExecutingAssembly());

sollte so funktionieren 🙂

T
Thomas B Themenstarter:in
223 Beiträge seit 2006
vor 17 Jahren

Hi,

Damit funktioniert es, danke.

Gruß Thomas