Esittely: Tarkoituksenani on toteuttaa mahdollisimman vapaasti muokattavat "Vimpaimet", jotka ovat kuitenkin erittäin näyttäviä, nopeita ja tarvitevat vähän prosesointi aikaa. Lisäksi on tarkoitus, CGUI_Frame:n myötä, luoda kokonaisia "Welho ikkunoita" taikka tyhjiä ikkunoita joihin voi vapaasti piirtää. Vimpaimien muokattavuus syntyy siitä, että kirjasto ei piirrä yhtään mitään itse, vaan se käyttää pelkkiä kuvia. Kuvat generoidaan Vimpaimien luonnin yhteydessä, jopa tekstit tullaan renderöimään kuviin. Tähän Generointiin iskee CGUI_Gfx:n funktiot, valmiina on jo: Teksti kuvaksi, Pyöreä reunainen boxi - heijastuksilla ja tekstillä. Gfx osioon olisi tarkoitus koota "standardi" ulkoasu vimpaimille, ettei kaikkea tarviste aina generoida.
Toivon, että annatte palautetta kirjastosta. Laittakaa toivottuja vimpaimia!
Kirjaston tämän hetkiset osat (vimpaimet):
CGUI.cb - Pääheaderi joka avulla kirjastoa käytetään. Älä ikinä sisällytä CGUI:n tiedostoja erikseen, vaan kopioi projektisi tiedostoihin CGUI.cb ja kommentoi ylimääräiset Vimpaimet pois. Muuta polut myös toimiviksi.
CGUI_System.cb - Perus funktioita ja kokoelmia joita muut kirjaston funktiot käyttävät. Valmis, mutta handle ja message vakioita tullaan lisäämään jatkossa. Syötteiden keskitys lisätty.
CGUI_ScrollBar.cb - 60% Valmis. Vaakasuora toteutus puuttuu. Testiin on kopioitu (thanx screenshot) Vertikaalinen vierityspalkki Vistasta.
CGUI_ListBox.cb - Valmis. Parannus Ehdotuksia?
CGUI_Button.cb - Valmis. --||--
CGUI_PopupMenu.cb - Kesken. Koodin uudelleen kirjoitus, sillä toteutus tapa ei enää sovi projektiin. Vanha toteutus on kutenkin varsin toimiva, alla on vanha PopupMenu. Seuraavassa versiossa on kaikki herkut, eikä se hyydy kun alivalikkoja on n. 20 auki yhtäaikaa.
Code: Select all
'############################################
'# Tämä tiedosto on osa CGUI kirjastoa. #
'# (C) Jarmo Tiitto. #
//Todo: osion uudelleen kirjoitus!
//Typet: CGUI_Menu, CGUI_MenuStyle, CGUI_MenuItem
//Grafikka kokonaan kuvilla!
Type CGUI_Menu
Field parent_HND As integer 'menun omistajan handle
Field m_menustyle As integer 'menun tyyli instanssi, sisältää kuvat.
Field first_item As integer 'item listan alku
Field last_item As integer 'itemlistan loppu
Field sub_menu As integer 'mahdollisesti auki oleva submenu. (ei menu stack:ia!)
Field x As integer
Field y As integer
EndType
Type CGUI_MenuItem
Field ID%
Field Sub%
Field SubOpen As Byte
Field ItemID%
Field Capitation$
Field Enabled As Byte
Field Check As Byte
Field Separator As Byte
//uusi kirjasto:
Field next_item As integer
Field sub_menu As integer 'jos NULL item ei ole submenu.
Field m_img_nonactive As integer
Field m_img_active As integer
Field m_img_disabled
'Field ItemID as integer
Field IsSeparator As Byte
'Field Enabled As Byte
'Field Check As Byte
EndType
Type CGUI_MenuStyle
//Taustan väri
Field back_gr_r As Byte
Field back_gr_g As Byte
Field back_gr_b As Byte
//Taustan Reunan väri
Field back_ol_r As Byte
Field back_ol_g As Byte
Field back_ol_b As Byte
//Valitsemattoman tekstin väri
Field txtn_r As Byte
Field txtn_g As Byte
Field txtn_b As Byte
//Valitun Tekstin väri
Field txtc_r As Byte
Field txtc_g As Byte
Field txtc_b As Byte
//Pois käytöstä olevan valinnan väri
Field d_r As Byte
Field d_g As Byte
Field d_b As Byte
//Valinnan tausta
Field slc_r As Byte
Field slc_g As Byte
Field slc_b As Byte
//Separaatorin, ruksin ja sivuvalikon nuolen väri
Field mc_r As Byte
Field mc_g As Byte
Field mc_b As Byte
//uusi kirjasto:
Field m_back_first As integer 'pohjan yläosa
Field m_back_midle As integer 'pohjan keskiosa, monistetaan koko menun korkuseksi.
Field m_back_last As integer 'pohjan alaosa
Field m_check As integer 'ruksi
Field m_disabled_check As integer 'disabloitu ruksi
Field m_sub As integer 'submenun nuoli.
Field m_disabled_sub As integer 'disabloitu submenun nuoli.
Field m_separator As integer 'erotin.
EndType
Type MenuStack
Field ID%
Field ItmCount%
Field Delay%
Field x%
Field y%
Field w%
Field h%
EndType
Global gCutomMenuRefs%
//Generoi Vallikon ID:n
Function CGUI_Menu_Create()
gCutomMenuRefs=gCutomMenuRefs+1
Return gCutomMenuRefs
EndFunction
//Lisää Valinnan. Valikkon ID, Teksti, valinnan ID; !!!ei saa olla nolla!!!, Valinta päällä?, Ruksattu ?
Function CGUI_Menu_AddItem(MenuID%, Capitation$, ItemID%, Enabled%=1, Check%=0)
itm.CGUI_MenuItem=New(CGUI_MenuItem)
itm\ID=MenuID
itm\Sub=-1
itm\ItemID=ItemID
itm\Capitation=Capitation
itm\Enabled=Enabled
itm\Check=Check
EndFunction
//Lisää Alivalikon. Valikkon ID, Alivalikoksi lisättävän menun ID
Function CGUI_Menu_AddSubMenu(MenuID%,AddMenu%,Capitation$, Enabled%=1, Check%=0)
itm.CGUI_MenuItem=New(CGUI_MenuItem)
itm\ID=MenuID
itm\Sub=AddMenu
itm\ItemID=AddMenu
itm\Capitation=Capitation
itm\Enabled=Enabled
itm\Check=Check
EndFunction
//Lisää Erottimen. Menun ID
Function CGUI_Menu_AddSeparator(MenuID%)
itm.CGUI_MenuItem=New(CGUI_MenuItem)
itm\ID=MenuID
itm\Separator=True
itm\Sub=-1
itm\ItemID=0
itm\Capitation=""
itm\Enabled=0
itm\Check=0
EndFunction
//Asettavat Valinnan Tilan, Päällä, Ruksattu.
//Ilman Toista Parametria kääntää valinnan vastakkaiseksi.
Function CGUI_Menu_CheckItem(ItemID%,Ch%=2)
For Itm.CGUI_MenuItem = Each CGUI_MenuItem
If Itm\ItemID = ItemID And Itm\ItemID<>0
If Ch<>2 Then Itm\Check=Ch Else Itm\Check=Itm\Check Xor 1
EndIf
Next Itm
EndFunction
Function CGUI_Menu_EnableItem(ItemID%,En%=2)
For Itm.CGUI_MenuItem = Each CGUI_MenuItem
If Itm\ItemID = ItemID And Itm\ItemID<>0
If En<>2 Then Itm\Enabled=En Else Itm\Enabled=Itm\Enabled Xor 1
EndIf
Next Itm
EndFunction
//'Tyyli Data' - Valikon ulko asu
Global gCMS_Style As integer
//Näyttää Menun. MenuID, Menun Sijainti x,y, Cursorin Sijainti, x,y, Klikattiionko?
Function CGUI_Menu_Show(ShowID%, x%, y%, mx%, my%, click%)
cs.CGUI_MenuStyle = ConvertToType(gCMS_Style)
If cs = NULL Then MakeError "CGUI_Menu_Show: Invalid Style Data!"
If Last(MenuStack) = NULL
cMenu.MenuStack = New(MenuStack)
cMenu\ID = ShowID
cMenu\x = x
cMenu\y = y
For Itm.CGUI_MenuItem = Each CGUI_MenuItem
If Itm\ID = ShowID
If cMenu\w < TextWidth(Itm\Capitation) Then cMenu\w = TextWidth(Itm\Capitation)
cMenu\ItmCount = cMenu\ItmCount+1
EndIf
Next Itm
cMenu\w = cMenu\w + 55
cMenu\h = TextHeight("#")*cMenu\ItmCount+cMenu\ItmCount*4
EndIf
OldR% = getRGB(RED)
OldG% = getRGB(GREEN)
OldB% = getRGB(BLUE)
TxtH% = TextHeight("#")
sMenu.MenuStack = First(MenuStack)
While sMenu <> Last(MenuStack) And sMenu<>NULL
Color cs\back_gr_r, cs\back_gr_g, cs\back_gr_b
Box sMenu\x, sMenu\y, sMenu\w, sMenu\h
Color cs\back_ol_r, cs\back_ol_g, cs\back_ol_b
Box sMenu\x, sMenu\y, sMenu\w, sMenu\h, OFF
XX = sMenu\x
YY = sMenu\y+2
For Itm=Each CGUI_MenuItem
If Itm\ID = sMenu\ID
If Itm\Enabled = True
Color cs\txtn_r, cs\txtn_g, cs\txtn_b
Text XX + 30, YY, Itm\Capitation
Color cs\mc_r, cs\mc_g, cs\mc_b
If Itm\Check = True
Line XX + 4,YY + 3,XX + 7,YY + 6
Line XX + 4,YY + 4,XX + 7,YY + 7
Line XX + 4,YY + 5,XX + 7,YY + 8
Line XX + 8,YY + 5,XX + 12,YY + 1
Line XX + 8,YY + 6,XX + 12,YY + 2
Line XX + 8,YY + 7,XX + 12,YY + 3
EndIf
If Itm\Sub <> -1
Line XX + sMenu\w-7, YY, XX + sMenu\w-7, YY + 8
Line XX + sMenu\w-6, YY + 1, XX + sMenu\w-6, YY + 7
Line XX + sMenu\w-5, YY + 2, XX + sMenu\w-5, YY + 6
Line XX + sMenu\w-4, YY + 3, XX + sMenu\w-4, YY + 5
Dot XX + sMenu\w-3, YY + 4
EndIf
Else
Color cs\d_r,cs\d_g,cs\d_b
Text XX + 30, YY, Itm\Capitation
If Itm\Check = True
Line XX + 4,YY + 3,XX + 7,YY + 6
Line XX + 4,YY + 4,XX + 7,YY + 7
Line XX + 4,YY + 5,XX + 7,YY + 8
Line XX + 8,YY + 5,XX + 12,YY + 1
Line XX + 8,YY + 6,XX + 12,YY + 2
Line XX + 8,YY + 7,XX + 12,YY + 3
EndIf
If Itm\Sub <> -1
Line XX + sMenu\w-7, YY, XX + sMenu\w-7, YY + 8
Line XX + sMenu\w-6, YY + 1, XX + sMenu\w-6, YY + 7
Line XX + sMenu\w-5, YY + 2, XX + sMenu\w-5, YY + 6
Line XX + sMenu\w-4, YY + 3, XX + sMenu\w-4, YY + 5
Dot XX + sMenu\w-3, YY + 4
EndIf
EndIf
If Itm\Separator = True
Color cs\d_r,cs\d_g,cs\d_b
Line XX+5,YY+6,XX+sMenu\w-5,YY+6
Color cs\d_r-5,cs\d_g-5,cs\d_b-5
Line XX+6,YY+7,XX+sMenu\w-6,YY+7
EndIf
YY = YY + TxtH + 2
EndIf
Next Itm
sMenu = After(sMenu)
Wend
///////////////////////////////////////////////////////////////////////////
sMenu=Last(MenuStack)
//Pidetään valikko auki jos cursori ON valikon päällä...
If mx > sMenu\x And my > sMenu\y And mx < sMenu\x + sMenu\w And my < sMenu\y + sMenu\h
sMenu\Delay=Timer()+100
EndIf
//Pidetään valikko auki jos cursori ON valinnan päällä...
pMenu.MenuStack=Before(sMenu)
If pMenu<>NULL
XX = pMenu\x
YY = pMenu\y+2
For Itm = Each CGUI_MenuItem
If Itm\Sub = sMenu\ID
If mx > pMenu\x And my > YY And mx < pMenu\x + pMenu\w And my < YY+TxtH+2
sMenu\Delay=Timer()+100
Exit
EndIf
ElseIf Itm\ID=pMenu\ID
YY = YY + TxtH + 2
EndIf
Next Itm
EndIf
//suljetaan...
If sMenu\Delay<Timer()
dMenu.MenuStack=Before(sMenu)
If dMenu <> NULL Then DisableID = dMenu\ID Else DisableID=sMenu\ID
For Itm = Each CGUI_MenuItem
If Itm\ID=DisableID Then Itm\SubOpen=False
Next Itm
Delete sMenu
EndIf
Color cs\back_gr_r, cs\back_gr_g, cs\back_gr_b
Box sMenu\x, sMenu\y, sMenu\w, sMenu\h
Color cs\back_ol_r, cs\back_ol_g, cs\back_ol_b
Box sMenu\x, sMenu\y, sMenu\w, sMenu\h, OFF
XX = sMenu\x
YY = sMenu\y+2
For Itm = Each CGUI_MenuItem
If Itm\ID = sMenu\ID
If Itm\Enabled = True
OnSelection = mx > sMenu\x And my > YY And mx < sMenu\x + sMenu\w And my < YY+TxtH+2
If OnSelection = True And Itm\Sub<0
Color cs\slc_r, cs\slc_g, cs\slc_b
Box sMenu\x + 1, YY, sMenu\w - 2, TxtH + 2
Color cs\txtc_r, cs\txtc_g, cs\txtc_b
Text XX + 30, YY, Itm\Capitation
SelectedItem=Itm\ItemID
Else
Color cs\txtn_r, cs\txtn_g, cs\txtn_b
Text XX + 30, YY, Itm\Capitation
EndIf
If Itm\Check = True
Line XX + 4,YY + 3,XX + 7,YY + 6
Line XX + 4,YY + 4,XX + 7,YY + 7
Line XX + 4,YY + 5,XX + 7,YY + 8
Line XX + 8,YY + 5,XX + 12,YY + 1
Line XX + 8,YY + 6,XX + 12,YY + 2
Line XX + 8,YY + 7,XX + 12,YY + 3
EndIf
If Itm\Sub <> -1
Line XX + sMenu\w-7, YY, XX + sMenu\w-7, YY + 8
Line XX + sMenu\w-6, YY + 1, XX + sMenu\w-6, YY + 7
Line XX + sMenu\w-5, YY + 2, XX + sMenu\w-5, YY + 6
Line XX + sMenu\w-4, YY + 3, XX + sMenu\w-4, YY + 5
Dot XX + sMenu\w-3, YY + 4
//avataan alivalikko kun ollaan sen päällä
If OnSelection = True And Itm\SubOpen = False
Itm\SubOpen = True
cMenu.MenuStack = New(MenuStack)
cMenu\ID = Itm\Sub
//Lasketaan alivalikon paikka...
For Itm2.CGUI_MenuItem = Each CGUI_MenuItem
If Itm2\ID = cMenu\ID
If cMenu\w < TextWidth(Itm2\Capitation) Then cMenu\w = TextWidth(Itm2\Capitation)
cMenu\ItmCount = cMenu\ItmCount+1
EndIf
Next Itm2
cMenu\w = cMenu\w + 55
cMenu\h = TextHeight("#")*cMenu\ItmCount+cMenu\ItmCount*4
If XX + sMenu\w + cMenu\w < ScreenWidth()
cMenu\x = XX + sMenu\w
Else
cMenu\x = XX - cMenu\w
EndIf
cMenu\y= YY
EndIf
EndIf
Else
Color cs\d_r, cs\d_g, cs\d_b
Text XX + 30, YY, Itm\Capitation
If Itm\Check = True
Line XX + 4,YY + 3,XX + 7,YY + 6
Line XX + 4,YY + 4,XX + 7,YY + 7
Line XX + 4,YY + 5,XX + 7,YY + 8
Line XX + 8,YY + 5,XX + 12,YY + 1
Line XX + 8,YY + 6,XX + 12,YY + 2
Line XX + 8,YY + 7,XX + 12,YY + 3
EndIf
If Itm\Sub <> -1
Line XX + sMenu\w-7, YY, XX + sMenu\w-7, YY + 8
Line XX + sMenu\w-6, YY + 1, XX + sMenu\w-6, YY + 7
Line XX + sMenu\w-5, YY + 2, XX + sMenu\w-5, YY + 6
Line XX + sMenu\w-4, YY + 3, XX + sMenu\w-4, YY + 5
Dot XX + sMenu\w-3, YY + 4
EndIf
EndIf
If Itm\Separator = True
Color cs\d_r,cs\d_g,cs\d_b
Line XX+5,YY+6,XX+sMenu\w-5,YY+6
Color cs\d_r-5,cs\d_g-5,cs\d_b-5
Line XX+6,YY+7,XX+sMenu\w-6,YY+7
EndIf
YY = YY + TxtH + 2
EndIf
Next Itm
//Vanhat värit takaisin..
Color OldR,OldG,OldB
//Palautetaan mahdollisesti klikattu valinnan ID ja putsataan vainnat
If click = True
For sMenu.MenuStack = Each MenuStack
Delete sMenu
Next sMenu
For Itm = Each CGUI_MenuItem
Itm\SubOpen=False
Next Itm
Return SelectedItem
EndIf
EndFunction
Function CGUI_MenuDefaultStyle()
Style.CGUI_MenuStyle=New(CGUI_MenuStyle)
Style\back_gr_r=255
Style\back_gr_g=255
Style\back_gr_b=255
Style\back_ol_r=128
Style\back_ol_g=128
Style\back_ol_b=128
Style\d_r=160
Style\d_g=160
Style\d_b=170
Style\txtc_r=0
Style\txtc_g=0
Style\txtc_b=0
Style\txtn_r=0
Style\txtn_g=0
Style\txtn_b=0
Style\slc_r=60
Style\slc_g=60
Style\slc_b=200
Style\mc_r=0
Style\mc_g=0
Style\mc_b=0
gCMS_Style=ConvertToInteger(Style)
EndFunction
Function CGUI_MenuBlueStyle()
Style.CGUI_MenuStyle=New(CGUI_MenuStyle)
Style\back_gr_r=200
Style\back_gr_g=200
Style\back_gr_b=255
Style\back_ol_r=64
Style\back_ol_g=64
Style\back_ol_b=128
Style\d_r=120
Style\d_g=120
Style\d_b=150
Style\txtc_r=0
Style\txtc_g=0
Style\txtc_b=0
Style\txtn_r=0
Style\txtn_g=0
Style\txtn_b=0
Style\slc_r=60
Style\slc_g=60
Style\slc_b=200
Style\mc_r=0
Style\mc_g=0
Style\mc_b=0
gCMS_Style=ConvertToInteger(Style)
EndFunction
'# End of CGUI_PopupMenu.cb #
'############################
CGUI_MenuBlueStyle()
//Tehdään 'Muutama' lisää alivalikkoa... *Rolf*
p=CGUI_Menu_Create()
CGUI_Menu_AddItem(c,"Nyt voit Sulkea pelin..",OFF,OFF)
CGUI_Menu_AddItem(c,"Sulje peli",ON,OFF)
For i=1 to 50
c=CGUI_Menu_Create()
CGUI_Menu_AddSubMenu(c,p,"Lisää:")
CGUI_Menu_AddItem(c,"*ROLF* Sammuta->",OFF,OFF)
p=c
Next i
a=CGUI_Menu_Create()
CGUI_Menu_AddItem(a,"Valinta 1",1,ON,ON)
CGUI_Menu_AddItem(a,"Valinta 2",2,On ,ON)
CGUI_Menu_AddItem(a,"Valinta 3",3,On ,ON)
CGUI_Menu_AddItem(a,"Valinta 4",4,ON ,ON)
CGUI_Menu_AddSubMenu(a,c,"Lisää:")
s=CGUI_Menu_Create()
CGUI_Menu_AddItem(s,"Valinta 1",5,ON ,ON)
CGUI_Menu_AddItem(s,"Valinta 2",5,ON ,ON)
CGUI_Menu_AddItem(s,"Valinta 3",7,ON ,ON)
CGUI_Menu_AddItem(s,"Valinta 4",8,ON ,ON)
m=CGUI_Menu_Create()
CGUI_Menu_AddItem(m,"Valinta 1",10,OFF ,ON)
CGUI_Menu_AddItem(m,"Valinta 2",11,ON ,ON)
CGUI_Menu_AddSubMenu(m,s,"Lisää:")
CGUI_Menu_AddItem(m,"Valinta 3",13,ON ,ON)
CGUI_Menu_AddItem(m,"Valinta 4",14,ON ,ON)
CGUI_Menu_AddSeparator(m)
CGUI_Menu_AddSubMenu(m,a,"Lisää:")
SCREEN 800,600
fnt=LoadFont("fixedsys",24)
SetFont fnt
Repeat
If Showmenu Then CGUI_Menu_Show(m, vx, vy, MouseX(), MouseY(), 0)
If MouseUp(2)
vx=MouseX()
vy=MouseY()
ShowMenu=True
ElseIf MouseHit(1)
ShowMenu=False
CMD=CGUI_Menu_Show(m, vx, vy, MouseX(), MouseY(), 1)
CGUI_Menu_CheckItem(CMD)
EndIf
Text 0,0,FPS()
Text 0,12,"Valinnan ID:"+CMD
DrawScreen
Forever
Koska projektissa on varsin paljon ikuisuus-ainesta (jäätymis vaara kasvaa), olisi mukavaa jos joku toinen hyvin osaava koodari osallistuisi projektin kehitykseen! Varoitan kuitenkin että olen aika pihi vimpaimien toteutuksen kannalta.