2D Menue Draw+Eventsystem
Verfasst: 03.08.2010 21:22
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...
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