Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
2D Gitter mit Position erzeugen
Exorior
myCSharp.de - Member



Dabei seit:
Beiträge: 9

Themenstarter:

2D Gitter mit Position erzeugen

beantworten | zitieren | melden

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 :P)


Viele Grüße
Exorior
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.389

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.928

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Exorior
myCSharp.de - Member



Dabei seit:
Beiträge: 9

Themenstarter:

beantworten | zitieren | melden

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 :-(
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 2.002
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.389

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Exorior
myCSharp.de - Member



Dabei seit:
Beiträge: 9

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers