Button in einem FullScreen animieren

Für allgemeine Fragen zur Programmierung mit PureBasic.
Renovatio

Button in einem FullScreen animieren

Beitrag von Renovatio »

Hallo Leute.

Nachdem ich nun seit Stunden wie ein Arbeitsloser, Nichtsnutz, PB-Besessener, ... hier im Forum rumgurke und einfach nichts finde sowie wirklich Tagelang Googlen absolut nichtsgefunden habe, sitze ich aufm Schlauch wie man so sagt.

Was ich habe
Ein FullScreen Hauptmenü wählbar zwischen 800x600 und 1024x768

Was genau habe ich vor
Eine Animation der Buttons die derzeit mit Box() erstellt wurden, welche sich entweder ganz links an den Rand minus 10-20 Pixel verschieben sobald man über einen Eintrag geklickt hat oder aber das der erste von 5 sich auf den zweiten schiebt und dann quasi FreeBox() verschwindet, dann der zweite sich auf den dritten schiebt und wieder quasi FreeBox() verschwindet bis zum letzten.
Wobei der letzte Button soll sich nicht selbst verschwinden lassen sondern ersetzt werden durch den Button "Zurück".

Wäre da ne Lösung besser wenn ich anstelle von Box() einfach Sprites() also Bilder benutze die man dann mit #SpriteID besser ansprechen kann?


Bitte helft mir, ich habe absolut keine Ahnung wie ich sowas machen soll und verzweifel langsam an dieser Sache. :(

Ein Bild vom Menü zum Verständnis seht ihr hier:
http://www.bilder-upload.eu/show.php?fi ... DkCc6c.png
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Button in einem FullScreen animieren

Beitrag von man-in-black »

1. bist du irgendwie im falschen unterforum gelandet. hier kommen nur fertige sachen/ideen rein.
2. da du die breite und höhe von deinem button kennst, ist es eigentlich wurst ob sprite oder box.

der erste schritt wäre das auslesen der mausposition
das zweite das überprüfen der kollision (bei einem rechteck noch einfach)

Code: Alles auswählen

if mausX => buttonx and mausx <= buttonx + buttonbreite
;das gleiche für Y
sollte die bedingung stimmen, kannst du z.B. die boxfarbe ändern. kommt ein klick hinzu, startest du eine animation
(setzt zum beispiel die variable "animation" von 0 auf 1)

Code: Alles auswählen

if animation = 1

for y=0 to 20
drawbox(20,100+y,100,20) ; das y lässt den button immer weiter runterrutschen
next
;ne for schleife ist eigentlich ungeeignet, da du noch andere events überwachen bzw alles anzeigen musst, beschreibt aber die idee sehr gut
;die box sollte nun auf dem zweiten button liegen
;jetzt zeigst du sie einfach nichtmehr an
;das selbe machst du nun mit dem 2. button (3.,...)

am ende musst du noch die variable animation auf 0 setzen
um eine gute lösung zu zeigen, müsste ich weiter ausholen bzw. mehr zeit reinstecken. nen denkanstoß hab ich dir aber schonmal gegeben...
(hab alles, kann alles, weiß alles!!^^)

Bild
Renovatio

Re: Button in einem FullScreen animieren

Beitrag von Renovatio »

Ja, eigentlich wollte ich ins Unterforum "Hilfe" oder so rein. xD

Danke für den Denkanstoß, doch soweit war ich auch schon bis mir einfiel das geht so nicht da er sonst den Button erneut zeichnet.

Hier mein "Button zeichnen" Code:

Code: Alles auswählen

Procedure.l DrawMenuButton(BtnX,BtnY,BtnW,BtnH,Text$)
  Protected Pressed
	
  Box(BtnX,BtnY,BtnW,BtnH,RGB(070,010,010))
  If MouseX() > BtnX And MouseX() < BtnX+BtnW And MouseY() > BtnY And MouseY() < BtnY+BtnH
    If MB_Left = 3
      Pressed = #True
      MB_Left = 0
    EndIf
		Box(BtnX+3,BtnY+3,BtnW-6,BtnH-6,RGB(250,250,250))
    FrontColor(RGB(200,0,0))
  Else
    Box(BtnX+3,BtnY+3,BtnW-6,BtnH-6,RGB(150,150,150))
    FrontColor(RGB(100,0,0))
  EndIf
	
  DrawingFont(FontID(#font_rof12))
  DrawTextCentered(BtnX+BtnW/2,BtnY+BtnH/2,Text$)
	
  ProcedureReturn Pressed
EndProcedure
Wenn ich also, wie ich selbst versucht habe, sowas hier zu machen:

Code: Alles auswählen

If DrawMenuButton(ScreenW/2-100,BtnNewGameY,200,BtnNewGameH,"Neues Spiel")
      ButtonVerschieben=1
      If ButtonVerschieben=1
      	For y=BtnNewGameY To BtnLoadGameY
      		DrawMenuButton(ScreenW/2-100,BtnLoadGameY,200,BtnNewGameH,"Neues Spiel")
      	Next
      EndIf
      ButtonVerschieben=0
      Selected = 0
    ElseIf DrawMenuButton(ScreenW/2-100,BtnLoadGameY,200,30,"Spiel Laden")
      Selected = 1
    ElseIf DrawMenuButton(ScreenW/2-100,BtnOptionsY,200,30,"Optionen")
      Selected = 2
    ElseIf DrawMenuButton(ScreenW/2-100,BtnCreditsY,200,30,"Mitwirkende")
      Selected = 3
    ElseIf DrawMenuButton(ScreenW/2-100,BtnQuitY,200,30,"Beenden")
      Selected = 4
    EndIf
dann zeichnet er doch nen neuen Button oder nicht wegen der Procedure?

Vielleicht bin ich einfachnur verzweifelt genug um die Lösung die mich wahrscheinlich schon schlägt, nicht zu sehen. :D
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Button in einem FullScreen animieren

Beitrag von man-in-black »

du musst beim nächsten schleifendurchlauf die position des buttons ändern
z.B.

Code: Alles auswählen

selected = -1
button_geloescht = -1     ;die buttonnummer vom letzten gelöschten button
diffy = 0                      ;gibt an, wie weit der aktuelle button schon "runtergefallen" ist^^
repeat

;zeichne hintergrund etc

if selected = -1

  ; dein bisheriger code zum button anzeigen und abfragen

else  
  ;dieser fall tritt ein, wenn ein button gedrückt wurde
  ;ich denke mal, dass du während der animation keine abfrage/ neuen klicks gestattest, oder?
 
  if button_geloescht = -1   ; wenn der erste button noch am bewegen ist (noch nicht gelöscht)
     diffy + 1 
     
      if diffy > 20 ;wenn der erste button auf dem 2. liegt
         diffy = 0
         button_geloescht = 0
      else
         button_anzeigen(x,y+diffy,breite,hoehe)
      endif
   endif

   if button_geloescht = 0
     diffy + 1 
     
      if diffy > 20 ;wenn der 2. button auf dem 3. liegt
         diffy = 0
         button_geloescht = 1
      else   
         button_anzeigen(x,y+diffy,breite,hoehe)
      endif
  
   else

    ;normal darstellen

   endif

   ;beim letzten button muss selected wieder auf -1 und diffy auf 0 (wenn er gelöscht wird)
   ;außerdem bietet es sich an, eine menuvariable zu nutzen  (menu = 0 -> hauptmenu; menu=1 = laden; ....)
  endif

endif


until quit
mal nen code zur menuvariable:

Code: Alles auswählen

repeat

select menu
  case 0
     alle buttons fürs hauptmenu + abfragen
  case 1
     andere buttons,...
endselect
until quit
so oder so ähnlich, mach was draus^^
(hab alles, kann alles, weiß alles!!^^)

Bild
Antworten