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

1

06.06.2018, 12:03

Allgemeines Gamedesign bei einem rundenbasiertem Kartenspiel

Hallo Zusammen

Ich habe eine Frage bezüglich des Gamedesigns eines rundenbasirten 2D Kartenspieles, in meinem Fall das Kartenspiel "Scopa".
Ich komme von der Applikation Entwicklung (C#) und habe daher die ganze Game-Logik in eine Art View-Model-Control Pattern aufgebaut.
Sprich je ein Projekt, welches die Datenhaltung managet, die Services mit der Logik beinhält und eine einfache Konsolenapplikation mit welcher
ich jetzt auch schon "Spielen" kann.

Jetzt möchte ich mit Hilfe von Monogame natürlich ein schönes UI machen und Stocke momentan immer wieder an der Frage was gehört in den Gameloop und was nicht.
Genauer gesagt woher weiss mein Game wer z.B. an der Reihe ist? (Vor allem wenn man gegen die KI spielt). Woher kriegt die UI die Informationen mit, dass sich etwas geändert hat?
Sprich wie verknüpfe ich jetzt genau mein Model mit den Ganzen Spieleinfos mit dem UI.

Muss ich alles Eventbasiert machen und diese updaten dann das UI?
Soll ich eine Art State-Pattern implementieren, welches bei einem State Wechsel das UI updatet?
Oder soll die Logik getrennt werden und alles direkt im Gameloop programmieren, damit das UI immer das korrekte Model darstellt?

Um ein konkretes Beispiel zu nennen:
Ich spiele gegen einen KI-Gegner. Wenn dieser an der Reihe ist... macht es "Schwups", Punktzahl sowie Karten sind weg und ich bin wieder an der Reihe.
Gerne hätte ich dieses ja animiert, damit ich als Spieler sehe was der KI-Gegner gemacht hat.

Ich freue mich auf Eure Hilfe und Tipps.

Grüsse aus der Schweiz

Wirago

Alter Hase

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

2

06.06.2018, 12:58

Vereinfacht gesagt ist ja dein UI nichts anderes als eine Grafik die irgendwo auf deinem Bildschirm dargestellt wird. Entsprechend wird das auch behandelt.
Du hast eine Textur, du hast eine Position und das packst du in deine Draw()-Methode.

Nachdem man in der Regel mehr als nur ein UI-Element hat, lagert man das in entsprechende Klassen aus. In deiner Draw()-Methode (die aus der Game1.cs bei Standardnamen) würdest du nur zB ein UIManager.Draw(spriteBatch); aufrufen und dein UIManager würde dann das UI zusammenstöpseln.

Das Update erfolgt sehr ähnlich. Abhängig von irgendwelchen Aktionen (Spieler klickt irgendwo hin, drückt eine Taste etc.) reagiert das UI dann entsprechend.

3

06.06.2018, 13:34

Hallo Wirago

Danke für deine Antwort.
Das mit dem Texturhandling und dem Draw ist denke ich für mich soweit klar. Es ist eher der zweite Punkt: "Abhängig von irgendwelchen Aktionen"... was ist, wenn diese Aktionen ja nur von der inter-nen Logik z.B. KI-Gegner ausgeführt wird. Der KI-Gegner führt ja z.B. keinen Klick auf eine Karte aus, sondern nach dem dieser seinen Zug beendet hat, ist das Model geändert und der eigentliche Spieler ist wieder an der Reihe.

Wie Update ich in so einem Fall das UI. Fange ich an irgendwelche Events zu implementieren alla: Spieler hat Karte gewählt -> informiere UI welche Karte, Spieler macht seinen Zug -> informiere UI welcher Zug usw.

Vielleicht denke ich auch einfach viel zu weit...

Wirago

Alter Hase

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

4

06.06.2018, 13:50

Zitat

Vielleicht denke ich auch einfach viel zu weit...

Tust du vermutlich. Keep it simple.

Versuche es dir mal das was passieren soll als Ablauf vorzustellen. Ganz ohne Code.
Das könnte zB so aussehen:

Spieler klickt auf Karte
UI zeigt gewählte Karte als "markiert" an
Spieler klickt auf gegnerische Karte
UI "zieht" die gewählte Karte auf die gegnerische Karte


Was bedeutet das für dein UI?
Wenn dein Code einen Klick auf eine Karte registriert, dann sagst du deinem UI, welche Karte selektiert ist. Und wenn eine Karte selektiert ist, dann wird diese entsprechend angezeigt:

Pseudocode für das Karte Auswählen:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Card selectedCard;

void SetSelectedCard(string cardID)
{
    selectedCard = new Card(cardID);
}


void Draw(SpiteBatch spriteBatch)
{
    if(selectedCard != null)
        spriteBatch.Draw(selectedCard.Texture, selectedCardPosition, Color.White);

    //Zeichne Rest vom UI
}


Wenn jetzt dein Computergegner am Zug ist, passiert genau das gleiche. Eine Karte wird selektiert, wird gezogen, etc.

Werbeanzeige