Got a LiveCode personal license? Are you a beginner, hobbyist or educator that's new to LiveCode? This forum is the place to go for help getting started. Welcome!
Moderators: FourthWorld, heatherlaine, Klaus, kevinmiller
-
KennyR
- Posts: 256
- Joined: Thu Jan 19, 2012 4:25 am
Post
by KennyR » Thu Mar 06, 2014 4:42 am
Okay last post for the evening....I swear!!
I would like to restrict the movement of a button to only the x and y coordinates and prevent the grab command from allowing any diagonal movement. I want to have the buttons on the card move like tiles and only allow movement along the vertical and horizontal axis. I will attach a pic of what I am doing and you will understand what I mean. (hopefully). I am attaching the code I have in each button to allow the buttons to switch places. All of this works fine with the exception to the restriction of movement I am looking for....any suggestions would be greatly appreciated!
Code: Select all
global vOldLoc
local vX,vY,vArea
on mouseDown
grab me
set the layer of me to top
--Record the location of the button that was chosen to drag--
put the loc of me into vOldLoc
end mouseDown
on mouseStillDown
--Track the location of the grabbed button--
put the loc of me into vArea
--X location
put item 1 of vArea into vX
--Y location
put item 2 of vArea into vY
--Evaluate x,y movement--
switch
case item 2 of vOldLoc < item 2 of vArea
repeat with x=1 to the number of btns on this cd
if the intersect(me,btn x) then
put the short name of btn x into vName
put the loc of btn x into vLoc
move me to vLoc in 10 ticks
exit repeat
else
end if
end repeat
move btn vName to vOldLoc in 10 ticks
break
case item 2 of vOldLoc > item 2 of vArea
repeat with x=1 to the number of btns on this cd
if the intersect(me,btn x) then
put the short name of btn x into vName
put the loc of btn x into vLoc
move me to vLoc in 10 ticks
exit repeat
else
end if
end repeat
move btn vName to vOldLoc in 10 ticks
break
case item 1 of vOldLoc > item 1 of vArea
repeat with x=1 to the number of btns on this cd
if the intersect(me,btn x) then
put the short name of btn x into vName
put the loc of btn x into vLoc
move me to vLoc in 10 ticks
exit repeat
else
end if
end repeat
move btn vName to vOldLoc in 10 ticks
break
case item 1 of vOldLoc < item 1 of vArea
repeat with x=1 to the number of btns on this cd
if the intersect(me,btn x) then
put the short name of btn x into vName
put the loc of btn x into vLoc
move me to vLoc in 10 ticks
exit repeat
else
end if
end repeat
--Move the button that was intersected to the grabbed buttons first location--
move btn vName to vOldLoc in 10 ticks
break
default
end switch
end mouseStillDown
[img]
[/img]
-
dunbarx
- VIP Livecode Opensource Backer

- Posts: 10335
- Joined: Wed May 06, 2009 2:28 pm
Post
by dunbarx » Thu Mar 06, 2014 6:03 am
Well, it is late for me too. This works, but needs smoothing. But maybe it will give you an idea.
I made a new button and put this into its script
Code: Select all
global hloc,vloc
on mouseMove
if the mouse is down then
if item 1 of the mouseLoc - hloc > item 2 of the mouseLoc - vloc then
repeat until the mouse is up
set the loc of me to item 1 of the mouseLoc & "," & item 2 of the loc of me
end repeat
exit to top
else
repeat until the mouse is up
set the loc of me to item 1 of the loc of me & "," & item 2 of the mouseLoc
end repeat
exit to top
end if
end if
end mouseMove
on mouseEnter
put item 1 of the clickloc into hLoc
put item 2 of the clickLoc into vLoc
end mouseEnter
Click on the button, whichever way you drag closer to one of the axes, the button will track.
Craig Newman
-
Klaus
- Posts: 14205
- Joined: Sat Apr 08, 2006 8:41 am
-
Contact:
Post
by Klaus » Thu Mar 06, 2014 1:35 pm
Hi guys,
"mousemove" comes with 2 very convenient parameters: x,y
So no need to check the mouseloc later in that handler (doesn't hurt, of course

):
Code: Select all
on mousemove x,y
## do something with x and y
end mousemove
Best
Klaus
-
KennyR
- Posts: 256
- Joined: Thu Jan 19, 2012 4:25 am
Post
by KennyR » Thu Mar 06, 2014 1:55 pm
Thanks Craig for your help! Could you elaborate a bit on your repeat loops so I can get a better idea of what your looking for? It seems the handler works fine on the y axis but is spotty when you attempt the x axis. I know you said it needs to be smoothed, but I'm having a tough time understanding the loops....I was also thinking maybe I could give the illusion the user is controlling movement by tracking the location of the mouse and sending a move command to either the x or y axis. That way tiles are only exchanges one at a time and skipping over them would not be possible. Maybe a touchMove handler would be appropriate? Is this the same thing as the mouseEnter command?
-
KennyR
- Posts: 256
- Joined: Thu Jan 19, 2012 4:25 am
Post
by KennyR » Thu Mar 06, 2014 2:56 pm
Klaus! Nice! Working on it now...
-
dunbarx
- VIP Livecode Opensource Backer

- Posts: 10335
- Joined: Wed May 06, 2009 2:28 pm
Post
by dunbarx » Thu Mar 06, 2014 3:36 pm
Klaus is right, as usual, about the x,y.
Losing loops is always better in favor of native functionality.
My offering was more geared toward detecting the initial direction of movement, either left/right or up/down, in order to lock all subsequent movement to the axis indicated. This is the heart of the task.
Craig
-
KennyR
- Posts: 256
- Joined: Thu Jan 19, 2012 4:25 am
Post
by KennyR » Thu Mar 06, 2014 3:48 pm
Hey guys....I have been fooling around with the touchMove handler since this will be on an iOS device...having luck with the x axis but not the Y.....any ideas?
Code: Select all
global vX,vY
on touchStart tID
put item 1 of the loc of me into vX
put item 2 of the loc of me into vY
end touchStart
on touchEnd
end touchEnd
on touchMove tID, pX,pY
if pX > vX or pX<vX then
put vY into pY
else
end if
if pY>vY or pY<vY then
put vX into pX
else
end if
set the location of the target to pX,pY
end touchMove