[code] SpriteClick Demo: Game-Menu und anderes

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.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

[code] SpriteClick Demo: Game-Menu und anderes

Beitrag von Kaeru Gaman »

Aus aktuellem Anlass mal ein kleines Beispiel
wie man Bildelemente auf einem Screen erzeugt,
darstellt, und Mouse-Action registriert.

Code: Alles auswählen

; ***
; *** Click on Sprite Demo
; ***
; *** Kaeru Gaman, Dec.10 2008
; ***
; *** PB Ver. 4.20
; ***

EnableExplicit

; ****************************************
; *** Check if Point is inside Box

Procedure PointColl( x1.l, y1.l, x2.l, y2.l, a2.l, b2.l )
  Protected Coll = #False
 
  If x1 >= x2 And x1 <= x2 + a2 And y1 >= y2 And y1 <= y2 + b2
    Coll = #True
  EndIf
 
  ProcedureReturn Coll

EndProcedure 

#No_of_Elements = 19

#TextCol = $FFE0C0

Structure GadgetElement
  SprNr.l
  X.l
  Y.l
  W.l
  H.l
  C1.l
  C2.l
  T.s
EndStructure

Define ColR.l, ColG.l, ColB.l ; color channels

Define n.l      ; Loopcounter

Define MX.l     ; Mouse X
Define MY.l     ; Mouse Y
Define MBL.l    ; Mouse Button Left
Define MBR.l    ; Mouse Button Right
Define MOver.l  ; No of Gadget under the Mouse
Define EXIT.l   ; Exit Flag

Dim Gadget.GadgetElement ( #No_of_Elements )

InitSprite()
InitKeyboard()
InitMouse()

OpenScreen( 1024, 768, 32, "Click Sprite Demo" )

; ****************************************
; *** Create a number of random elements

For n=1 To #No_of_Elements
  Gadget( n )\W = Random( 128 ) + 64              ; Width
  Gadget( n )\H = Random(  64 ) + 28               ; Height
  Gadget( n )\X = Random( 1023 - Gadget( n )\W )  ; X-Pos
  Gadget( n )\Y = Random(  767 - Gadget( n )\H )  ; Y-Pos
  ColR = Random( 95 ) + 32    ; Red   of Darker Color
  ColG = Random( 95 ) + 32    ; Green of Darker Color
  ColB = Random( 95 ) + 32    ; Blue  of Darker Color
  Gadget( n )\C1 = RGB( ColR    , ColG    , ColB     )  ; Darker Color
  Gadget( n )\C2 = RGB( ColR * 2, ColG * 2, ColB * 2 )  ; Lighter Color
  Gadget( n )\T = "No. " + Str(n)   ; simple text
  ; create a sprite for this gadget
  Gadget( n )\SprNr = CreateSprite( #PB_Any, Gadget( n )\W, Gadget( n )\H )
  StartDrawing( SpriteOutput( Gadget( n )\SprNr ) )
    DrawingMode( #PB_2DDrawing_Transparent )
    Box( 0, 0, Gadget( n )\W  , Gadget( n )\H  , Gadget( n )\C2 )
    Box( 4, 4, Gadget( n )\W-8, Gadget( n )\H-8, Gadget( n )\C1 )
    DrawText( 6,6, Gadget( n )\T, Gadget( n )\C2 )
  StopDrawing()
Next

CreateSprite( 0, 32, 32 )
StartDrawing( SpriteOutput( 0 ) )
  Line( 0, 0, 24,  8, $00FFFF )
  Line( 0, 0,  8, 24, $00FFFF )
  Line( 0, 0, 32, 32, $00FFFF )
StopDrawing()

Repeat

  ExamineKeyboard()
  ExamineMouse()

  MX = MouseX()
  MY = MouseY()
  MBL = MouseButton( #PB_MouseButton_Left )
  MBR = MouseButton( #PB_MouseButton_Right )

  If KeyboardPushed( #PB_Key_Escape )
    EXIT = 1
  EndIf

  ClearScreen( $201008 )

  MOver = 0
  For n=1 To #No_of_Elements
    DisplaySprite( Gadget( n )\SprNr, Gadget( n )\X, Gadget( n )\Y )
    If PointColl( MX, MY, Gadget( n )\X, Gadget( n )\Y, Gadget( n )\W, Gadget( n )\H )
      MOver = n
    EndIf
  Next

  StartDrawing( ScreenOutput() )
    DrawingMode( #PB_2DDrawing_Outlined | #PB_2DDrawing_Transparent )
    If MOver > 0
      If MBL
        Box( Gadget( MOver )\X, Gadget( MOver )\Y, Gadget( MOver )\W, Gadget( MOver )\H, $00FFFF )
        DrawText( 1, 1, "Clicked On: " + Str( MOver ), #TextCol )
      Else
        Box( Gadget( MOver )\X, Gadget( MOver )\Y, Gadget( MOver )\W, Gadget( MOver )\H, $0000FF )
        DrawText( 1, 1, "Mouse Over: " + Str( MOver ), #TextCol )
      EndIf
    EndIf
  StopDrawing()

  DisplayTransparentSprite( 0, MX, MY )

  FlipBuffers( #PB_Screen_SmartSynchronization )

Until EXIT = 1

End
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
carter
Beiträge: 19
Registriert: 10.12.2008 20:29

Beitrag von carter »

Vielen vielen Dank, das hat mir sehr geholfen!
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Beitrag von man-in-black »

Als kleine (bescheidene) Ergänzung, man auch mit Fonts arbeiten.
Man prüft wie im Bsp oben ob die maus drüber is und kann dann entweder eine kursive Schrift nehmen oder ...

Code: Alles auswählen

If Mouseover...
  Usefont(fontid(0))
  Farbe = ...
else
  usefont(fontid(1))
  Farbe = ...
endif

 Drawtext(...,...,"Start",Farbe)    
ich nehms oft lieber als Sprites (sieht manchmal besser aus und spart Speicher) :allright:
(hab alles, kann alles, weiß alles!!^^)

Bild
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: [code] SpriteClick Demo: Game-Menu und anderes

Beitrag von Vera »

Danke für dies inspirierende Lehrstück :)

und damit es auch unter PB 4.41 bzw. 4.5 läuft, braucht man nur den Parameter #PB_Screen_SmartSynchronization von FlipBuffers() zu OpenScreen() zu verlegen.

Gruß ~ Vera
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Antworten