Spielkarten

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Ich hab mal angefangen, den Code auf Images umzustellen (damit wir den WindowedScreen nicht brauchen, und es nicht so abartig ruckelt, wenn man das Fenster vergrößert/verkleinert). Der Code funktioniert zwar momentan hinten und vorne nicht, aber mich würde mal interessieren, ob ihr auch diese lustigen Icons (die gleichen, die auch für die MessageRequester zur Verfügung stehen) anstatt der normalen Karten angezeigt bekommt (hier wird nur die oberste Karte, sprich das Deckblatt, korrekt angezeigt ^^).

Der Code setzt übrigens PB 4.20 vorraus, da ich für die Keyboard-Abfrage den neuen Befehl EventwParam() verwende.

//EDIT: Und mit Pauken und Trompeten das wchtigste, den Code, vergessen :lol: :

Code: Alles auswählen

Enumeration
  #CC_Karo
  #CC_Herz
  #CC_Pik
  #CC_Kreuz
EndEnumeration

Procedure.l CreateBezier(s.l, x1.l, y1.l, x2.l, y2.l, x3.l, y3.l, x4.l, y4.l, Color.l, F.d, a.d)
  Protected Result.l, cx.d, bx.d, ax.d, cy.d, by.d, ay.d, i.d, x.l, y.l

  cx = 3 * (x2 - x1)
  bx = 3 * (x3 - x2) - cx
  ax = x4 - x1 - cx - bx
  cy = 3 * (y2 - y1)
  by = 3 * (y3 - y2) - cy
  ay = y4 - y1 - cy - by
  While i < 1
    i + a
    x = (((ax * i + bx) * i + cx) * i + x1) * F
    y = (((ay * i + by) * i + cy) * i + y1) * F
    If i > 0
      If x >= 0 And x < s And y > 0 And y < s
        Plot(x, y, Color)
      EndIf
    EndIf
  Wend

EndProcedure

Procedure.l CreateCardColor(Card.l, p.l)
  Protected ID.l, F.d, w.l = 128

  ID = CreateImage(#PB_Any, p, p)
  If ID
    If StartDrawing(ImageOutput(ID)) = 0
      FreeSprite(ID)
      ID = 0
    Else
      F = p / 128
      Select Card
        Case #CC_Karo
          CreateBezier(p, 0, w / 2, w / 4, w / 8 * 3, w / 8 * 3, w / 4, w / 2, 0, $0000FF, F, 0.005)
          CreateBezier(p, 0, w / 2, w / 4, w / 8 * 5, w / 8 * 3, w / 4 * 3, w / 2, w - 1, $0000FF, F, 0.005)
          CreateBezier(p, w - 1, w / 2, w / 4 * 3, w / 8 * 3, w / 8 * 5, w / 4, w / 2, 0, $0000FF, F, 0.005)
          CreateBezier(p, w - 1, w / 2, w / 4 * 3, w / 8 * 5, w / 8 * 5, w / 4 * 3, w / 2, w - 1, $0000FF, F, 0.005)
          FillArea(p / 2, p / 2, -1, $0000FF)

        Case #CC_Herz
          CreateBezier(p, w / 2, w - 1, -0.5 * w, 2, w / 2, -0.12 * w, w / 2, w / 3 + 2, $0000FF, F, 0.001)
          CreateBezier(p, w / 2, w - 1, 1.5 * w, 2, w / 2, -0.12 * w, w / 2, w / 3 + 2, $0000FF, F, 0.001)
          FillArea(p / 2, p / 2, -1, $0000FF)

        Case #CC_Pik
          CreateBezier(p, w / 2 + 1, 0, -0.6 * w, w - 1, w / 2, w, w / 2 - w / 24, w / 3 * 2 - 10, 1, F, 0.001)
          CreateBezier(p, w / 2, 0, 1.6 * w, w - 1, w / 2, w, w / 2 + w / 24, w / 3 * 2 - 10, 1, F, 0.001)
          CreateBezier(p, w / 2 - w / 24, w / 3 * 2 - 10, w / 2 - w / 24, w / 16 * 12, w / 2 - w / 24, w / 16 * 14, w / 2 - w / 12, w - 1, 1, F, 0.001)
          CreateBezier(p, w / 2 + w / 24, w / 3 * 2 - 10, w / 2 + w / 24, w / 16 * 12, w / 2 + w / 24, w / 16 * 14, w / 2 + w / 12, w - 1, 1, F, 0.001)
          FillArea(p / 2, p / 2, -1, 1)
          FillArea(p / 2, p - 1, -1, 1)

        Case #CC_Kreuz
          CreateBezier(p, w / 3, w / 3, 0.1 * w, -0.05 * w, 0.9 * w, -0.05 * w, w / 3 * 2, w / 3, 1, F, 0.001)
          CreateBezier(p, w / 3, w / 3, -0.23 * w, 0.16 * w, 0.08 * w, w + 10, 11 * w / 26, w / 3 * 2, 1, F, 0.001)
          CreateBezier(p, w / 3 * 2, w / 3, w * 1.23, 0.16 * w, 0.92 * w, w + 10, 15 * w / 26, w / 3 * 2, 1, F, 0.001)
          CreateBezier(p, 11 * w / 26, w / 3 * 2, w / 2 - w / 14, w / 16 * 12, w / 2 - w / 24, w / 16 * 14, w / 8 * 3, w - 1, 1, F, 0.001)
          CreateBezier(p, 15 * w / 26, w / 3 * 2, w / 2 + w / 14, w / 16 * 12, w / 2 + w / 24, w / 16 * 14, w / 8 * 5, w - 1, 1, F, 0.001)
          FillArea(p / 2, p / 2, -1, 1)
          FillArea(p / 2, p - 1, -1, 1)

      EndSelect
      StopDrawing()
    EndIf
  EndIf

  ProcedureReturn ID
EndProcedure

Procedure.l CreateCards(w.l, h.l)
  Protected i.l, j.l, Result.l = #True, Color.l, N.l, FID.l, Tw.l, Th.l, Sw.l, Sh.l

  FID            = LoadFont(#PB_Any, "Cataneo BT", w / 9, #PB_Font_Bold | #PB_Font_HighQuality)
  Dim K.l(4 * #CC_KREUZ)
  K(#CC_Karo)      = CreateCardColor(#CC_Karo,  w * 0.2)
  K(#CC_Herz)      = CreateCardColor(#CC_Herz,  w * 0.2)
  K(#CC_Pik)       = CreateCardColor(#CC_Pik,  w * 0.2)
  K(#CC_Kreuz)      = CreateCardColor(#CC_Kreuz, w * 0.2)
  K(#CC_Karo  + 4)   = CreateCardColor(#CC_Karo,  w * 0.35)
  K(#CC_Herz  + 4)   = CreateCardColor(#CC_Herz,  w * 0.35)
  K(#CC_Pik  + 4)   = CreateCardColor(#CC_Pik,  w * 0.35)
  K(#CC_Kreuz + 4)   = CreateCardColor(#CC_Kreuz, w * 0.35)
  K(#CC_Karo  + 8)   = CreateCardColor(#CC_Karo,  w * 0.6)
  K(#CC_Herz  + 8)   = CreateCardColor(#CC_Herz,  w * 0.6)
  K(#CC_Pik  + 8)   = CreateCardColor(#CC_Pik,  w * 0.6)
  K(#CC_Kreuz + 8)   = CreateCardColor(#CC_Kreuz, w * 0.6)
  Dim C.l(#CC_KREUZ)
  C(#CC_Karo)  = $0000FF
  C(#CC_Herz)  = $0000FF
  C(#CC_Pik)   = 0
  C(#CC_Kreuz)  = 0
  Dim T.s(13)
  For i = 0 To 12
    If i < 8
      T(i) = Str(i + 2)
    ElseIf i = 8
      T(i) = "J"
    ElseIf i = 9
      T(i) = "Q"
    ElseIf i = 10
      T(i) = "K"
    ElseIf i = 11
      T(i) = "10"
    ElseIf i = 12
      T(i) = "A"
    EndIf
  Next i
  Sw = ImageWidth(K(0))
  Sh = ImageHeight(K(0))

  For i = 0 To 52
    If CreateImage(i, w, h) = 0
      Result = #False
      Break
    EndIf
    If StartDrawing(ImageOutput(i))
      FillArea(0, 0, -1, $FF80FF)
      Circle(5, 5, 5, 0)
      Circle(5, 5, 4, $FFFFFF)
      Circle(5, h - 5, 5, 0)
      Circle(5, h - 5, 4, $FFFFFF)
      Circle(w - 5, 5, 5, 0)
      Circle(w - 5, 5, 4, $FFFFFF)
      Circle(w - 5, h - 5, 5, 0)
      Circle(w - 5, h - 5, 4, $FFFFFF)
      Box(6, 0, 5, 10, $FFFFFF)
      Box(0, 6, 10, 5, $FFFFFF)
      ;
      Box(w - 11, 0, 5, 10, $FFFFFF)
      Box(w - 11, 6, 10, 5, $FFFFFF)
      ;
      Box(6, h - 11, 5, 10, $FFFFFF)
      Box(0, h - 11, 10, 5, $FFFFFF)
;       ;
      Box(w - 11, h - 11, 5, 10, $FFFFFF)
      Box(w - 11, h - 11, 10, 5, $FFFFFF)
      LineXY(0, 5, 0, h - 5, 0)
      LineXY(w - 1, 5, w - 1, h - 5, 0)
      LineXY(5, 0, w - 5, 0, 0)
      LineXY(5, h - 1, w - 5, h - 1, 0)
      FillArea(w / 2, h / 2, -1, $FFFFFF)
      DrawingFont(FontID(FID))
      If i = 0
        DrawingMode(#PB_2DDrawing_Outlined)
        A    = 5
        B    = 5
        Color = 0
        For j = 1 To 8
          Box(A, B, w - 2 * A, h - 2 * B, RGB(Color, 20, $FF))
          A + w / 16
          B + h / 16
          Color + $18
        Next j
        
        StopDrawing()
        Color = 0
      Else

        ;         G\Cards[i]\ID   = i
        ;         G\Cards[i]\Color = Color
        ;         G\Cards[i]\Num  = N
        Tw = TextWidth(T(N))
        Th = TextHeight(T(N))

        Select N
          Case 0
            ;2er
            DrawText(5 , 5, T(N), C(Color), $FFFFFF)
            DrawText(w - 5 - Tw , h - 5 - Th, T(N), C(Color), $FFFFFF)
            StopDrawing()
            ;UseBuffer(i)
            StartDrawing(ImageOutput(i))
            DrawImage(K(Color), w / 2 - Sw / 2, 11)
            DrawImage(K(Color), w / 2 - Sw / 2, h - Sh - 11)
          Case 1
            ;3er
            DrawText(5 , 5, T(N), C(Color), $FFFFFF)
            DrawText(w - 5 - Tw , h - 5 - Th, T(N), C(Color), $FFFFFF)
            StopDrawing()
            ;UseBuffer(i)
            StartDrawing(ImageOutput(i))
            DrawImage(K(Color), w / 2 - Sw / 2, 11)
            DrawImage(K(Color), w / 2 - Sw / 2, h / 2 - Sh / 2)
            DrawImage(K(Color), w / 2 - Sw / 2, h - Sh - 11)
          Case 2
            ;4er
            DrawText(5 , 5, T(N), C(Color), $FFFFFF)
            DrawText(w - 5 - Tw , h - 5 - Th, T(N), C(Color), $FFFFFF)
            StopDrawing()
            ;UseBuffer(i)
            StartDrawing(ImageOutput(i))
            DrawImage(K(Color), 6 + Tw, 11)
            DrawImage(K(Color), w - 7 - Tw - Sw, 11)
            DrawImage(K(Color), 6 + Tw, h - 11 - Sh)
            DrawImage(K(Color), w - 7 - Tw - Sw, h - 11 - Sh)
          Case 3
            ;5er
            DrawText(5 , 5, T(N), C(Color), $FFFFFF)
            DrawText(w - 5 - Tw , h - 5 - Th, T(N), C(Color), $FFFFFF)
            StopDrawing()
            ;UseBuffer(i)
            StartDrawing(ImageOutput(i))
            DrawImage(K(Color), 6 + Tw, 11)
            DrawImage(K(Color), w - 7 - Tw - Sw, 11)
            DrawImage(K(Color), 6 + Tw, h - 11 - Sh)
            DrawImage(K(Color), w - 7 - Tw - Sw, h - 11 - Sh)
            DrawImage(K(Color), w / 2 - Sw / 2, h / 2 - Sh / 2)
          Case 4
            ;6er
            DrawText(5 , 5, T(N), C(Color), $FFFFFF)
            DrawText(w - 5 - Tw , h - 5 - Th, T(N), C(Color), $FFFFFF)
            StopDrawing()
            ;UseBuffer(i)
            StartDrawing(ImageOutput(i))
            DrawImage(K(Color), 6 + Tw, 11)
            DrawImage(K(Color), w - 7 - Tw - Sw, 11)
            DrawImage(K(Color), 6 + Tw, h - 11 - Sh)
            DrawImage(K(Color), w - 7 - Tw - Sw, h - 11 - Sh)
            DrawImage(K(Color), 6 + Tw, h / 2 - Sh / 2)
            DrawImage(K(Color), w - 7 - Tw - Sw, h / 2 - Sh / 2)
          Case 5
            ;7er
            DrawText(5 , 5, T(N), C(Color), $FFFFFF)
            DrawText(w - 5 - Tw , h - 5 - Th, T(N), C(Color), $FFFFFF)
            StopDrawing()
            ;UseBuffer(i)
            StartDrawing(ImageOutput(i))
            DrawImage(K(Color), 6 + Tw, 11)
            DrawImage(K(Color), w - 7 - Tw - Sw, 11)
            DrawImage(K(Color), 6 + Tw, h - 11 - Sh)
            DrawImage(K(Color), w - 7 - Tw - Sw, h - 11 - Sh)
            DrawImage(K(Color), 6 + Tw, h / 2 - Sh / 2)
            DrawImage(K(Color), w - 7 - Tw - Sw, h / 2 - Sh / 2)
            DrawImage(K(Color), w / 2 - Sw / 2, (h / 2 - 11 + Sh / 2) / 2 + 11 - Sh / 2)
          Case 6
            ;8er
            DrawText(5 , 5, T(N), C(Color), $FFFFFF)
            DrawText(w - 5 - Tw , h - 5 - Th, T(N), C(Color), $FFFFFF)
            StopDrawing()
            ;UseBuffer(i)
            StartDrawing(ImageOutput(i))
            DrawImage(K(Color), 6 + Tw, 11)
            DrawImage(K(Color), w - 7 - Tw - Sw, 11)
            DrawImage(K(Color), 6 + Tw, h - 11 - Sh)
            DrawImage(K(Color), w - 7 - Tw - Sw, h - 11 - Sh)
            DrawImage(K(Color), 6 + Tw, h / 2 - Sh / 2)
            DrawImage(K(Color), w - 7 - Tw - Sw, h / 2 - Sh / 2)
            DrawImage(K(Color), w / 2 - Sw / 2, (h / 2 - 11 + Sh / 2) / 2 + 11 - Sh / 2)
            DrawImage(K(Color), w / 2 - Sw / 2, (h - 11 - Sh / 2 - h / 2) / 2 + h / 2 - Sh / 2)
          Case 7
            ;9er
            DrawText(5 , 5, T(N), C(Color), $FFFFFF)
            DrawText(w - 5 - Tw , h - 5 - Th, T(N), C(Color), $FFFFFF)
            StopDrawing()
            ;UseBuffer(i)
            StartDrawing(ImageOutput(i))
            DrawImage(K(Color), 6 + Tw, h / 5 - Sh /2)
            DrawImage(K(Color), 6 + Tw, h / 5 * 2 - Sh / 2)
            DrawImage(K(Color), 6 + Tw, h / 5 * 3 - Sh / 2)
            DrawImage(K(Color), 6 + Tw, h / 5 * 4 - Sh / 2)
            DrawImage(K(Color), w - 7 - Tw - Sw, h / 5 - Sh /2)
            DrawImage(K(Color), w - 7 - Tw - Sw, h / 5 * 2 - Sh / 2)
            DrawImage(K(Color), w - 7 - Tw - Sw, h / 5 * 3 - Sh / 2)
            DrawImage(K(Color), w - 7 - Tw - Sw, h / 5 * 4 - Sh / 2)
            DrawImage(K(Color), w / 2 - Sw / 2, h / 2 - Sh / 2)
          Case 8
            ;Jungs
            DrawText(5 , 5, T(N), C(Color), $FFFFFF)
            DrawText(w - 5 - Tw , h - 5 - Th, T(N), C(Color), $FFFFFF)
            DrawingMode(#PB_2DDrawing_Outlined)
            Box(10 + Tw, 10, w - 20 - Tw * 2, h - 20)
            DrawingMode(#PB_2DDrawing_Default)
            Box(11 + Tw, 11, w - 22 - Tw * 2, h - 22, $B0B0B0)
            StopDrawing()
            ;UseBuffer(i)
            StartDrawing(ImageOutput(i))
            DrawImage(K(Color + 4), w - 11 - Tw - ImageWidth(K(Color + 4)), 11)
            DrawImage(K(Color + 4), 11 + Tw, h - 11 - ImageHeight(K(Color + 4)))
          Case 9
            ;Mädels
            DrawText(5 , 5, T(N), C(Color), $FFFFFF)
            DrawText(w - 5 - Tw , h - 5 - Th, T(N), C(Color), $FFFFFF)
            DrawingMode(#PB_2DDrawing_Outlined)
            Box(10 + Tw, 10, w - 20 - Tw * 2, h - 20)
            DrawingMode(#PB_2DDrawing_Default)
            Box(11 + Tw, 11, w - 22 - Tw * 2, h - 22, $B0B0B0)
            StopDrawing()
            ;UseBuffer(i)
            StartDrawing(ImageOutput(i))
            DrawImage(K(Color + 4), w - 11 - Tw - ImageWidth(K(Color + 4)), 11)
            DrawImage(K(Color + 4), 11 + Tw, h - 11 - ImageHeight(K(Color + 4)))
          Case 10
            ;Wichtigtuer
            DrawText(5 , 5, T(N), C(Color), $FFFFFF)
            DrawText(w - 5 - Tw , h - 5 - Th, T(N), C(Color), $FFFFFF)
            DrawingMode(#PB_2DDrawing_Outlined)
            Box(10 + Tw, 10, w - 20 - Tw * 2, h - 20)
            DrawingMode(#PB_2DDrawing_Default)
            Box(11 + Tw, 11, w - 22 - Tw * 2, h - 22, $B0B0B0)
            StopDrawing()
            ;UseBuffer(i)
            StartDrawing(ImageOutput(i))
            DrawImage(K(Color + 4), w - 11 - Tw - ImageWidth(K(Color + 4)), 11)
            DrawImage(K(Color + 4), 11 + Tw, h - 11 - ImageHeight(K(Color + 4)))
          Case 11
            ;10er
            DrawText(5 , 5, T(N), C(Color), $FFFFFF)
            DrawText(w - 5 - Tw , h - 5 - Th, T(N), C(Color), $FFFFFF)
            StopDrawing()
            ;UseBuffer(i)
            StartDrawing(ImageOutput(i))
            DrawImage(K(Color), 6 + Tw, h / 5 - Sh /2)
            DrawImage(K(Color), 6 + Tw, h / 5 * 2 - Sh / 2)
            DrawImage(K(Color), 6 + Tw, h / 5 * 3 - Sh / 2)
            DrawImage(K(Color), 6 + Tw, h / 5 * 4 - Sh / 2)
            DrawImage(K(Color), w - 7 - Tw - Sw, h / 5 - Sh /2)
            DrawImage(K(Color), w - 7 - Tw - Sw, h / 5 * 2 - Sh / 2)
            DrawImage(K(Color), w - 7 - Tw - Sw, h / 5 * 3 - Sh / 2)
            DrawImage(K(Color), w - 7 - Tw - Sw, h / 5 * 4 - Sh / 2)
            DrawImage(K(Color), w / 2 - Sw / 2, h / 5 + h / 10 - Sh / 2)
            DrawImage(K(Color), w / 2 - Sw / 2, h / 5 * 3 + h / 10 - Sh / 2)
          Case 12
            ;Asse
            DrawText(5 , 5, T(N), C(Color), $FFFFFF)
            DrawText(w - 5 - Tw , h - 5 - Th, T(N), C(Color), $FFFFFF)
            StopDrawing()
            ;UseBuffer(i)
            StartDrawing(ImageOutput(i))
            DrawImage(K(Color + 8), w / 2 - ImageWidth(K(Color + 8)) / 2, h / 2 - ImageHeight(K(Color + 8)) /2)
          Default
            ;Hä ? Wie komm ich denn hierhin ?
            StopDrawing()
            Break

        EndSelect
        Color = (Color + 1) & $03
        If Color = 0
          N + 1
        EndIf
        ;UseBuffer(#PB_Default)
        StopDrawing()
      EndIf
      ;TransparentSpriteColor(i, $FF80FF)
    EndIf
  Next i
  For i = 0 To 11
    FreeImage(K(i))
  Next i
  FreeFont(FID)

  ProcedureReturn Result
EndProcedure

;-Example
Define.l A, B, S, M, i
Define.f X, Y
Define.s Text

OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "Test", #PB_Window_SystemMenu | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)

CreateCards(96, 120)
A = 1
S = 0
M = WindowWidth(0) / 2
Text = "Use UP / DOWN to change seen cards. Resize Screen to recreate cards"
Repeat
  Repeat
    Select WindowEvent()
      Case #WM_CLOSE
        Break 2
      Case #WM_KEYDOWN
        Select EventwParam()
          Case #VK_DOWN
            A + 8
            If A > 45
              A = 45
            EndIf
          Case #VK_UP
            A - 8
            If A < 1
              A = 1
            EndIf
        EndSelect
      Case #WM_SIZE
        S = 1
        X = (WindowWidth(0) / 640) * 96
        Y = (WindowWidth(0) / 640) * 120
        M = WindowWidth(0) / 2
      Case 0
        If S = 134568487
          If OpenWindowedScreen(WindowID(0), 0, 0, WindowWidth(0), WindowHeight(0), 0, 0, 0)
            CreateCards(X, Y)
            B = M - ImageWidth(0) * 2 - 15
          EndIf
          S = 0
        EndIf
        Delay(5)
        Break
    EndSelect
  ForEver
;   If ExamineKeyboard()
;     If KeyboardReleased(#PB_Key_Down)
; 
;     ElseIf KeyboardReleased(#PB_Key_Up)
;       A - 8
;       If A < 1
;         A = 1
;       EndIf
;     EndIf
;   EndIf
  ;ClearScreen($8F8F8F)
  StartDrawing(WindowOutput(0))
  DrawImage(ImageID(0), M - ImageWidth(0) / 2, 20)
  For i = 0 To 3
    DrawImage(i + A, B + (i) * (ImageWidth(i + A) + 10), 30 + ImageHeight(i + A))
    DrawImage(i + 4 + A, B + (i) * (ImageWidth(i + 4 + A) + 10), 40 + 2 * ImageHeight(i + 4 + A))
  Next i
;   StopDrawing()
;   If StartDrawing(ScreenOutput())
    DrawText(WindowWidth(0) - TextWidth(Text), WindowHeight(0) - TextHeight(Text), Text, #White, $8F8F8F)
    StopDrawing()
;   EndIf
  ;FlipBuffers()
ForEver 
Benutzeravatar
HeX0R
Beiträge: 3054
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

DrawImage() will die ImageID...

Ausserdem ist der "neue Befehl" EventwParam() glaube schon seit 3.9 oder noch länger existent ;)
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Man lernt nie aus... :D
Antworten