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
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
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
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
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
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
Hi
du musst den Standardnamespace vor den Namen der Resourcendatei setzen.
<StandardNamespace>.<Resourcendatei>
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.
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
ResourceManager ResourceManager = new ResourceManager("FormTest.Resource", Assembly.GetExecutingAssembly());
sollte so funktionieren 🙂