2D Menue Draw+Eventsystem

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
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

2D Menue Draw+Eventsystem

Beitrag von Blackskyliner »

Hab hier grade einen alten Code gefunden, der mal aus Langeweile entstanden ist, vielleicht hilft es ja jemanden, fand es zu schade ihn einfach zu löschen. Hatte damals mit Prototyps rum gespielt und ach bisschen mit 2D Menüzeichnung...

Hoffe es hilft jemanden, ist wie gesagt leicht dilettantisch, würde heute einiges anders machen... Zumal es bisher nur Buttons hat...

Code: Alles auswählen

InitSprite()
InitMouse()

OpenWindow(0,0,0,300,300,"Menue Tests")
OpenWindowedScreen(WindowID(0), 0, 0, 300, 300, 1,0,0)

LoadFont(1, "Console", 7) 

Prototype MenueClick_functionPointer()

Structure callStruct
	id.l
	callMe.MenueClick_functionPointer
EndStructure
Global NewList menueClickEventList.callStruct()

Procedure MenuClick_addEvent(id, function.MenueClick_functionPointer)
	ResetList(menueClickEventList())
	AddElement(menueClickEventList())
	menueClickEventList()\id = id
	menueClickEventList()\callMe = function
EndProcedure

;(Menue Breite - Elementbreite)/2 = Zentriert
;(Menue Hoehe - ElementHoehe)/2 = Zentriert
Procedure getCenterizedPos(start, rootSize, ownSize)
    ProcedureReturn start + ((rootSize - ownSize)/2)
EndProcedure

Procedure proccessLeftMouseclick(id)
	ForEach menueClickEventList()
		If menueClickEventList()\id = id
			menueClickEventList()\callMe()
			ProcedureReturn
		EndIf
	Next
EndProcedure

Procedure checkAndDrawElement(id,x,y,width,height,colorNonActive, colorActive = #Green,check = #False)
  color.l = colorNonActive
  
  If MouseX() > x And MouseX() < width+x And MouseY() > y And MouseY() < y+height And check
    color = colorActive
    
    If MouseButton(#PB_MouseButton_Left)
		color = $990000
		If id <> -1
			proccessLeftMouseclick(id)
		EndIf
    EndIf
  EndIf
  
  Box(x,y,width,height,color)
EndProcedure

Procedure createMenuElement(id,x,y,width,height, text$)
  checkAndDrawElement(id,x,y,width,height,#Red, $009900, #True)
  DrawText(getCenterizedPos(x,width,TextWidth(text$)),getCenterizedPos(y,height,TextHeight(text$)), text$, #White)  
EndProcedure


Procedure doEntry1()
	;Da die Oberfunktion innerhalb eines Start/StopDraw ist können wir zeichnen
	;-- Dirty...
	DrawText(0,0,"Entry 1 clicked!", RGB(255,255,255))
EndProcedure
Procedure doEntry2()
	DrawText(0,0,"Entry 2 clicked!", RGB(255,255,255))
EndProcedure
Procedure doEntry3()
	DrawText(0,0,"Entry 3 clicked!", RGB(255,255,255))
EndProcedure
Procedure doEntry4()
	DrawText(0,0,"Entry 4 clicked!", RGB(255,255,255))
EndProcedure
Procedure doEntry5()
	DrawText(0,0,"Entry 5 clicked!", RGB(255,255,255))
EndProcedure
Procedure doEntry6()
	DrawText(0,0,"Entry 6 clicked!", RGB(255,255,255))
EndProcedure
Procedure doEntry7()
	DrawText(0,0,"Entry 7 clicked!", RGB(255,255,255))
EndProcedure

MenuClick_addEvent(0, @doEntry1())
MenuClick_addEvent(1, @doEntry2())
MenuClick_addEvent(2, @doEntry3())
MenuClick_addEvent(3, @doEntry4())
MenuClick_addEvent(4, @doEntry5())
MenuClick_addEvent(5, @doEntry6())
MenuClick_addEvent(6, @doEntry7())

released = #False


MenueX = 50;
MenueY = 50;

drag = #False 
collapsed = #False


Repeat 
  ExamineMouse()
  event.l = WindowEvent()
  
  ClearScreen($000000)
  
  If WindowMouseX(0) < 1 Or WindowMouseX(0) > 298 Or WindowMouseY(0) < 1 Or WindowMouseY(0) > 298 
    ReleaseMouse(#True) 
    released = #True 
  ElseIf released = #True 
    released = #False 
    ReleaseMouse(#False) 
    MouseLocate(WindowMouseX(0), WindowMouseY(0)) 
  EndIf 
  
  
  ;draw menue base
  StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)
  
    ;Main Menue Frame
    checkAndDrawElement(-1,MenueX,MenueY-10,200,10,#Yellow)
    If MouseX() >= MenueX And MouseX() < MenueX + 200 And MouseY() < MenueY And MouseY() > MenueY -10
      If MouseButton(#PB_MouseButton_Left)
        drag = #True
      EndIf
      
      If MouseButton(#PB_MouseButton_Right)
        If collapsed
          collapsed = #False  
        Else
          collapsed = #True
        EndIf
        
        ; Dirty one...
        While(MouseButton(#PB_MouseButton_Right)) : ExamineMouse() : Delay(1) : Wend
      EndIf
    EndIf
    
    If drag
      If MouseButton(#PB_MouseButton_Left)
        MenueX = MenueX + MouseDeltaX()
        MenueY = MenueY + MouseDeltaY()
      Else
        drag = #False;
      EndIf
    EndIf
    
    If Not collapsed
    checkAndDrawElement(-1,MenueX,MenueY,200,200,RGB(127,127,127))
    checkAndDrawElement(-1,MenueX+1,MenueY+1,198,198,RGB(0,0,0))
    
    createMenuElement(0,MenueX+3,MenueY+3,195,25,"Entry 1")
    createMenuElement(1,MenueX+3,MenueY+3+26*1,195,25,"Entry 2")
    createMenuElement(2,MenueX+3,MenueY+3+26*2,195,25,"Entry 3")
    createMenuElement(3,MenueX+3,MenueY+3+26*3,195,25,"Entry 4")
    createMenuElement(4,MenueX+3,MenueY+3+26*4,195,25,"Entry 5")
    createMenuElement(5,MenueX+3,MenueY+3+26*5,195,25,"Entry 6")
    createMenuElement(6,MenueX+3,MenueY+3+26*6,195,25,"Entry 7")
    
    DrawingFont(FontID(1))
    
    temp$ = "Coded by Blackskyliner"
    DrawText(getCenterizedPos(MenueX+3,195,TextWidth(temp$)),MenueY+3+26*7, temp$, RGB(255,255,255))
    EndIf
    
	
    ;Draw our mouse
    Box(MouseX(),MouseY(),5,1,RGB(255,255,255))
    Box(MouseX(),MouseY(),1,5,RGB(255,255,255))
    LineXY(MouseX(),MouseY(),MouseX()+5,MouseY()+5, RGB(255,255,255))
  StopDrawing()
  
  
  
  If event = #PB_Event_CloseWindow
    Break
  EndIf
  
  FlipBuffers()
  Delay(5)
  
ForEver
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher