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:
// 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(this, rowLayout1); hand[0].draw(); FanLayout fanLayout = new FanLayout(new Location(300, 1100), 700, 260, 280); fanLayout.setStepDelay(10); hand[1].setView(this, fanLayout); hand[1].draw(); } public static void main(String[] args) { new CardGameEx2(); } } |
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:
// 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(this, rowLayout); hands[0].draw(); RowLayout rowLayout1 = new RowLayout(new Location(300, 150), 350); hands[1].setView(this, rowLayout1); hands[1].draw(); moveCards(); } private void moveCards() { for (int i = 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(); } } |
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.
|
![]() |
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(); } } |
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 |