Probleme mit Spielkarten?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

bruce85

Betreff: Probleme mit Spielkarten?

BeitragFr, Feb 17, 2012 17:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich versuche gerade ein Kartenspiel zu schreiben, leider fehlen mir ein Paar ansätze.
Hier erstmal ein Bild von den Spielkarten:
user posted image

Ich möchte, das die Karten dann etwas nach links gedreht werden, so z.B.
user posted image

Ich müsste ja eigentlich die anzahl der Karten durch 2 rechnen und den Winkel dann dazu addieren und Rotation erneut berechnen, leider bekomme ich das nicht richtig hin.

Hier mal der Code, wo die Karten gezeichnet werden:
BlitzMax: [AUSKLAPPEN]
For Local i:Int=0 To SpielerAnzahl-1
X=Spieler[i].X+63
Y=Spieler[i].Y+2
W=0
SetColor 200,200,200
For Local j:Int=0 To Spieler[i].CardAnz-1
SetRotation(j*10)
X = X + Cos(W)*12
Y = Y + Sin(W)*12
Spieler[i].Card[j].X = X
Spieler[i].Card[j].Y = Y
DrawImage S_card01,Spieler[i].Card[j].X,Spieler[i].Card[j].Y,Spieler[i].Card[j].Frames
W = (W+10)
Next
SetRotation(0)
SetColor 200,200,200
DrawImage S_Oval,Spieler[i].X,Spieler[i].Y
SetColor 50,50,50
'DrawText "W: "+S.W,S.X+20,S.Y+10
Next


Die Karten sind im Moment noch mit Arrays erstellt worden, die eine Feste größe haben, dies änder ich noch mit Types, um die Karten nur mit Types zu erstellen.

Wenn ich den Winkel und Rotation ins negative änder, dann kommt sowas raus:
user posted image

Habe das Image auf den Mittelpunkt gesetzt, für die Drehung mit
BlitzMax: [AUSKLAPPEN]
MidHandleImage(S_card01)


Wie könnte man das ambesten realisieren, wie im 2ten Bild?

Ich bedanke mich schonmal für die Hilfe.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

BlitzMoritz

BeitragFr, Feb 17, 2012 18:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht findest du in folgendem kleinen Beispiel ein paar Anregungen und kannst sie für deine Zwecke anwenden:
BlitzMax: [AUSKLAPPEN]
Graphics 800,600

SetColor 255,255,255
DrawRect 0,0,800,600
Global card_image:TImage = LoadImage(GrabPixmap(0,0,100,200))
Cls
draw_cards(10, ImageWidth(card_image), ImageHeight(card_image), 400, 400, 50, 15)
Flip
WaitKey()

Function draw_cards(count%, width%, height%, center_x%, center_y%, center_distance%, angle_step%)
SetImageHandle(card_image, width/2, height + center_distance)
Local angle% = - 0.5 * (count-1) * angle_step
For Local i% = 0 Until count
SetRotation angle
SetColor Rand(0,255), Rand(0,255), Rand(0,255)
DrawImage card_image, center_x, center_y
angle:+angle_step
Next
End Function

Ich hoffe, die Bedeutung der Variablen erklärt sich von selbst - einfach ein bisschen 'rumspielen mit verschiedenen Werten.
 

bruce85

BeitragFr, Feb 17, 2012 18:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist genau das, was ich gesucht habe.

Vielen Dank.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250
 

bruce85

BeitragSa, Feb 18, 2012 6:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo nochmal,
ich hab noch ein kleines Problem und zwar möchte ich auf die TList in einer anderen Type zugreifen.
Ich hab das mal so versucht:
BlitzMax: [AUSKLAPPEN]
Type TSpieler
Field Name:String
Field X:Float
Field Y:Float
Field CardAnz:Int
Field Card:TCard
Global CardList:TList = New TList
Function NewSpieler:TSpieler(sName:String)
Local S:TSpieler = New TSpieler
S.Name = sName
Return S
End Function
End Type
Type TCard
Field Frames:Int
Field X:Float
Field Y:Float
Method New()
TSpieler.CardList.AddLast(Self)
End Method
End Type


und wenn ich dann alle Karten abfrage mit:
BlitzMax: [AUSKLAPPEN]
For Local C:TCard = EachIn Spieler[i].CardList

Dann haben alle Spieler die gleiche Karten, das kann ja nicht sein.

Was ist an meinem Code falsch?

Ich danke euch schonmal.

Edit: Ich hab das jetzt gelöst.
Ich habe die Liste nicht Global innerhalb von TSpieler Type definiert sondern mit Field und
BlitzMax: [AUSKLAPPEN]
TSpieler.CardList.AddLast(Self)

kann ja so nicht funktionieren, ich habe die Methode von TCard komplett entfernt und ich füge die Karten der Liste hinzu, dort wo auch der Spieler erstellt wird.
z.B. so:
BlitzMax: [AUSKLAPPEN]
For Local j:Int=0 To Spieler[i].CardAnz-1
Spieler[i].Card = New TCard
Spieler[i].Card.Frames = Rand(0,51) 'zum Testen
Spieler[i].CardList.AddLast(Spieler[i].Card)
Next


Edit2: Ich habe noch eine kleine Frage:
Wie kann ich die hintere Type einträge ignorieren, wenn ich mit der Maus auf einen der Type eintrag bin?
Wenn ich mit der Maus auf einen der Karte bin, dann werden die Karten, die sich hinten dran befinden, auch Markiert:
user posted image
und hier mal der Code:
BlitzMax: [AUSKLAPPEN]
Function draw_cards(i%, width%, height%, center_x%, center_y%, center_distance%, angle_step%)
SetImageHandle(card_image, width/2, height + center_distance)
Local angle% = - 0.5 * (Spieler[i].CardAnz-1) * angle_step

For Local C:TCard = EachIn Spieler[i].CardList
SetRotation angle
SetColor 200,200,200
If ImagesCollide2(mauspunkt,MouseX(),MouseY(),0,0,1,1,card_image, center_x, center_y,C.Frames,angle,1,1) Then
SetColor 150,150,150
DrawText C.Karte,C.X,C.Y+100
If MouseHit(1) Then
EndIf
EndIf
DrawImage card_image, center_x, center_y,C.Frames
angle:+angle_step
Next
SetRotation 0
End Function

Die Collision Prüfe ich mit ImagesCollide2 und das funktioniert ja auch alles, nur werden die Karten, die sich hinten dran befinden, auch mit Markiert.
Wie könnte man das am einfachsten umgehen?

MfG

ToeB

BeitragSa, Feb 18, 2012 13:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Exit ?

Einfach von der ganz obersten Karte an Prüfen und wenn eine Übereinstimmung ist, die Schleife verlassen und die Ausgewählte Karte einfärben Wink

Lg
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
 

bruce85

BeitragSa, Feb 18, 2012 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Dir. Wink
Genau das habe ich auch versucht gehabt, leider hat das immer die erste Karte Markiert und nicht die letzte Karte.
Ich weiss nicht, ob man die For Each Schleife rückwärts durchlaufen lassen kann, deshalb habe ich das ein bisschen anders gelöst.
Ich Markiere zuerst alle Karten, die unter der Maus liegen, danach zähle ich alle Markierte Karten und benutze eine weitere For Each Schleife, dann lasse ich einen zähler laufen, der nochmal durchgeht, wieviele Karten Markiert sind und lasse nur die letzte Karte dann Markiert.
Eine bessere lösung fällt mir grad nicht ein, aber so funktioniert es erstmal.

Ich danke dir für die Hilfe.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

BladeRunner

Moderator

BeitragSa, Feb 18, 2012 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu umständlich. Gehe bei deiner ForEach durch die komplette Liste und markiere immer die Karte die grade als aktiv gekennzeichnet ist. Wenn die Schleife durchlaufen ist ist die gespeicherte dann die zuletzt gefundene, also die welche Du suchst.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

DaysShadow

BeitragSa, Feb 18, 2012 22:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn er rückwärts durchgehen würde, wäre doch die erste Karte die meldet "Jo hier, der Mauszeiger ist über mir" die die angewählt werden soll, oder nicht?
Da sie ja über der "nächsten" Karte liegt.

Rückwärts durchgehen kannst du über die Links der Liste.
Wenn deine Karte sich dann entsprechend gemeldet hat, verlässt du einfach die Schleife mit Exit.

Beispiel:

BlitzMax: [AUSKLAPPEN]
SuperStrict

Type TTest

Field blubb:Int

Method Init:TTest( blubb:Int )

Self.blubb = blubb

Return Self

End Method

Method GetBlubb:Int( )

Return blubb

End Method

End Type

Global list:TList = New TList

Global link:TLink

'Liste füllen

For Local i:Int = 0 Until 10

list.AddLast( New TTest.Init( i ) )

Next

'Liste rückwärts ausgeben

link = list.LastLink( )

While( link <> Null )

Print( TTest( link.Value( ) ).GetBlubb( ) )

link = link.PrevLink( )

Wend
Blessed is the mind too small for doubt
 

bruce85

BeitragSo, Feb 19, 2012 16:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich danke euch.
So funktioniert es ja erstmal, Vielleicht werde ich es dann so versuchen zu ändern.

MfG
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group