Показать сообщение отдельно
Старый 11.01.2008, 23:05   #13
FrankH
Разработчик
 
Регистрация: 09.12.2007
Сообщений: 376
Написано 83 полезных сообщений
(для 122 пользователей)
Re: Примеры элементов GUI

От автора:
Привожу эти комментарии как пример того, что вы можете писать и оформлять функции элементов, как вам будет удобно. Внесу однако некоторые пояснения насчет второго пункта. Экономия количества переменных и просчетов окупится только в случае, если элементы графического интерфейса привязаны, например, к окнам или панелям, не меняющимся в размере и не зависящим от разрешения экрана. В моем же случае я поступал именно так, пока не "полезли косяки" при смене разрешений. Для того, чтобы элементы не выходили за экран и не оставляли пустых мест при смене разрешения, пришлось разбить экран на виртуальную сетку координат и позиционировать все меню по ней, располагая центры элементов по пересечениям сетки. Так, например, ряд кнопок при смене разрешения будет равномерно сжиматься или вытягиваться, а так же можно легко установить элемент по центру экрана или любой панели, нарисованной по той же сетке.
И в конце приведу вам исходник (не рабочую версию игры, а часть ее интерфейса), как пример использования элементов без картинок. Просто скопируйте код в Блитц и запускайте:
Global GWeit=200
Global GHeit=200
Global life,have_pitomec,want_noeat,want_sleep,want_play
Global Mouse_HitX=0
Global Mouse_HitY=0
Global Mouse_Hit=0
Global G_Menu=0
Global G_Exit=0
Global xq=GWeit/20
Global yq=GHeit/20
Global ch_size1=11
Global ch_size2=16
Global ch_size3=20
Global ch_size=ch_size1
Global RIC=160:Global GIC=170:Global BIC=255
Global RIC1=45:Global GIC1=45:Global BIC1=85
life=100:have_pitomec=0:want_noeat=10:want_sleep=5 0:want_play=20

Global opt_apply=1
;apply Options
Global opt_reset=1 ;reset changes in options

Global Winstate=1
Global help_delay=0
Global maxhelp_delay=60
Global exploration$=0

Global svit1=0:Global svit2=0:Global svit3=0:Global svit4=0:Global svit5=0:Global svit6=0:Global svit7=0:

Global guizone=0

Graphics3D GWeit,GHeit,32,2
Global fnt=LoadFont("Arial",ch_size,1,0,0)
SetFont fnt
While (Not (G_Exit))
Cls

UpdateWorld

RenderWorld
If Not(have_pitomec) Then mainmenu()

Color RIC,GIC,BIC
Text 6,45,"TRIS: "+TrisRendered()+have_pitomec
Rect 3,38,GWeit-6,GHeit-yq*2-38,0
gui()

Flip 0
Wend

End

Function gui()

Color RIC,GIC,BIC
Text GWeit*.5,GHeit-yq*3,"FREEMEN studio ©",1,1
If MouseHit(1) Mouse_Hit=1
OMouse_HitX=Mouse_HitX
OMouse_HitY=Mouse_HitY
Mouse_HitX=MouseX()
Mouse_HitY=MouseY()
If (OMouse_HitX=Mouse_HitX And OMouse_HitY=Mouse_HitY) Then
If help_delay<maxhelp_delay Then
help_delay=help_delay+1
EndIf
Else
help_delay=0
exploration$=0
EndIf

If guizone = 0 Then
guizone=guizone+button(xq*1,yq*18.5,xq*3,yq,"еда", 0,1,0,"накормите питомца")*1+button(xq*5,yq*18.5,xq*3,yq,"игра",0,0 ,0,0)*2+button(xq*9,yq*18.5,xq*3,yq,"аптека",0,0,0 ,0)*3
If button(xq*16,yq*18.5,xq*3,yq,"меню",0,1,0,"выйти в главное меню") mainmenu()
EndIf

If guizone = 1 Then
If button(xq*1,yq*18.5,xq*3,yq,"молоко",0,1,0,"придае т сил и уверенности") And (want_sleep<90) Then want_noeat=want_noeat+7 want_sleep=want_sleep+3 want_play=want_play+15 life=life+10
If button(xq*5,yq*18.5,xq*3,yq,"мясо",0,1,0,"самая сытная еда") And (want_sleep<70) Then want_noeat=want_noeat+20 want_sleep=want_sleep+28 want_play=want_play-8 life=life+4
If button(xq*9,yq*18.5,xq*3,yq,"рыба",0,1,0,"любимое всеми кошками") And (want_sleep<90) Then want_noeat=want_noeat+15 want_sleep=want_sleep+18 want_play=want_play+4 life=life+1
If button(xq*16,yq*18.5,xq*3,yq,"назад",0,1,0,"вернут ься") guizone=0
If want_noeat>100 want_sleep=want_sleep+18 want_play=want_play-2*(want_noeat-100) life=life-(want_noeat-100) want_noeat=100
If want_sleep>100 want_play=0 want_sleep=100
If want_play>100 want_play=100
If life>100 want_play=want_play+life-100 life=100
EndIf

ShowLine()
If exploration$<>0 ShowHelp(Mouse_HitX,Mouse_HitY,exploration$)
Flip

If (Mouse_HitX<>MouseX() Or Mouse_HitY<>MouseY()) Then Mouse_Hit=0 FlushMouse
End Function
Function ShowHelp(x,y,txt$)
lt=ch_size*Len(txt$)/2
ltt=lt*.5
Color RIC1,GIC1,BIC1
If x>GWeit-ltt Then xt=x-lt Else If x<ltt Then xt=x Else xt=x-ltt
If y<ch_size Then yt=y+ch_size+24 Else yt=y
Rect xt,yt-ch_size,lt,ch_size,1
Color 230,200,100
Text xt+ltt,yt-ch_size,txt$,1,0
End Function
Function ShowLine()
Color 220,10,10
Rect 20,4,(GWeit-26)*.01*life,6
Color 220,120,10
Rect 20,12,(GWeit-26)*.01*want_noeat,6
Color 10,160,10
Rect 20,20,(GWeit-26)*.01*want_play,6
Color 30,30,250
Rect 20,28,(GWeit-26)*.01*want_sleep,6
If Mouse_HitY<11 And help_delay=maxhelp_delay Then
exploration$="pet's life"
Else
If Mouse_HitY<20 And help_delay=maxhelp_delay Then
exploration$="pet's satiety"
Else
If Mouse_HitY<29 And help_delay=maxhelp_delay Then
exploration$="pet's joy"
Else
If Mouse_HitY<36 And help_delay=maxhelp_delay Then
exploration$="pet's desire to sleep"
EndIf
EndIf
EndIf
EndIf


End Function
Function mainmenu()
G_Menu=1
FlushMouse
Mouse_Hit=0
menuzone = 2


While (G_Menu)
RenderWorld
Color RIC,GIC,BIC
Rect 3,3,GWeit-6,GHeit-yq*2-3,0
Text GWeit*.5,GHeit-yq*3,"FREEMEN studio ©",1,1
If MouseHit(1) Mouse_Hit=1
OMouse_HitX=Mouse_HitX
OMouse_HitY=Mouse_HitY
Mouse_HitX=MouseX()
Mouse_HitY=MouseY()
If (OMouse_HitX=Mouse_HitX And OMouse_HitY=Mouse_HitY) Then
If help_delay<maxhelp_delay Then
help_delay=help_delay+1
EndIf
Else
help_delay=0
exploration$=0
EndIf

If menuzone = 2 Then
menuzone=menuzone+button(xq*5,yq*18.5,xq*3,yq,"opt ion",0,1,0,"опции")*1+button(xq*9,yq*18.5,xq*3,yq, "back",0,have_pitomec,0,"назад")*-1+button(xq*16,yq*18.5,xq*3,yq,"quit",0,1,0,"выход ")*-2
If button(xq*1,yq*18.5,xq*3,yq,"start",0,1,0,"начать игру") Then have_pitomec=1 G_Menu=0
EndIf
;options
If menuzone = 3 Then
menuzone=menuzone+button(xq*1,yq*18.5,xq*3,yq,"res et",0,0,2,0)*0+button(xq*5,yq*18.5,xq*3,yq,"accept ",0,1,1,"применить")*-1+button(xq*16,yq*18.5,xq*3,yq,"discard",0,1,0,"от мена")*-1
Winstate=TrackerShort5_1(xq,yq,xq*4,yq*2,"200x200" ,"300x300","400x400",0,0,0,1,Winstate)
EndIf

If menuzone = 4 Then
menuzone=menuzone+button(xq*1,yq*18.5,xq*3,yq,"sta rt",0,1,0,"начать игру")*0+button(xq*5,yq*18.5,xq*3,yq,"option",0,1, 0,"опции")*0
EndIf

If menuzone = 1 Then G_Menu=0
If menuzone = 0 Then G_Menu=0 G_Exit=1

If opt_apply
If Winstate=1 GWeit=200 GHeit=200
If Winstate=2 GWeit=300 GHeit=300
If Winstate=3 GWeit=400 GHeit=400
FreeFont fnt
xq=GWeit/20:yq=GHeit/20
Graphics3D GWeit,GHeit,32,2
If Winstate=1 ch_size=ch_size1
If Winstate=2 ch_size=ch_size2
If Winstate=3 ch_size=ch_size3
fnt=LoadFont("Arial",ch_size,1,0,0)
SetFont fnt
opt_apply=0
EndIf
If opt_reset
opt_reset=0
EndIf

If exploration$<>0 ShowHelp(Mouse_HitX,Mouse_HitY,exploration$)
Flip
ClsColor 0,0,0
Cls
If (Mouse_HitX<>MouseX() Or Mouse_HitY<>MouseY()) Then Mouse_Hit=0 FlushMouse
Wend
End Function
Function button(atx,aty,sizx,sizy,name$,typ,clr,state,expl$ )

i=0
Color 200,200,200
Rect atx-3,aty-3,sizx+6,sizy+6,0

If (Mouse_HitX>atx) And (Mouse_HitX<atx+sizx) And (Mouse_HitY>aty) And (Mouse_HitY<aty+sizy) And clr Then
If Mouse_Hit Then
Color RIC,GIC,BIC
Rect atx,aty,sizx,sizy,1
i=1
If state=1 opt_apply=1 ;apply Options
If state=2 opt_reset=1 ;apply changes in Edit
Mouse_Hit=0
Else
If expl$<>0 And help_delay=maxhelp_delay Then
exploration$=expl$
EndIf
Color 255,255,255
Rect atx,aty,sizx,sizy,1
EndIf
Else
Color RIC,GIC,BIC
Rect atx,aty,sizx,sizy,1
EndIf
Color 100-100*clr,100-100*clr,100+100*clr
Text atx+sizx*.5,aty+sizy*.5,name$,1,1
Return i

End Function

Function TrackerShort5_1(atx,aty,sizx,sizy,name1$,name2$,na me3$,name4$,name5$,typ,clr,state) ;switcher1 x5

If state=1 name$=name1$
If state=2 name$=name2$
If state=3 name$=name3$
If state=4 name$=name4$
If state=5 name$=name5$
If name5$ Then d=5 Else If name4$ Then d=4 Else If name3$ Then d=3 Else If name2$ Then d=2 Else If name1$ Then d=1 Else d=0
If ((Mouse_HitX>atx) And (Mouse_HitX<atx+sizx) And (Mouse_HitY>aty) And (Mouse_HitY<aty+sizy) And clr) Then
If Mouse_Hit Then
svit1=1
Else
Color RIC1,GIC1,BIC1
Rect atx+1,aty+1,sizx-2,sizy-2,1
EndIf
Else
If Mouse_Hit And ((Mouse_HitX<atx) Or (Mouse_HitX>atx+sizx) Or (Mouse_HitY<aty+sizy) Or (Mouse_HitY>aty+sizy*(d+1))) Then svit1=0 ;Color 0,0,0 Rect atx,aty,sizx,sizy,1
EndIf
Color RIC,GIC,BIC
Rect atx,aty,sizx,sizy,0
Text atx+sizx*.5,aty+sizy*.5,name$,1,1
;
If svit1
Color 0,0,0
Rect atx,aty+sizy,sizx,sizy*d,1
Color RIC,GIC,BIC
Rect atx,aty,sizx,sizy*(d+1),0

For i=1 To d
If (Mouse_HitX>atx) And (Mouse_HitX<atx+sizx) And (Mouse_HitY>aty+sizy*i) And (Mouse_HitY<aty+sizy*(i+1)) Then
Color RIC1,GIC1,BIC1
Rect atx+1,aty+1+sizy*i,sizx-2,sizy-2,1
If Mouse_Hit Then state=(Mouse_HitY-aty)/sizy svit1=0
EndIf
Next
Color RIC,GIC,BIC
t=atx+sizx*.5
If d>0 Text t,aty+sizy*1+sizy*.5,name1$,1,1
If d>1 Text t,aty+sizy*2+sizy*.5,name2$,1,1
If d>2 Text t,aty+sizy*3+sizy*.5,name3$,1,1
If d>3 Text t,aty+sizy*4+sizy*.5,name4$,1,1
If d>4 Text t,aty+sizy*5+sizy*.5,name5$,1,1

EndIf
Text 100,10,state+" "+(Mouse_HitY-aty)/sizy,1,1
Return state
End Function
В исходнике нет комментов, но построен он на тех же функциях, что описаны выше. Удачи!
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо FrankH за это полезное сообщение:
dimanche13 (11.01.2008), tormoz (11.01.2008)