Spielprogrammierung mit Java
HomeAufgabenDruckenJava-Online

Karten animiert anzeigen


1. Hand-Layout animiert anzeigen

Bei der Verwendung von RowLayot, ColumnLayout oder FanLayout können die Karten animiert dargestellt werden, indem man mit der Methode setStepDelay() die Wartezeit zwischen sich folgenden Anzeigen festlegt. Diese Ergänzung bewirkt eine professionell aussehende Kartenanzeige.

Im folgenden Beispiel wird ein RowLayout und ein FanLayout animiert angezeigt.

Programmcode für lokale Bearbeitung downloaden (CardGameEx2.zip)

 

Programmcode:

// CardGameEx2.java

import ch.aplu.jcardgame.*;
import ch.aplu.jgamegrid.*;

public class CardGameEx2 extends CardGame
{
  public enum Suit
  {
    KREUZ, KARO, HERZ, PIK
  }

  public enum Rank
  {
    ASS, KOENIG, DAME, BUBE, ZEHN, NEUN, ACHT, SIEBEN, SECHS
  }
  private Deck deck = new Deck(Suit.values(), Rank.values(), "cover");
  private Hand[] hand;

  public CardGameEx2()
  {
    super(600, 600, 50);
    hand = deck.dealingOut(2, 6);
    RowLayout rowLayout1 = new RowLayout(new Location(300, 200), 400);
    rowLayout1.setStepDelay(10);
    hand[0].setView(thisrowLayout1);
    hand[0].draw();
    FanLayout fanLayout = new FanLayout(new Location(300, 1100), 700, 260, 280);
    fanLayout.setStepDelay(10);
    hand[1].setView(thisfanLayout);
    hand[1].draw();
  }

  public static void main(String[] args)
  {
    new CardGameEx2();
  }
}

Erklärungen zum unten stehenden Programmcode:
rowLayout.setStepDelay(10)
Jede nächste Ansicht wird mit einer Verzögerung von 10 ms angezeigt

 

2. Karten von einer Hand zur anderen Hand verschieben

Die animierte Verschiebung von einer Hand in die andere ist mit der Methode transfer() einfach zu programmieren. Zu Beginn werden zwei Hands mit je 7 Karten erzeugt. Die Karten verschieben sich einzeln von der ersten zu der zweiten Hand. Am Zielort werden sie mit der Methode sort() zuerst nach Farbpriorität, dann nach Wert eingeordnet.

Programmcode für lokale Bearbeitung downloaden (CardGameEx3.zip)

 

Programmcode:

// CardGameEx3.java

import ch.aplu.jcardgame.*;
import ch.aplu.jgamegrid.*;

public class CardGameEx3 extends CardGame
{
  public enum Suit
  {
    KREUZ, KARO, HERZ, PIK
  }

  public enum Rank
  {
    ASS, KOENIG, DAME, BUBE, ZEHN, NEUN, ACHT, SIEBEN, SECHS
  }
  private Deck deck = new Deck(Suit.values(), Rank.values(), "cover");
  private final int nbPlayers = 2;
  private final int nbCards = 7;
  private Hand[] hands;

  public CardGameEx3()
  {
    super(600, 600);
    hands = deck.dealingOut(nbPlayers, nbCards);
    RowLayout rowLayout = new RowLayout(new Location(300, 450), 350);
    hands[0].setView(thisrowLayout);
    hands[0].draw();
    RowLayout rowLayout1 = new RowLayout(new Location(300, 150), 350);
    hands[1].setView(thisrowLayout1);
    hands[1].draw();
    moveCards();
  }

  private void moveCards()
  {
    for (int = 0; i < nbCards; i++)
    {
      Card top = hands[0].getFirst();
      hands[0].transfer(top, hands[1], true);
      hands[1].sort(Hand.SortType.SUITPRIORITY, true);
    }
  }

  public static void main(String[] args)
  {
    new CardGameEx3();
  }
}

Erklärungen zum unten stehenden Programmcode:
Card top = hands[0].getFirst()
Liefert die erste Karte der Hand
hands[0].transfer(top, hands[1], true);
Die Karte top wird aus der hand[0] zu der hand[1] verschoben. Der Parameter true bewirkt, dass die modifizierten Hands neu dargestellt

hands[1].sort(Hand.SortType.SUITPRIORITY, true)

Die Karten in der hand[1] werden neu gemäss dem angegebenen Sortiertyp sortiert. Der Parameter true bewirkt, dass die Hand anschliessend neu dargestellt wird

 

3. Einzelne Karten von Position zu Position bewegen

Eine Karte soll sich von der rechten unteren Ecke des Spielfensters zur linken obere Ecke bewegen. Will man eine Karte, die nicht zu einer Hand gehört, darstellen, muss man eine Instanz der Klasse Card erzeugen. Das zugehörige Spritebild wird mit den Parametern aus deck definiert. Da die Kartendarstellung normalerweise über die Klasse Hand erfolgt, muss bei der Darstellung von einzelnen Karten die Kartendarstellung aus den Angaben im associateActor() zuerst berechnet werden.
Mit der Methode addActor() wird dieser CardActor an der gegebenen Position zum GameGrid hinzugefügt und kann mit der Methode slideToTarget() an eine neue Position bewegt werden.

Programmcode für lokale Bearbeitung downloaden (CardGameEx3.zip)

 

Programmcode:

// CardGameEx4.java

import ch.aplu.jcardgame.*;
import ch.aplu.jgamegrid.*;

public class CardGameEx4 extends CardGame
{
  public enum Suit
  {
    KREUZ, KARO, HERZ, PIK
  }

  public enum Rank
  {
    ASS, KOENIG, DAME, BUBE, ZEHN, NEUN, ACHT, SIEBEN, SECHS
  }
  private Deck deck = new Deck(Suit.values(), Rank.values(), "cover");

  public CardGameEx4()
  {
    super(600, 600, 30);
    Card card1 = new Card(deck, Suit.HERZ, Rank.ASS);
    Card card2 = new Card(deck, Suit.HERZ, Rank.KOENIG);
    Card card3 = new Card(deck, Suit.HERZ, Rank.DAME);
    Card card4 = new Card(deck, Suit.HERZ, Rank.BUBE);
    card1.associateActor(1, 0);
    addActor(card1.getCardActor(), new Location(400, 400));
    card1.slideToTarget(new Location(240, 300), 5, true);
    card2.associateActor(1, 0);
    addActor(card2.getCardActor(), new Location(100, 100));
    card2.slideToTarget(new Location(280, 300), 5, true);
    card3.associateActor(1, 0);
    addActor(card3.getCardActor(), new Location(400, 100));
    card3.slideToTarget(new Location(320, 300), 5, true);
    card4.associateActor(1, 0);
    addActor(card4.getCardActor(), new Location(100, 400));
    card4.slideToTarget(new Location(360, 300), 5, true);
  }

  public static void main(String[] args)
  {
    new CardGameEx4();
  }
}

Erklärungen zum unten stehenden Programmcode:
Card card = new Card(deck, Suit.HERZ, Rank.ACE)
Dem CardActor wird eine Karte aus dem deck zugeordnet
card.associateActor(1, 0)

Berechnet die Kartendarstellung mit dem gegebnene Skalierungsfaktor und Drehwinkel

addActor(card.getCardActor(), new Location(400, 400))
Der CardActor wird an der gegebener Position zum GameGrid hinzugefügt

card.slideToTarget(new Location(100, 200), 5, true)

Der actor bewegt sich zu der neuen Position