[MAXGUI] How to make a "Voting Box"?
BlitzMax Forums/BlitzMax Beginners Area/[MAXGUI] How to make a "Voting Box"?
| ||
Hi! How to make a resizable "Voting Box" with maxgui? Many of them can be found on the net. You can use the mouse to exacly point where the slider should go. Example from Gamespot (Range 0-10): Before: ![]() Maxed: ![]() Grisu |
| ||
uhm... "vo-ting-box" hmm... I don't quite get the idea :P Is it just some progressbar with the value next to it orso? |
| ||
I thing that as you do not want to use the systems gui you must create your own slider and display it in a canvas. |
| ||
Yes, but its muti-colored and you can use the mouse inside the canvas window to select the slider position. Plus it has to work (be resized) when the app window is resized as well. Example in action: http://www.gamespot.com/pc/adventure/condemned/review.html?sid=6147467 |
| ||
The colors of the example it's not something to worry about. Looks like that they are playing with the percent of Red and Green. About the position and the value. Let's say that chooseble area it's from X1 = 10 , Y1 = 10 to X2 = 60 and Y2 = 40. You will have to check if the given EventX() and EventY() are inside this box and then to find the position of the cursor and the value. Value = ( (EventX() - X1) / (X2 - X1) ) * 10 Beware to use floats. |
| ||
Grisu: do you want a smooth bar or a bar split-up in fixed units (like in the example) ? |
| ||
Fixed units as it does look better..imho. But everything that works is fine. I tried using pre-made images, but the results weren't that great, especially because I need to resize the canvas. |
| ||
boo! methods are self-explaining I think .. 'ave fun EventSource() contains the unitbar EventID() contains one of two possible ID's EventData() contains the value Const EVENT_UNITBARCHANGE:Int= $13370400 Const EVENT_UNITBARCHANGED:Int= $13370401 Type TUnitbar Rem TUnitbar CS_TBL Usage: MyUnitbar:TUnitbar=CreateUnitbar:TUnitbar(x,y,unitsize, units, height, parent) EndRem Field canvas:TGadget Field r:Int[] Field g:Int[] Field b:Int[] Field unitwidth:Int Field units:Int Field value:Int Field number:Int Field lmd:Int Field NewEvent:TEvent=New TEvent Function eventhook:Object(id:Int,data:Object,context:Object) If TUnitbar(context) TUnitbar(context).ev TEvent(data);Return data EndFunction Method New() AddHook EmitEventHook,eventhook,Self End Method Method Free() RemoveHook EmitEventHook,eventhook GCCollect() End Method Method ev(event:TEvent) If event.source=canvas If event.id=EVENT_GADGETPAINT update If event.id=EVENT_MOUSEDOWN lmd=1 EndIf If event.id=EVENT_MOUSEUP lmd=0 NewEvent.id=EVENT_UNITBARCHANGED NewEvent.source=Self NewEvent.data=value EmitEvent NewEvent EndIf If lmd value=_Limit((EventX()-(number*12))/unitwidth,0,units-1) update NewEvent.id=EVENT_UNITBARCHANGE NewEvent.source=Self NewEvent.data=value EmitEvent NewEvent EndIf If event.id=EVENT_MOUSEENTER ActivateGadget canvas EndIf EndIf End Method Method _Limit(v:Int,l:Int,h:Int) If v<l Return l If v>h Return h Return v End Method Method update() Local t:Int Local mini:Int Local gh:Int=GadgetHeight(canvas) SetGraphics CanvasGraphics(canvas) SetClsColor 0,0,0;Cls For t=1 To value SetColor r[t],g[t],b[t] DrawRect (number*12)+t*unitwidth+1,1,unitwidth-2,gh-1-1 Next SetColor 255,255,255 DrawText value,number*12/2-TextWidth(value)/2,gh/2-TextHeight(value)/2 Flip End Method Method Set(v:Int) value=_Limit(v,0,units-1) update End Method Method SetGradient(startR:Int,startG:Int,startB:Int,deltaR:Int,deltaG:Int,deltaB:Int) Local t:Int For t=0 To units-1 r[t]=_Limit(startR,0,255) g[t]=_Limit(startG,0,255) b[t]=_Limit(startB,0,255) startR:+deltaR startG:+deltaG startB:+deltaB Next update End Method Method Color(index:Int,_r:Int,_g:Int,_b:Int) index=_Limit(index,0,units-1) r[index]=_r g[index]=_g b[index]=_b update End Method EndType Function CreateUnitbar:TUnitbar(x:Int, y:Int, unitwidth:Int, units:Int, h:Int, parent:TGadget) Local a:TUnitbar=New TUnitbar Local tmp$=units a.number=Len(tmp) a.canvas=CreateCanvas(x,y,unitwidth*units+a.number*12,h,parent) a.unitwidth=unitwidth a.units=units a.r=a.r[..units] a.g=a.g[..units] a.b=a.b[..units] For Local t:Int=0 To units-1 a.r[t]=160 a.g[t]=160 a.b[t]=160 Next Return a End Function ' example from here: Local window:TGadget=CreateWindow("(^_^( 'TUnitbar' )o_O) 'O RLY?'",200,200,600,400) Local unitbar1:TUnitbar=CreateUnitbar(20,16,5,64,32,window) Local unitbar2:TUnitbar=CreateUnitbar(20,64,16,16,16,window) Local unitbar3:TUnitbar=CreateUnitbar(20,128,3,128,24,window) unitbar1.SetGradient 0,-128,255,4,4,0 'unitbar2.SetGradient 128,255,-255,-16,-8,64 unitbar2.Color 4,255,255,255 unitbar3.SetGradient 128,64,32,4,2,1 unitbar3.Set 25 Repeat WaitEvent() If EventID()=EVENT_WINDOWCLOSE End If EventSource()=unitbar1 Or EventSource()=unitbar2 Or EventSource()=unitbar3 If EventID()=EVENT_UNITBARCHANGE DebugLog "changing.." If EventID()=EVENT_UNITBARCHANGED DebugLog "changed.." DebugLog "value: "+EventData() DebugLog "--------------------------------" EndIf Forever |
| ||
Ouch, thanks A LOT. You should put this in the code archives! I need time to understand the code. btw: how do I set the gradient so I get a "green end" like in my example? Is there a way to "fix" the value_range (0 to 100), no matter how big the window is...? |
| ||
I need time to understand the code. Actually you don't, it's written so it works more or less like the internal gadgets, via the Event system. btw: how do I set the gradient so I get a "green end" like in my example? The gradient method is a simple one, which only works with deltas, the rainbow gradient isn't -afaik- directly possible with this, that's why I added the Color method to set these colors yourself. Is there a way to "fix" the value_range (0 to 100), no matter how big the window is...? Not in this setup, that's why I asked for smooth vs fixed units.. ofcourse you could scale the output mathematically.. If you have 32 units then Eventdata() is between 0..31, if '31' is to become '100' then you do Eventdata()*100/31. (edit) uhm.... yes.. that would display the wrong number in that unitbar, wouldn't it? ^_^ |
| ||
yay for heavy clipping! red > yello > green! unitbar3.SetGradient 512,0,0,-4,4,0 |
| ||
Sorry to get on your nerves... :( 1. If I want to "disable" a unitbar: So that it only displays a certain vaule, but the user isn't allowed to change that. How would I do that? The unitbar keeps on getting updated. 2. *solved* 3. These hooks only work on windows, right? Updated code: ' Unitbar Example 2 Const EVENT_UNITBARCHANGE:Int= $13370400 Const EVENT_UNITBARCHANGED:Int= $13370401 Type TUnitbar Rem TUnitbar CS_TBL Usage: MyUnitbar:TUnitbar=CreateUnitbar:TUnitbar(x,y,unitsize, units, height, parent) EndRem Field canvas:TGadget Field r:Int[] Field g:Int[] Field b:Int[] Field unitwidth:Int Field units:Int Field value:Int Field number:Int Field lmd:Int Field NewEvent:TEvent=New TEvent Function eventhook:Object(id:Int,data:Object,context:Object) If TUnitbar(context) TUnitbar(context).ev TEvent(data);Return data EndFunction Method New() AddHook EmitEventHook,eventhook,Self End Method Method Free() RemoveHook EmitEventHook,eventhook GCCollect() End Method Method ev(event:TEvent) If event.source=canvas If event.id=EVENT_GADGETPAINT update If event.id=EVENT_MOUSEDOWN lmd=1 EndIf If event.id=EVENT_MOUSEUP lmd=0 NewEvent.id=EVENT_UNITBARCHANGED NewEvent.source=Self NewEvent.data=value EmitEvent NewEvent EndIf If lmd value=_Limit((EventX()-(number*12))/unitwidth,0,units-1) update NewEvent.id=EVENT_UNITBARCHANGE NewEvent.source=Self NewEvent.data=value EmitEvent NewEvent EndIf If event.id=EVENT_MOUSEENTER ActivateGadget canvas EndIf EndIf End Method Method _Limit(v:Int,l:Int,h:Int) If v<l Return l If v>h Return h Return v End Method Method update() Local t:Int Local mini:Int Local gh:Int=GadgetHeight(canvas) SetGraphics CanvasGraphics(canvas) SetClsColor 0,0,0;Cls SetColor 80,80,80 For t=1 To units DrawRect (number*12)+t*unitwidth+1,1,unitwidth-2,gh-1-1 Next For t=1 To value SetColor r[t],g[t],b[t] DrawRect (number*12)+t*unitwidth+1,1,unitwidth-2,gh-1-1 Next SetColor 255,255,255 DrawText value,number*12/2-TextWidth(value)/2,gh/2-TextHeight(value)/2 Flip End Method Method Set(v:Int) value=_Limit(v,0,units-1) update End Method Method SetGradient(startR:Int,startG:Int,startB:Int,deltaR:Int,deltaG:Int,deltaB:Int) Local t:Int For t=0 To units-1 r[t]=_Limit(startR,0,255) g[t]=_Limit(startG,0,255) b[t]=_Limit(startB,0,255) startR:+deltaR startG:+deltaG startB:+deltaB Next update End Method Method Color(index:Int,_r:Int,_g:Int,_b:Int) index=_Limit(index,0,units-1) r[index]=_r g[index]=_g b[index]=_b update End Method EndType Function CreateUnitbar:TUnitbar(x:Int, y:Int, unitwidth:Int, units:Int, h:Int, parent:TGadget) Local a:TUnitbar=New TUnitbar Local tmp$=units a.number=Len(tmp) a.canvas=CreateCanvas(x,y,unitwidth*units+a.number*12,h,parent) a.unitwidth=unitwidth a.units=units a.r=a.r[..units] a.g=a.g[..units] a.b=a.b[..units] For Local t:Int=0 To units-1 a.r[t]=160 a.g[t]=160 a.b[t]=160 Next Return a End Function ' Example from here: Local window:TGadget=CreateWindow("TUnitbar Example",200,200,600,400) Local unitbar1:TUnitbar=CreateUnitbar(20,16,5,101,32,window) Local unitbar2:TUnitbar=CreateUnitbar(20,64,10,11,16,window) Local unitbar3:TUnitbar=CreateUnitbar(20,128,3,101,24,window) unitbar1.SetGradient 450,0,0,-3,4,0 unitbar2.SetGradient 400,0,0,-35,4,0 unitbar3.SetGradient 450,0,0,-3,4,0 unitbar1.Set 5 unitbar2.Set 2 unitbar3.Set 35 Repeat WaitEvent() If EventID()=EVENT_WINDOWCLOSE End If EventSource()=unitbar1 Or EventSource()=unitbar2 Or EventSource()=unitbar3 If EventID()=EVENT_UNITBARCHANGE DebugLog "changing.." If EventID()=EVENT_UNITBARCHANGED DebugLog "changed.." DebugLog "value: "+EventData() DebugLog "--------------------------------" EndIf Forever |
| ||
*some hours later* After several attempts I only found a workaround by setting a gobal var "DrawUnitbar" to disable the unitbar output... Method update() Local t:Int Local mini:Int Local gh:Int=GadgetHeight(canvas) SetGraphics CanvasGraphics(canvas) SetClsColor 0,0,0;Cls If DrawUnitbar=True Then ' Draw an enabled Unitbar SetColor 100,100,100 For t=value To units DrawRect (number*12)+t*unitwidth+1,1,unitwidth-2,gh-1-1 Next For t=1 To value SetColor r[t],g[t],b[t] DrawRect (number*12)+t*unitwidth+1,1,unitwidth-2,gh-1-1 Next SetColor 255,255,255 DrawText value,number*12/2-TextWidth(value)/2,gh/2-TextHeight(value)/2 Else ' Draw an empty Unitbar SetColor 100,100,100 For t=1 To units DrawRect (number*12)+t*unitwidth+1,1,unitwidth-2,gh-1-1 Next value=0 SetColor 255,255,255 DrawText value,number*12/2-TextWidth(value)/2,gh/2-TextHeight(value)/2 EndIf Flip End Method The only thing that is breaking my head now is how to resize the unitbar width on runtime? = Setgadgetshape |
| ||
The 'gadget' you'll use is in fact the canvas. Don't expect 'everything' from these custom gadgets. Also, globals are nasty, imho. It's better to have a field with an activity state so you could set this per unitbar. If you want all unitbars to change at once you could try to make each unitbar react on an event that triggers activity/unactivity. |
| ||
Yeah I know its not the best way of coding! Will try again... at least its working.. :) Any hint how I can "enlarge" the unitbar y-wise when the app windowsize is changed?!? See my app: http://grisu.roxr.com/dfa.zip (2 MB) |
| ||
Method Resizeheight(h:Int) SetGadgetShape canvas,GadgetX(canvas),GadgetY(canvas),GadgetWidth(canvas),h update End Method Bugs here in 1.16 ... maybe it works @ 1.18 .. dunno. For some reason it doesn't draw anything into the newly acquired area. Anyone an idea? |
| ||
Yepp, I have. The only thing one can do this is to initially create a "maxed" canavas. And then resize it "down" to the size used (Setgadgetshape to the createcanvas state). This is the only way you can use Setgadgetshape as I have found out so far. I do the same with the image canvas I use in my app. |
| ||
Haven't be successfull on the the custom canvas height by now... :( But I have changed the type to have 2 more states, i.e: disabled and hidden. Type TUnitbar Rem TUnitbar CS_TBL, Grisu Last modified: 15.04.06 Usage: MyUnitbar:TUnitbar=CreateUnitbar:TUnitbar(x,y,unitsize, units, height, hidden, disabled, parent) EndRem Field canvas:TGadget Field r:Int[] Field g:Int[] Field b:Int[] Field unitwidth:Int Field units:Int Field value:Int Field number:Int Field hidden : Byte ' Unitbar is invisible Field disabled: Byte ' Unitbar is diabled Field lmd:Int Field NewEvent:TEvent=New TEvent Function eventhook:Object(id:Int,data:Object,context:Object) If TUnitbar(context) TUnitbar(context).ev TEvent(data);Return data EndFunction Method New() AddHook EmitEventHook,eventhook,Self End Method Method Free() RemoveHook EmitEventHook,eventhook GCCollect() End Method Method Resizeheight(h:Int) SetGadgetShape canvas,GadgetX(canvas),GadgetY(canvas),GadgetWidth(canvas),h update End Method Method ev(event:TEvent) If event.source=canvas If event.id=EVENT_GADGETPAINT update If event.id=EVENT_MOUSEDOWN lmd=1 EndIf If event.id=EVENT_MOUSEUP lmd=0 NewEvent.id=EVENT_UNITBARCHANGED NewEvent.source=Self NewEvent.data=value EmitEvent NewEvent EndIf If lmd value=_Limit((EventX()-(number*12))/unitwidth,0,units-1) update NewEvent.id=EVENT_UNITBARCHANGE NewEvent.source=Self NewEvent.data=value EmitEvent NewEvent EndIf If event.id=EVENT_MOUSEENTER ActivateGadget canvas EndIf EndIf End Method Method _Limit(v:Int,l:Int,h:Int) If v<l Return l If v>h Return h Return v End Method Method update() Local t:Int Local mini:Int Local gh:Int=GadgetHeight(canvas) If hidden=False Then ' Unitbar hidden completely? ShowGadget (canvas) SetGraphics CanvasGraphics(canvas) SetClsColor 0,0,0;Cls If disabled=False Then ' Draw an enabled Unitbar only SetColor 100,100,100 For t=value To units DrawRect (number*12)+t*unitwidth+1,1,unitwidth-2,gh-1-1 Next For t=1 To value SetColor r[t],g[t],b[t] DrawRect (number*12)+t*unitwidth+1,1,unitwidth-2,gh-1-1 Next SetColor 255,255,255 DrawText value,number*12/2-TextWidth(value)/2,gh/2-TextHeight(value)/2 Else ' Draw an empty Unitbar SetColor 100,100,100 For t=1 To units DrawRect (number*12)+t*unitwidth+1,1,unitwidth-2,gh-1-1 Next value=0 SetColor 255,255,255 DrawText value,number*12/2-TextWidth(value)/2,gh/2-TextHeight(value)/2 EndIf ' Disabled Else HideGadget (canvas) EndIf ' Hidden Flip End Method Method Set(v:Int) value=_Limit(v,0,units-1) update End Method Method SetGradient(startR:Int,startG:Int,startB:Int,deltaR:Int,deltaG:Int,deltaB:Int) Local t:Int For t=0 To units-1 r[t]=_Limit(startR,0,255) g[t]=_Limit(startG,0,255) b[t]=_Limit(startB,0,255) startR:+deltaR startG:+deltaG startB:+deltaB Next update End Method Method Color(index:Int,_r:Int,_g:Int,_b:Int) index=_Limit(index,0,units-1) r[index]=_r g[index]=_g b[index]=_b update End Method EndType Function CreateUnitbar:TUnitbar(x:Int, y:Int, unitwidth:Int, units:Int, h:Int, hidden:Byte, disabled:Byte, parent:TGadget) Local a:TUnitbar=New TUnitbar Local tmp$=units a.number=Len(tmp) a.canvas=CreateCanvas(x,y,1+unitwidth*units+a.number*12,h,parent) a.unitwidth=unitwidth a.units=units a.r=a.r[..units] a.g=a.g[..units] a.b=a.b[..units] For Local t:Int=0 To units-1 a.r[t]=160 a.g[t]=160 a.b[t]=160 Next a.hidden=hidden a.disabled=disabled Return a End Function |
| ||
hm.. you need more practice with coding :P Don't do the showgadget/hidegadget in that update method, make seperate methods for it, remember that the update method is performed everytime a canvas event happens, including hoovering with the mouse on it.. |
| ||
This whole method stuff is new to me.Method Hide() HideGadget (canvas) hidden=True End Method Method Show() ShowGadget (canvas) hidden=False End Method Method update() Local t:Int Local mini:Int Local gh:Int=GadgetHeight(canvas) If hidden=False Then ' Unitbar hidden completely? SetGraphics CanvasGraphics(canvas) SetClsColor 0,0,0;Cls If disabled=False Then ' Draw an enabled Unitbar only SetColor 100,100,100 For t=value To units DrawRect (number*12)+t*unitwidth+1,1,unitwidth-2,gh-1-1 Next For t=1 To value SetColor r[t],g[t],b[t] DrawRect (number*12)+t*unitwidth+1,1,unitwidth-2,gh-1-1 Next SetColor 255,255,255 DrawText value,number*12/2-TextWidth(value)/2,gh/2-TextHeight(value)/2 Else ' Draw an empty Unitbar SetColor 100,100,100 For t=1 To units DrawRect (number*12)+t*unitwidth+1,1,unitwidth-2,gh-1-1 Next value=0 SetColor 255,255,255 DrawText value,number*12/2-TextWidth(value)/2,gh/2-TextHeight(value)/2 EndIf ' Disabled EndIf ' Hidden Flip End Method Better this way?!?^^ This canvas stuff drives me crazy. Why can't one simply resize it. Is it a bug or has it to be that way? 1.18 |
| ||
Ok, I added a new method called "MoveTo":Method MoveTo(x,y:Int) SetGadgetShape canvas,x,y,GadgetWidth(canvas),GadgetHeight(canvas) Update End Method I'm sure you can't find any tweaks for this one... ;))))))))))))) |
| ||
I'm a genius... :)))))))))))))))))))))))))))))))))))))))))))) Brute force is with me.... muhahahahahaha Method Resizeheight(h:Int, parent:TGadget) Local gx:Int=GadgetX(canvas) Local gy:Int=GadgetY(canvas) Local gw:Int=GadgetWidth(canvas) FreeGadget(canvas) GCCollect() canvas=CreateCanvas(gx,gy,gw,h,parent) Update End Method |
| ||
Resizing the Unitbar works now in width terms as well. But there is a problem with ints / floats so it isn't 100% nice looking in all situations. Do you have a better idea for Method ResizeFull? Complete updated source: Type TUnitbar Rem TUnitbar: CS_TBL, Grisu Version: 1.0.2 [16.04.06] Usage: MyUnitbar:TUnitbar=CreateUnitbar:TUnitbar(x,y,unitsize, units, height, hidden, disabled, parent) EndRem Field canvas:TGadget Field r:Int[] Field g:Int[] Field b:Int[] Field unitwidth:Float Field units:Int Field value:Int Field number:Int Field hidden : Byte ' Unitbar is invisible Field disabled: Byte ' Unitbar is diabled Field lmd:Int Field NewEvent:TEvent=New TEvent Function eventhook:Object(id:Int,data:Object,context:Object) If TUnitbar(context) TUnitbar(context).ev TEvent(data);Return data EndFunction Method New() AddHook EmitEventHook,eventhook,Self End Method Method Free() RemoveHook EmitEventHook,eventhook GCCollect() End Method Method ResizeHeight(h:Int, parent:TGadget) ' Resize Unitbarheight Local gx:Int=GadgetX(canvas) Local gy:Int=GadgetY(canvas) Local gw:Int=GadgetWidth(canvas) FreeGadget(canvas) GCCollect() canvas=CreateCanvas(gx,gy,gw,h,parent) Update End Method Method ResizeFull(h,w:Int, parent:TGadget) ' Resize Unitbar both w + h wise, needs tweaking Local gx:Int=GadgetX(canvas) Local gy:Int=GadgetY(canvas) Local gw:Int=GadgetWidth(canvas) Local bakunitwidth:Float=unitwidth Local bakunits:Int=units Local baknumber:Int=number*12 FreeGadget(canvas) GCCollect() ' unitwidth=bakunitwidth+(w-gw)/bakunits unitwidth=(w-baknumber)/bakunits canvas=CreateCanvas(gx,gy,w,h,parent) Update End Method Method ev(event:TEvent) If event.source=canvas If event.id=EVENT_GADGETPAINT Then Update If event.id=EVENT_MOUSEDOWN lmd=1 EndIf If event.id=EVENT_MOUSEUP lmd=0 NewEvent.id=EVENT_UNITBARCHANGED NewEvent.source=Self NewEvent.data=value EmitEvent NewEvent EndIf If lmd value=_Limit((EventX()-(number*12))/unitwidth,0,units-1) Update NewEvent.id=EVENT_UNITBARCHANGE NewEvent.source=Self NewEvent.data=value EmitEvent NewEvent EndIf If event.id=EVENT_MOUSEENTER ActivateGadget canvas EndIf EndIf End Method Method _Limit(v:Int,l:Int,h:Int) If v<l Return l If v>h Return h Return v End Method Method MoveTo(x,y:Int) ' Move the Unitbar SetGadgetShape canvas,x,y,GadgetWidth(canvas),GadgetHeight(canvas) Update End Method Method Hide() ' Hide the Unitbar HideGadget (canvas) hidden=True End Method Method Show() ' Show the Unitbar ShowGadget (canvas) hidden=False End Method Method Update() ' Update the Unitbar If hidden=False Then ' Unitbar hidden completely? Local t:Int Local mini:Int Local gh:Int=GadgetHeight(canvas) SetGraphics CanvasGraphics(canvas) SetClsColor 0,0,0;Cls If disabled=False Then ' Draw an enabled Unitbar only SetColor 100,100,100 For t=value To units-2 DrawRect (number*12)+t*unitwidth+1,1,unitwidth-2,gh-1-1 Next For t=0 To value-1 SetColor r[t],g[t],b[t] DrawRect (number*12)+t*unitwidth+1,1,unitwidth-2,gh-1-1 Next SetColor 255,255,255 DrawText value,number*12/2-TextWidth(value)/2,gh/2-TextHeight(value)/2 Else ' Draw an empty Unitbar SetColor 100,100,100 For t=0 To units-1 DrawRect (number*12)+t*unitwidth+1,1,unitwidth-2,gh-1-1 Next value=0 SetColor 255,255,255 DrawText value,number*12/2-TextWidth(value)/2,gh/2-TextHeight(value)/2 EndIf ' Disabled Flip EndIf ' Hidden End Method Method Set(v:Int) value=_Limit(v,0,units-1) Update End Method Method SetGradient(startR:Int,startG:Int,startB:Int,deltaR:Int,deltaG:Int,deltaB:Int) Local t:Int For t=0 To units-1 r[t]=_Limit(startR,0,255) g[t]=_Limit(startG,0,255) b[t]=_Limit(startB,0,255) startR:+deltaR startG:+deltaG startB:+deltaB Next Update End Method Method Color(index:Int,_r:Int,_g:Int,_b:Int) index=_Limit(index,0,units-1) r[index]=_r g[index]=_g b[index]=_b Update End Method EndType Function CreateUnitbar:TUnitbar(x:Int, y:Int, unitwidth:Int, units:Int, h:Int, hidden:Byte, disabled:Byte, parent:TGadget) Local a:TUnitbar=New TUnitbar Local tmp$=units a.number=Len(tmp) a.canvas=CreateCanvas(x,y,unitwidth*units+a.number*12,h,parent) a.unitwidth=unitwidth a.units=units a.r=a.r[..units] a.g=a.g[..units] a.b=a.b[..units] For Local t:Int=0 To units-1 a.r[t]=160 a.g[t]=160 a.b[t]=160 Next a.hidden=hidden a.disabled=disabled Return a End Function |