Beginner Object Selection Problem
BlitzMax Forums/BlitzMax Beginners Area/Beginner Object Selection Problem
| ||
Hi, i try to figure out how to make a correct Button Selection. If you hold down the Mousekey outside the Range of the Button and move the Mouse over the button it still getīs selected ( it shouldnīt ) . I canīt figure out yet how to set up a condition that says " If you click outside of a Range from a Object , it canīt be selected or the highlight Method gets not executed " . Wrong Direction ? Thx, D Rem OOP Test Rectangle Select End Rem SuperStrict Graphics 800,600 Global x:Int Global y:Int Type button Field x_pos : Int Field y_pos : Int Field width :Int,height :Int Field color_r :Int,color_g :Int ,color_b :Int Field name : Int Method drawbutton() SetColor (color_r,color_g,color_b) DrawRect (x_pos,y_pos,width,height) End Method Method highlight() SetColor (255,255,255) DrawRect (x_pos-5,y_pos-5,110,110) DrawText "Button : " + name ,x_pos,y_pos+120 End Method Method MouseCollision() If x>= X_pos And y>= Y_pos And x <= X_pos + width And y <= Y_pos + height And MouseDown(1) highlight() End If End Method End Type ' create instances of the Class " button " Local one:button = New button Local two:button = New button Local three:button = New button one.x_pos = 20 one.y_pos = 20 one.width = 100 one.height = 100 one.color_r = 255 one.color_g = 0 one.color_b = 255 one.name = 1 two.x_pos = 200 two.y_pos = 20 two.width = 100 two.height = 100 two.color_r = 0 two.color_g = 0 two.color_b = 255 two.name = 2 three.x_pos = 400 three.y_pos = 20 three.width = 100 three.height = 100 three.color_r = 0 three.color_g = 255 three.color_b = 0 three.name = 3 While Not KeyHit(KEY_ESCAPE) Cls x=MouseX() y=MouseY() one.mouseCollision() one.drawbutton() two.mouseCollision() two.drawbutton() three.mouseCollision() three.drawbutton() Flip Wend |
| ||
I am doing something like that in a file requester I am working on. And it's not as easy as it seems. first create a mouse handling function/type. You need to keep track of the mouse button previous status. Create an inuse/free state based on that. When in use you are not allowed to select. and it locks what ever object/button selected in a selected state. I don't have time to make an example for you right now. I will post a usable code example with in the next 24hrs if you need it. Not shure how soon I will have time though. |
| ||
With the least modification of your code you could do something like this: |
| ||
Thx for your replies and code ! Iīm analyzing it ..... The thing with the code obove is : When i tri this it works when i press the button outside of the range , great ! My second Question is when i select the button and then go outside the button should be still selected . Something like " if you have selected the button ( mousekey down) and go outside while holding the mousekey it is still selected " . Iīve tried several things......not realy happening .. |
| ||
Any Idea ? |
| ||
Most GUI's will let you press the mouse while over a button, which will show the button selected, and then let you drag the mouse with the button held down to outside of the button, at which point the button shows as not selected, but then allows that so long as you are still holding down the mouse when you `re-enter` the button it will show as selected again, and only if the mouse is let go while inside of the button is it considered a hit. You can of couse make it so that the image of the button stays `down` until you let go of the mouse. Something like this, procedurally, not tested: ButtonLeft=50 ButtonRight=100 ButtonTop=50 ButtonBottom=100 WasDown=False ButtonPressing=False ButtonClicked=True Repeat WasDown=Down Down=MouseDown(1) If WasDown=False If Down=True 'User just pressed the mouse If MouseX()>=ButtonLeft And MouseY()>=ButtonTop And MouseX()<=ButtonRight And MouseX()<=ButtonBottom 'User just pressed the mouse inside the button ButtonPressing=True 'Draw the button in its pressed state Else 'User pressed the mouse but outside the button EndIf Else 'User is still not pressing the mouse - don't do anything Endif Else If Down=True 'User is still pressing the mouse 'This is where you deal with the mouse being held down while 'the mouse might be moving into or out of the button area, after 'the mouse was initially clicked and before it is released 'If you do not want the button to return temporarily to a 'non-pressed state when the user drags the mouse outside 'the button while holding the mouse down, do not do anything in 'this section, otherwise... If ButtonPressing=True If MouseX()>=ButtonLeft And MouseY()>=ButtonTop And MouseX()<=ButtonRight And MouseY()<=ButtonBottom 'Draw the button as pressed Else 'Draw the button as not pressed EndIf EndIf Else 'User just let go of the mouse 'Draw the button in its non-pressed state ButtonPressing=False If MouseX()>=ButtonLeft And MouseY()>=ButtonTop And MouseX()<=ButtonRight And MouseY()<=ButtonBottom ButtonClicked=True 'Success! EndIf Endif EndIf Until KeyHit(KEY_ESCAPE) Or ButtonClicked=True |
| ||
Wow, Thx for the Replies ! Great Forum , verry humble and instructive ! In lots of other forums there were guys arround , showing beginners her mistakes in a verry arrogant way ( nasty coments ). This here is really cool , good kinda vibe ! Thx. :-) For the Programm , i just extend the Code , added a Type ( state ) and another Condition to the Mouse Collision Method . It works ! Some mistakes ? I will try Imaginarys Code example too. |
| ||
There is one Question left . If you can see , the mainloop is quit big . If i want to draw more Objects or " Instances " like in a bigger Interface with over 20 buttons i have to add more lines to the loop and instance Variables. Every Button has some Parameter in common except the Color and the Position. Is there a more handy way to have less lines of code ? Here the Example : |
| ||
superstrict seedrnd (millisecs()) type Ttest global list:Tlist = new Tlist field blub:int method new() list.addlast(self) end method method show() print blub end method end type for local i:int = 1 to 20 local test:ttest = new ttest test.blub = rand(1,100) next for local s:ttest = eachin TTest.list s.show() next Adding a list will solve this, cause you don'T need the variable to adress the type instance- as long as it is stored in some place you can always adress it. |