|
Chips und Jetons |
[ Top ]  |
Chips:
|
Damit die ganze Sache etwas spannender wird,
wollen wir - wie in einem Casino üblich - Chips als Spieleinsatz
verwenden. Hierzu habe ich mit Paint ein paar einfache
16-Farben-Bitmaps entworfen, die die Werte von 1 bis 5000
abdecken. Neben der normalen Darstellung (32 x 32 Pixel) brauchen wir
jeweils noch eine liegende Variante (32 x 18 Pixel), um auch das Stapeln
optisch ansprechend realisieren zu können.
|
|
|
Jetons:
|
Obwohl wir in 17-und-4 nur Chips verwenden, möchte ich der Vollständigkeit halber
hier noch Jetons (48 x 32 Pixel, liegend: 48 x 18 Pixel)
vorstellen, die man in ähnlichen Spielen, bei denen es um größere Einsätze
geht (Poker, Börse, Roulette oder Monopoly), benutzen kann. Sie decken
den Bereich 10000 bis 500 Mio. ab, und du kannst sie gerne
in eigenen Projekten verwenden ;)
|
|
|
Verwaltung:
|
Alle Eigenschaften und
Funktionen, die mit den Spielchips zu tun haben, werden in der Klasse
Chips gekapselt.
|

|
Nach der Deklaration eines Chips-Objektes muss zuerst
die Sub Init aufgerufen werden.
Sie
benötigt als Parameter die Ziel-Form (auf der die Chips dargestellt
werden sollen), eine ImageList (welche die Chip-Bitmaps enthält),
eine Pixel-Position (Bereich, in dem die Darstellung erfolgen soll), die
Anzahl der Spalten und Reihen (der gestapelten Chips).
|
|
Nun können mit der Sub Add Chips aufgenommen werden. Als Parameter
wird der Wert des neuen Chips verlangt - also eine der Zahlen 1,
2, 5, 10, 20, 50, 100,
200, 500, 1000, 2000 und
5000.
|
|
Die aktuelle Anzahl der Chips lässt sich mit der Property
Count ermitteln,
|
|
den Gesamtwert der Chips kann man mit der Property Sum abfragen,
|

|
den Wert eines bestimmten Chips liefert die Function
Value, der man als Parameter dessen
Nummer übergibt, also eine Zahl zwischen 1 und N,
wobei N die Anzahl der (in diesem Bereich) vorhandenen Chips
ist.
|

|
Um Chips zu entfernen, wird die Sub Delete verwendet Ihr übergibt man ebenfalls
die Nummer (1...N) des zu löschenden
Chips.
|

|
Die grafische Ausgabe erfolgt über die Sub Show. Sie baut den kompletten Bereich mit
allen Stapeln auf (von links nach rechts). Falls der Bereich
zu klein für
alle Chips ist, werden nur so viele dargestellt, wie in den Bereich
passen.
|
|
Will man herausfinden, ob sich der Benutzer mit dem
Mauszeiger über einem bestimmten Chip befindet, kann man sich von der
Function HitChip, die ein Paar
Pixel-Koordinaten verlangt, die Nummer (1...N) des Chips
liefern lassen (bzw. 0, falls sich an der angegebenen Position kein
Chip befindet).
|

|
Möchte man sich einen Chip einwechseln lassen (z.B. einen
200er in zwei 100er), dann kann man die Sub Split dazu bemühen. Sie benötigt als
Parameter die Nummer (1...N) des Chips. Durch den
Wechselvorgang neu entstehende Chips werden auf den letzten Stapel
gelegt. Am Beispiel der 100er wird das Wechseln nach folgendem Prinzip
durchgeführt:
100 -> 50 + 20 + 20 + 10 200 -> 100
+ 100 500 -> 200 + 200 + 100
|

|
Auch der umgekehrte Vorgang, das Zusammenfassen von Chips,
ist möglich. Dies erledigt die Sub Merge. Sie wechselt alle Chips in
größtmögliche Beträge ein und sortiert den entstehenden Stapel gleich
noch, wobei die höherwertigen Chips zuunterst liegen.
|

|
Falls man die Nummer eines Chips mit einem bestimmten Wert
benötigt, kann man die Function ValueChip verwenden. Ihr übergibt man als
Parameter den Wert des gesuchten Chips und bekommt dann seine
Nummer
(1...N) zurückgeliefert. Steht kein Chip dieses Wertes zur
Verfügung, werden automatisch höherwertige Chips solange eingewechselt,
bis der verlangte Chip vorhanden ist.
|
|
Mit der Sub Clear
lässt
sich schließlich noch der Chip-Bereich (optisch) löschen.
|
Darstellung:
|
Da die Bitmaps der Chips
in ImageLists untergebracht sind, ist es ein Einfaches, sie
mithilfe der Draw-Methode der ImageList auszugeben. Diese
Methode benötigt als Parameter einen hDC (DeviceContext-Handle), die
Zielkoordinaten (in Pixeln) und ein Flag, mit dem man z.B. die
transparente Ausgabe erzwingen kann.
|
|
 |
Public Sub Show()
'alle ChipStapel aufbauen
Dim col As Long, row As Long, i As Long
Dim x As Long, y As Long
Clear
If (MyChips = 0) Then Exit Sub
i = 1
col = 0
x = MyX
Do
row = 0
y = MyY + MyHeight - CHIPHEIGHT
Do
MyIml.ListImages("c" & MyChip(i).Value).Draw _
MyForm.hDC, x, y, imlTransparent
i = i + 1
If (i > MyChips) Then Exit Sub
row = row + 1
y = y - CHIPOFFSET
Loop Until (row = MyRows)
col = col + 1
x = x + CHIPWIDTH
Loop Until (col = MyCols)
End Sub
|
 |
|
Auch beim In-die-Hand-nehmen eines Chips wird
im MouseDown-Event der frmMain diese Methode verwendet, um
einen Chip auf die frmChip zu zeichnen.
|
In der ImageList
werden die einzelnen Bitmaps über ihre Key-Eigenschaft
angesprochen, die sich wie folgt zusammensetzt: "c" & <Wert des
Chips> (z.B. 'c50', um den 50er zu holen).
|
Animation:
|
Sobald der Spieler mit der
Maus auf einen seiner Chips klickt, wird dieser aus dem Stapel entfernt
und (in seiner Draufsicht) auf eine vorbereitete Form gezeichnet, die eine
kreisrunde Fläche in der Größe eines Chips hat. Auch diese frmChip
wird bereits bei Programmstart mithilfe der Sub CreateChipForm vorbereitet. Dazu wird, genau wie bei
der Sub CreateCardForm (s.o.) die API
verwendet, um mit dem Zuweisen einer Region den Umriss
zu
beeinflussen.
|
Der MousePointer wird gleichzeitig in eine offene
Hand verwandelt, damit der Eindruck entsteht, man würde den Chip wirklich
festhalten bzw. über den Tisch schieben.
|
MousePointer für das Halten eines Chips:
|
 |
|
Solange der Spieler die Maustaste
gedrückt hält, werden alle Bewegungen im MouseDown-Event der
frmMain registriert und an die frmChip
weitergeleitet. Erst wenn man die Maustaste loslässt, wird im
MouseDown-Event die frmChip wieder ausgeblendet und es
erfolgt die Abfrage über den 'Landeplatz' des Chips. Hierbei gibt es
dann drei Möglichkeiten:
|
1. Der Chip wurde in den Pot
gelegt.
Dies bedeutet,
dass der Spieler einen Einsatz machen, bzw.
diesen erhöhen will. Es ist zu prüfen, ob die Bank mithalten kann, denn
sie muss jetzt ebenfalls diesen Betrag bringen. Hat die Bank zuwenig Geld
auf ihrem Konto, erscheint eine entsprechende MessageBox ("Die Bank kann
leider nicht mithalten!") und der Chip wandert zurück auf den Stapel des
Spielers. Ansonsten fällt er in den Pot und die Bank legt ihren Chip
dazu.
|
2. Der Chip wurde in den Chip-Bereich der Bank
gelegt. Falls der
Chip einen Wert größer
1 hat, wird er in
kleinere Chips gewechselt, die auf dem Stapel des Spielers
landen.
|
3. Der Chip wurde woanders abgelegt.
Das ist
nicht
sinnvoll, also wandert er zurück auf den Stapel des
Spielers.
|
Einwechseln:
|
Zum 'Kleinmachen' eines Chips gibt es zwei Möglichkeiten: Zum einen kann man ihn in den
Chip-Bereich der Bank fallen lassen, zum anderen kann man mittels
Rechtsklick auf einen Spielerchip ein kleines PopUp-Menü erscheinen
lassen, welches auch den Menüpunkt Wechseln enthält.
|
Zum Wechseln in große Chips kann man ebenfalls dieses PopUp-Menü
aufrufen und den Punkt 'zusammenfassen' anwählen. Dies bewirkt die
Umwandlung der Spielerchips in die größtmöglichen Werte; gleichzeitig
werden die Chips sortiert (höherwertige zuunterst).
|
|
|