Dieses
Tutorial ist eine Einführung in die Benutzung der Windows-Bibliothek
'Cards.DLL zur einfachen und schnellen Realisierung von
Kartenspielen aller Art.
Bereits bei Windows 3.11 war im Installationsumfang eine handvoll
kleinerer Spiele wie Minesweeper, Hearts oder Solitär
enthalten; eine Sammlung, die später je nach Betriebssystem um andere,
z.B. Freecell und Pinball, erweitert wurde.
Zum einen ein
Hinweis darauf, wie 'verspielt' doch der moderne Mensch an seinem
HiTech-Arbeitsplatz ist, zum anderen ein Beweis für die Beliebtheit von
Kartenspielen jeglicher Art - kaum einer meiner Exkollegen, der nicht
schon (besonders während der Arbeitszeit) bei einer Partie Solitär
erwischt worden wäre ;)
Für die
Realisierung von Kartengames greifen Windows und auch andere
Anbieter auf eine sogenannte Entertainment Pack Cardplaying
Helper-DLL zurück. Diese Bibliothek namens Cards.DLL
befindet sich im Windows-Systemordner und enthält die Bitmaps
und einfache Ausgabefunktionen für ein 52-Blatt-Kartenspiel.
Während diese
in der Anfangszeit eine 16-Bit-DLL war, ist sie heute
standardmäßig als 32-Bit-Version verbreitet, weshalb sie
auch unter dem Namen cards32.dll anzutreffen ist.
Ihr Interface ist relativ einfach gehalten, und besitzt folgende
Funktionen:
Function: cdtInit(Initialisierung)
Diese Funktion
muss zu Beginn vor allen anderen
aufgerufen werden. Sie versorgt außerdem die ByRef-Parameter
CardWidth und CardHeight mit den Ausmaßen einer Karte
(in Pixeln).
ByRef CardWidth As Long (Originalbreite einer Karte)
ByRef CardHeight As Long (Originalhöhe einer Karte)
è Long
(Flag für 'Success')
Function: cdtDraw(Karte
darstellen)
Zeichnet die Karte in der
Default-Größe an die angegebene Stelle auf eine Form, PictureBox
oder auf die Fläche eines sonstigen Objekts, das einen hDC
besitzt. Mögliche Grafiken: - eine der 52 Karten-Vorderseiten
oder - eine der 13 verschiedenen Rückseiten oder - eine der
beiden Ablageflächen (mit 'X' oder mit 'O') Kartenbilder können
auch invertiert dargestellt werden, um z.B. eine Auswahl
anzuzeigen.
ByVal hDC As Long (Handle des Ziel-DeviceContext)
ByVal xOrg As Long (X-Position der Karte in Pixeln)
ByVal yOrg As Long (Y-Position der Karte in Pixeln)
ByVal nCard As Long (ID der darzustellenden Grafik)
ByVal nDraw As Long (Flags für Vorder/Rückseite bzw. Invertierung)
ByVal nColor As (Farbe für Rückseite bzw. Invertierung)
è Long
(Flag für 'Success')
Function: cdtDrawExt(Karte skaliert
darstellen)
Besitzt die selben Parameter
wie cdtDraw; außerdem können noch Breite und Höhe der Karte
angegeben werden. Die Grafik wird dadurch verzerrt bzw. skaliert
dargestellt, was jedoch mangels Antialiasing zu recht unansehnlichen
Ergebnissen führt.
ByVal hDC As Long (Handle des
Ziel-DeviceContext)
ByVal xOrg As
Long (X-Position der Karte in Pixeln)
ByVal yOrg As Long
(Y-Position der Karte in Pixeln)
ByVal CardWidth As Long
(darzustellende Breite)
ByVal CardHeight As Long
(darzustellende Höhe)
ByVal nCard As Long
(ID der darzustellenden Grafik)
ByVal nDraw As Long
(Flags für Vorder/Rückseite bzw. Invertierung)
ByVal nColor As OLE_COLOR
(Farbe für Rückseite bzw. Invertierung)
è Long
(Flag für 'Success')
Function: cdtAnimate(Rückseite
animieren)
Folgende der Rückseiten lassen
sich animieren: - Roboter (ID 56) - Burg (ID 63) - Insel (ID 64) -
Kartenhand (ID 65)
ByVal hDC As Long (Handle des Ziel-DeviceContext)
ByVal nCard As Long (ID der darzustellenden Grafik)
ByVal xOrg As Long (X-Position der Karte in Pixeln)
ByVal yOrg As Long (Y-Position der Karte in Pixeln)
ByVal nState As Long (Status der Animation)
è Long
(Flag für 'Success')
Function: cdtTerm(Speicherfreigabe)
Sollte aufgerufen
werden, wenn das Programm beendet wird. Diese Funktion sorgt für
die Freigabe von Speicherplatz.
Für den Parameter nCard sind
zunächst einmal die ID's für die verschiedenen Spielkarten (0 bis
51) interessant. Diese sind so aufgeschlüsselt, dass
immer vier
gleiche Karten beieinander stehen:
Kartenwert
A
As
0
1
2
3
2
Zwei
4
5
6
7
3
Drei
8
9
10
11
4
Vier
12
13
14
15
5
Fünf
16
17
18
19
6
Sechs
20
21
22
23
7
Sieben
24
25
26
27
8
Acht
28
29
30
31
9
Neun
32
33
34
35
10
Zehn
36
37
38
39
J
Bube
40
41
42
43
Q
Dame
44
45
46
47
K
König
48
49
50
51
Falls man für nCard einen Wert von 53 bis 68 einsetzt,
hat man Zugriff auf die Rückseiten und Sondergrafiken. Hierzu
muss der
Parameter nDraw jedoch auf 1 stehen.
53 (kariert)
54 (Geflecht1)
55 (Geflecht2)
56 (Roboter)
57 (Blumen)
58 (Eiche1)
59 (Eiche2)
60 (Fisch1)
61 (Fisch2)
62 (Muschel)
63 (Berg)
64 (Insel)
65 (Kartenhand)
66 (leer)
67 (X)
68 (O)
Der Parameter nColor
wirkt sich dabei auf die Hintergrundfarbe der Rückseite 53
(kariert) aus.
Um Karten zu markieren, sollte vbWhite
verwendet werden; andere Werte funktionieren evtl. nicht
korrekt!
In nDraw werden das Vorder-/Rückseitenflag
und das Invertierungs-(Markierungs)Flag übergeben. Dezimal lauten die
Werte 0 =
Vorderseite 1 = Rückseite 2 = Invertierung und
können nach
Bedarf addiert werden.
Das gezippte Beispielprojekt CardsDemo.vbp besteht aus
lediglich zwei Modulen (frmMain.frm und CardsDll.bas) und
demonstriert verschiedene Einstellungen und Aufrufe. In der Datei
CardsDll.bas sind alle Deklarationen enthalten, so dass
du dieses
Modul einfach in eigene Projekte aufnehmen kannst, um auf alle Funktionen
von Cards.DLL zugreifen zu können.
Der Sourcecode zu diesem Programm ist relativ kurz und
selbsterklärend; auf spezielle Routinen wie das Mischen von Karten und die
interne Darstellung von Stapeln und Gruppen werde ich in einem der
folgenden Teile dieser Tutorialreihe näher eingehen.