Laden...

2D Gitter mit Position erzeugen

Erstellt von Exorior vor einem Jahr Letzter Beitrag vor einem Jahr 809 Views
E
Exorior Themenstarter:in
9 Beiträge seit 2013
vor einem Jahr
2D Gitter mit Position erzeugen

Hallo Community 😉

ich versuche gerade mein erstes eigenes kleines Spiel in C# zu entwickeln.
Menü, Lobby etc. habe ich bereits erstellt und bin jetzt an dem Punkt das Spielfeld aufzurufen.

Hier hätte ich gerne ein Gitter (ähnlich wie Schach) auf dem ich die Spieler platzieren kann.
Der Spieler selbst soll sich selbst bewegen können und danach auf Runde beenden klicken.

Wie könnte ich so etwas relativ einfach umsetzen?
Zuerst kam mir die Idee einfach Panels zu platzieren und diese z.B. mit A1, A2, B1 zu beschriften... ist aber iwie nicht so cool.
Ich bin bereits auf GDI+ gestoßen, kann damit bisher aber noch nichts anfangen.

Für Ideen oder Anregungen wäre ich sehr Dankbar (bitte nicht zu kompliziert 😛)

Viele Grüße
Exorior

4.931 Beiträge seit 2008
vor einem Jahr

Das einfachste ist es, ein Panel zu benutzen und darauf dann das Gitter sowie die Spieler zu zeichnen, s.a. [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox).
Falls du mittels Maus die Spieler bewegen möchtest, dann schau auch in [Tutorial] Gezeichnete Objekte mit der Maus verschieben, ansonsten mit der Tastatur die KeyDown/-Press/-Up-Ereignisse benutzen.

Intern in deiner Logik solltest du ein 2D-Array benutzen, das die einzelnen Felder (leer, Spieler, Hindernis, ...) repräsentiert.

16.806 Beiträge seit 2008
vor einem Jahr

Allgemeine Infos: [FAQ] Wie finde ich den Einstieg in die 3D-Programmierung mit C#? (Ja, auch mit 3D Technologien kann man 2D machen, steht im Thread).
Auch wenn die Themen etwas älter sind, so gelten sie grundlegend noch heute.

E
Exorior Themenstarter:in
9 Beiträge seit 2013
vor einem Jahr

Ich habe mir jetzt Testweise eine Klasse Battlefield und eine Form mit Panel angelegt. Im Endeffekt soll mein Spielfeld genau so aussehen 😉 soweit so gut.
Hier der Code:


class Battlefield
{
        private int[,] tiles = new int[14, 9];
        private const int size = 40;
        private const int space = 1;

        public void Draw(Graphics g)
        {
            Brush brush;
            for (int j = 0; j < tiles.GetLength(1); j++)
            {
                for (int i = 0; i < tiles.GetLength(0); i++)
                {
                    brush = Brushes.Gray;
                    g.FillRectangle(brush, i * (size + space), j * (size + space), size, size);
                }
            }
        }
    }

Das Ganze rufe ich über das Paint Event des Panels auf:


private void panel1_Paint(object sender, PaintEventArgs e) 
{
            Battlefield bf = new Battlefield();
            bf.Draw(e.Graphics);
}

Im Hintergrund habe ich nun eine MySQL DB laufen und die Felder "player01_pos" und player02_pos. Jeweils als Int Wert.

Zunächst würde ich in der Theorie nun einen Spieler auf ein Feld zeichnen und dessen Position entsprechend in der DB abspeichern.
Ich habe allerdings keinen Plan wie ich die entsprechende Position des Spielers ermitteln und speichern kann???

Sry, das Thema Draw ist noch komplett neu für mich und leider helfen mir die Tutorials im Internet nicht wirklich weiter 😦

T
2.219 Beiträge seit 2008
vor einem Jahr

Wozu eine SQL Datenbank wie MySQL?
Du kannst die Daten einfach im Speicher halten, gehört zu den Grundlagen von C# und OOP im allgemeinen.
Ansonsten nimmt man für Anwendunen eher SQLite als embedded DB.

Je nachdem wie deine Spieler Klasse bzw. eher Spielfigur aussieht, sollte diese eine Eigenschaft Position haben.
Dort musst du dann die X/Y Position drin speichern.
Die Spielfiguren müssen dann ihr Spielfeld kennen und die entsprechenden Positionen liefern.
Bei Bewegungen musst du dann die Position, wenn diese züge gültig sind, dann verschieben.
Ist eigentlich simple Addition/Subtraktion mit X/Y Position.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

4.931 Beiträge seit 2008
vor einem Jahr

Für die Position der Spieler kannst du den Datentyp Point (mit X und Y) nehmen und erzeugst dann in deiner Battlefield-Klasse einen weiteren Member dafür, z.B. als Array oder List<Point> - je nachdem ob die Spieleranzahl dynamisch ist.
Und dann zeichnest du an diesen Spielerpositionen (ähnlich wie die Berechnung des Gitters).

Deine Battlefield bf sollte jedoch ein Member der Form-Klasse sein (keine lokale [temporäre] Variable), damit du zur Laufzeit genau ein Objekt hast und auch von anderen Methoden darauf zugreifen kannst.

Du solltest allerdings zuerst mal den Code ohne DB-Anbindung ausprogrammieren, so daß du nicht mehrere Baustellen gleichzeitig hast.
Generell sollte dazu dein Programmaufbau entsprechend [Artikel] Drei-Schichten-Architektur sein.

PS: Eigentlich sollte die Darstellung (d.h. die Draw-Methode) nicht Teil deiner Logikklasse Battelfield sein, damit du eine strikte Trennung von Logik und UI hast.
Je nachdem wie umfangreich die Darstellung wird, könntest du eine von Panel abgeleitete Control-Klasse BattlefieldPanel erstellen (oder alternativ als UserControl) und dort dann die Zeichenfunktionen implementieren.

E
Exorior Themenstarter:in
9 Beiträge seit 2013
vor einem Jahr

Danke schon mal für die Hilfe 🙂
Ist echt Klasse die Community hier 👍

Ich werde deine Vorschläge versuchen umzusetzen und mich noch ein wenig in gdi+ einlesen.

Grüße
Exorior