Linking object to joystick

Sorry cannot believe I am stuck on this but I cant seem to link the simplejoystick.lua (Rob’s simple module) to the object that I want to move. I have activated the module and created the joystick ( js:activate() ) but how do I link the joystick to a function/listener to move an object?

 

I managed it using the lib_analog_stick.lua module but had problems with two buttons on screen as that joystick did not seem to have a deadzone so when I click the other tap button it affected the joystick.

 

I tried using roaming gamers joystick in the ssk but I cannot seem to get it activated at all. Don’t think I have the requirements in the correct places.

@Mark,

Hi.  My joystick isn’t really linked to objects.  It emits ‘events’ and the object that you want to move based on that event, must listen for it.

Take a look at the ssk sampler in this exact file:

https://github.com/roaminggamer/SSKCorona/blob/master/sampler/samples/demos/oneStick/app.lua

There is also a new sample app (check the most recent daily build) under Hardware/InputDevices that demonstrates mixing touch screen/keyboard/joystick input that may be of interest.

For the Joystick that I use, You don’t really tie the joystick to an object.  Instead you use an enterFrame listener that fires ever frame that moves your object.  In that function you read the joystick’s values and then based on the value of the joystick you move the object.  Consider this code:

local function moveElf(event) if elf.isFrozen then return true end -- object can't move if pauseGame then return true end -- the game has been paused -- -- in my game, I don't care about any direction. I just want to know if the joystick is being pressed -- up or down. -- Something else controls moving forward backwards. But you can see how I get the angle the JS is -- being pressed. -- local dir = 0 if joystick.angle \> 180 and joystick.angle \< 360 then dir = 1 elseif joystick.angle \> 0 and joystick.angle \< 180 then dir = -1 end if dir ~= elf.curDir then -- if we change direction play a sound indicating we changed direction sfx:playSound("woosh") end elf.curDir = dir -- -- calculate a new Y distance -- and move the object -- dY = joystick.distance / 8 \* dir if (elf.y + dY) \< (display.contentHeight - (elf.height / 2)) and (elf.y + dY) \> 110 then elf.y = elf.y + dY end end

Rob

Thanks for the replies guys.

@Rob - looking back at your code does the controller only allow for four direction movement (ie not free movement of the object) and I would need to add code to enable this?

@Michael W - thanks for the info although I’ve downloaded the latest daily build and cannot find the example you have mentioned…

@roaminggamer - Ah that makes sense now looking more at your code. I’ll try and get my head round that code, have just started trying to get my head around the way you set-up object listening for event so i’ll have to look into that further.

The old code below made by X-Pressive was working for me but the issue I have is that while I’m using the joystick I cannot click elsewhere on the screen without it screwing up the joystick. Is there something I can enter that will stop this from happening?

local playerM = require("player")&nbsp; ]]-- local js = {} local Pi &nbsp; &nbsp;= math.pi local Sqr &nbsp; = math.sqrt local Rad &nbsp; = math.rad local Sin &nbsp; = math.sin local Cos &nbsp; = math.cos local Ceil &nbsp;= math.ceil local Atan2 = math.atan2 local NewStick local Group ---------------------------------------------------------------- -- FUNCTION: CREATE&nbsp; ---------------------------------------------------------------- function NewStick( Props ) &nbsp; &nbsp; &nbsp; &nbsp; Group &nbsp; &nbsp; &nbsp; &nbsp; = display.newGroup() &nbsp; &nbsp; &nbsp; &nbsp; Group.x &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = Props.x &nbsp; &nbsp; &nbsp; &nbsp; Group.y &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = Props.y &nbsp; &nbsp; &nbsp; &nbsp; Group.Timer &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = nil &nbsp; &nbsp; &nbsp; &nbsp; Group.angle &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = 0 &nbsp; &nbsp; &nbsp; &nbsp; Group.distance &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= 0 &nbsp; &nbsp; &nbsp; &nbsp; Group.percent &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = 0 &nbsp; &nbsp; &nbsp; &nbsp; Group.maxDist &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = Props.borderSize &nbsp; &nbsp; &nbsp; &nbsp; Group.snapBackSpeed = Props.snapBackSpeed ~= nil and Props.snapBackSpeed or .7 &nbsp; &nbsp; &nbsp; &nbsp; --Group.Border = display.newCircle(0,0,Props.borderSize) -- picture here? &nbsp; &nbsp; &nbsp; &nbsp; Group.Border = display.newImageRect("joystickmain1a.png",64,64) &nbsp; &nbsp; &nbsp; &nbsp; --Group.Border.strokeWidth = 1 &nbsp; &nbsp; &nbsp; &nbsp; --Group.Border:setFillColor &nbsp;(255,0,0,46) &nbsp; &nbsp; &nbsp; &nbsp; --Group.Border:setStrokeColor(Props.R,Props.G,Props.B,255) &nbsp; &nbsp; &nbsp; &nbsp; Group:insert(Group.Border) &nbsp; &nbsp; &nbsp; &nbsp; --Group.Thumb = display.newCircle(0,0,Props.thumbSize) -- picture here? &nbsp; &nbsp; &nbsp; &nbsp; Group.Thumb = display.newImageRect("joystickmain1b.png", 48, 48) -- picture here? &nbsp; &nbsp; &nbsp; &nbsp;-- Group.Thumb.strokeWidth = 1 &nbsp; &nbsp; &nbsp; &nbsp;-- Group.Thumb:setFillColor &nbsp;(Props.R,Props.G,Props.B,96) &nbsp; &nbsp; &nbsp; &nbsp;-- Group.Thumb:setStrokeColor(Props.R,Props.G,Props.B,255) &nbsp; &nbsp; &nbsp; &nbsp; Group.Thumb.x0 = 0 &nbsp; &nbsp; &nbsp; &nbsp; Group.Thumb.y0 = 0 &nbsp; &nbsp; &nbsp; &nbsp; Group:insert(Group.Thumb) &nbsp; &nbsp; &nbsp; &nbsp; --------------------------------------------- &nbsp; &nbsp; &nbsp; &nbsp; -- METHOD: DELETE STICK &nbsp; &nbsp; &nbsp; &nbsp; --------------------------------------------- &nbsp; &nbsp; &nbsp; &nbsp; function Group:delete() &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.Border &nbsp; &nbsp;= nil &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.Thumb &nbsp; &nbsp; = nil &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if self.Timer ~= nil then timer.cancel(self.Timer); self.Timer = nil end &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self:removeSelf() &nbsp; &nbsp; &nbsp; &nbsp; end &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --------------------------------------------- &nbsp; &nbsp; &nbsp; &nbsp; -- METHOD: MOVE AN OBJECT &nbsp; &nbsp; &nbsp; &nbsp; --------------------------------------------- &nbsp; &nbsp; &nbsp; &nbsp; function Group:move(Obj, maxSpeed, rotate) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if rotate == true then Obj.rotation = self.angle end print("self.angle = "..tostring(self.angle)) print("self.distance = "..tostring(self.distance)) print("maxSpeed \* self.percent = "..tostring(maxSpeed \* self.percent)) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Obj.x = Obj.x + Cos( Rad(self.angle-90) ) \* (maxSpeed \* self.percent)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Obj.y = Obj.y + Sin( Rad(self.angle-90) ) \* (maxSpeed \* self.percent)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --------------------------------------------- &nbsp; &nbsp; &nbsp; &nbsp; -- GETTER METHODS &nbsp; &nbsp; &nbsp; &nbsp; --------------------------------------------- &nbsp; &nbsp; &nbsp; &nbsp; function Group:getDistance() return self.distance &nbsp; &nbsp;end &nbsp; &nbsp; &nbsp; &nbsp; function Group:getPercent () return self.percent &nbsp; &nbsp; end &nbsp; &nbsp; &nbsp; &nbsp; function Group:getAngle &nbsp; () return Ceil(self.angle) end &nbsp; &nbsp; &nbsp; &nbsp; --------------------------------------------- &nbsp; &nbsp; &nbsp; &nbsp; -- HANDLER: ON DRAG &nbsp; &nbsp; &nbsp; &nbsp; --------------------------------------------- &nbsp; &nbsp; &nbsp; &nbsp; Group.onDrag = function ( event ) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local T &nbsp; &nbsp; = event.target -- THUMB &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local S &nbsp; &nbsp; = T.parent &nbsp; &nbsp; -- STICK &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local phase = event.phase &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local ex,ey = S:contentToLocal(event.x, event.y) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ex = ex - T.x0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ey = ey - T.y0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if "began" == phase then &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if S.Timer ~= nil then timer.cancel(S.Timer); S.Timer = nil end &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; display.getCurrentStage():setFocus( T ) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.isFocus = true &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -- STORE INITIAL POSITION &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.x0 = ex - T.x &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.y0 = ey - T.y &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elseif T.isFocus then &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if "moved" == phase then &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ----------- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S.distance &nbsp; &nbsp;= Sqr (ex\*ex + ey\*ey) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if S.distance \> S.maxDist then S.distance = S.maxDist end &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S.angle &nbsp; &nbsp; &nbsp; = ( (Atan2( ex-0,ey-0 )\*180 / Pi) - 180 ) \* -1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S.percent &nbsp; &nbsp; = S.distance / S.maxDist &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ----------- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.x &nbsp; &nbsp; &nbsp; = Cos( Rad(S.angle-90) ) \* (S.maxDist \* S.percent)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.y &nbsp; &nbsp; &nbsp; = Sin( Rad(S.angle-90) ) \* (S.maxDist \* S.percent)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elseif "ended"== phase or "cancelled" == phase then &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.x0 &nbsp; &nbsp; &nbsp;= 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.y0 &nbsp; &nbsp; &nbsp;= 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.isFocus = false &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; display.getCurrentStage():setFocus( nil ) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S.Timer = timer.performWithDelay( 33, S.onRelease, 0 ) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S.Timer.MyStick = S --added so that angle reverted to 0 when stick is released S.angle = 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -- STOP FURTHER PROPAGATION OF TOUCH EVENT! &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true &nbsp; &nbsp; &nbsp; &nbsp; end &nbsp; &nbsp; &nbsp; &nbsp; --------------------------------------------- &nbsp; &nbsp; &nbsp; &nbsp; -- HANDLER: ON DRAG RELEASE &nbsp; &nbsp; &nbsp; &nbsp; --------------------------------------------- &nbsp; &nbsp; &nbsp; &nbsp; Group.onRelease = function( event ) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local S = event.source.MyStick &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local T = S.Thumb &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local dist = S.distance \> S.maxDist and S.maxDist or S.distance &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dist = dist \* S.snapBackSpeed &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.x = Cos( Rad(S.angle-90) ) \* dist&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.y = Sin( Rad(S.angle-90) ) \* dist&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local ex = T.x &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local ey = T.y &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ----------- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S.distance = Sqr (ex\*ex + ey\*ey) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if S.distance \> S.maxDist then S.distance = S.maxDist end &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S.angle &nbsp; &nbsp;= ( (Atan2( ex-0,ey-0 )\*180 / Pi) - 180 ) \* -1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S.percent &nbsp;= S.distance / S.maxDist &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ----------- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if S.distance \< .5 then &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S.distance = 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S.percent &nbsp;= 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.x &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.y &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; timer.cancel(S.Timer); S.Timer = nil &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end &nbsp; &nbsp; &nbsp; &nbsp; end &nbsp; &nbsp; &nbsp; &nbsp; Group.Thumb:addEventListener( "touch", Group.onDrag ) &nbsp; &nbsp; &nbsp; &nbsp; return Group end js.NewStick = NewStick return js

The JS I use (again, not my code…) returns a distance and a radius where the JS is pressed to.  The radius returned seems a little backwards (0 is east, 90 is north, 180 west and 270 south)

Rob

It is in <Corona Labs Install Directory>/Sample Code/Hardware/InputDevices/main.lua

@Mark,

Hi.  My joystick isn’t really linked to objects.  It emits ‘events’ and the object that you want to move based on that event, must listen for it.

Take a look at the ssk sampler in this exact file:

https://github.com/roaminggamer/SSKCorona/blob/master/sampler/samples/demos/oneStick/app.lua

There is also a new sample app (check the most recent daily build) under Hardware/InputDevices that demonstrates mixing touch screen/keyboard/joystick input that may be of interest.

For the Joystick that I use, You don’t really tie the joystick to an object.  Instead you use an enterFrame listener that fires ever frame that moves your object.  In that function you read the joystick’s values and then based on the value of the joystick you move the object.  Consider this code:

local function moveElf(event) if elf.isFrozen then return true end -- object can't move if pauseGame then return true end -- the game has been paused -- -- in my game, I don't care about any direction. I just want to know if the joystick is being pressed -- up or down. -- Something else controls moving forward backwards. But you can see how I get the angle the JS is -- being pressed. -- local dir = 0 if joystick.angle \> 180 and joystick.angle \< 360 then dir = 1 elseif joystick.angle \> 0 and joystick.angle \< 180 then dir = -1 end if dir ~= elf.curDir then -- if we change direction play a sound indicating we changed direction sfx:playSound("woosh") end elf.curDir = dir -- -- calculate a new Y distance -- and move the object -- dY = joystick.distance / 8 \* dir if (elf.y + dY) \< (display.contentHeight - (elf.height / 2)) and (elf.y + dY) \> 110 then elf.y = elf.y + dY end end

Rob

Thanks for the replies guys.

@Rob - looking back at your code does the controller only allow for four direction movement (ie not free movement of the object) and I would need to add code to enable this?

@Michael W - thanks for the info although I’ve downloaded the latest daily build and cannot find the example you have mentioned…

@roaminggamer - Ah that makes sense now looking more at your code. I’ll try and get my head round that code, have just started trying to get my head around the way you set-up object listening for event so i’ll have to look into that further.

The old code below made by X-Pressive was working for me but the issue I have is that while I’m using the joystick I cannot click elsewhere on the screen without it screwing up the joystick. Is there something I can enter that will stop this from happening?

local playerM = require("player")&nbsp; ]]-- local js = {} local Pi &nbsp; &nbsp;= math.pi local Sqr &nbsp; = math.sqrt local Rad &nbsp; = math.rad local Sin &nbsp; = math.sin local Cos &nbsp; = math.cos local Ceil &nbsp;= math.ceil local Atan2 = math.atan2 local NewStick local Group ---------------------------------------------------------------- -- FUNCTION: CREATE&nbsp; ---------------------------------------------------------------- function NewStick( Props ) &nbsp; &nbsp; &nbsp; &nbsp; Group &nbsp; &nbsp; &nbsp; &nbsp; = display.newGroup() &nbsp; &nbsp; &nbsp; &nbsp; Group.x &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = Props.x &nbsp; &nbsp; &nbsp; &nbsp; Group.y &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = Props.y &nbsp; &nbsp; &nbsp; &nbsp; Group.Timer &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = nil &nbsp; &nbsp; &nbsp; &nbsp; Group.angle &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = 0 &nbsp; &nbsp; &nbsp; &nbsp; Group.distance &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= 0 &nbsp; &nbsp; &nbsp; &nbsp; Group.percent &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = 0 &nbsp; &nbsp; &nbsp; &nbsp; Group.maxDist &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = Props.borderSize &nbsp; &nbsp; &nbsp; &nbsp; Group.snapBackSpeed = Props.snapBackSpeed ~= nil and Props.snapBackSpeed or .7 &nbsp; &nbsp; &nbsp; &nbsp; --Group.Border = display.newCircle(0,0,Props.borderSize) -- picture here? &nbsp; &nbsp; &nbsp; &nbsp; Group.Border = display.newImageRect("joystickmain1a.png",64,64) &nbsp; &nbsp; &nbsp; &nbsp; --Group.Border.strokeWidth = 1 &nbsp; &nbsp; &nbsp; &nbsp; --Group.Border:setFillColor &nbsp;(255,0,0,46) &nbsp; &nbsp; &nbsp; &nbsp; --Group.Border:setStrokeColor(Props.R,Props.G,Props.B,255) &nbsp; &nbsp; &nbsp; &nbsp; Group:insert(Group.Border) &nbsp; &nbsp; &nbsp; &nbsp; --Group.Thumb = display.newCircle(0,0,Props.thumbSize) -- picture here? &nbsp; &nbsp; &nbsp; &nbsp; Group.Thumb = display.newImageRect("joystickmain1b.png", 48, 48) -- picture here? &nbsp; &nbsp; &nbsp; &nbsp;-- Group.Thumb.strokeWidth = 1 &nbsp; &nbsp; &nbsp; &nbsp;-- Group.Thumb:setFillColor &nbsp;(Props.R,Props.G,Props.B,96) &nbsp; &nbsp; &nbsp; &nbsp;-- Group.Thumb:setStrokeColor(Props.R,Props.G,Props.B,255) &nbsp; &nbsp; &nbsp; &nbsp; Group.Thumb.x0 = 0 &nbsp; &nbsp; &nbsp; &nbsp; Group.Thumb.y0 = 0 &nbsp; &nbsp; &nbsp; &nbsp; Group:insert(Group.Thumb) &nbsp; &nbsp; &nbsp; &nbsp; --------------------------------------------- &nbsp; &nbsp; &nbsp; &nbsp; -- METHOD: DELETE STICK &nbsp; &nbsp; &nbsp; &nbsp; --------------------------------------------- &nbsp; &nbsp; &nbsp; &nbsp; function Group:delete() &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.Border &nbsp; &nbsp;= nil &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.Thumb &nbsp; &nbsp; = nil &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if self.Timer ~= nil then timer.cancel(self.Timer); self.Timer = nil end &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self:removeSelf() &nbsp; &nbsp; &nbsp; &nbsp; end &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --------------------------------------------- &nbsp; &nbsp; &nbsp; &nbsp; -- METHOD: MOVE AN OBJECT &nbsp; &nbsp; &nbsp; &nbsp; --------------------------------------------- &nbsp; &nbsp; &nbsp; &nbsp; function Group:move(Obj, maxSpeed, rotate) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if rotate == true then Obj.rotation = self.angle end print("self.angle = "..tostring(self.angle)) print("self.distance = "..tostring(self.distance)) print("maxSpeed \* self.percent = "..tostring(maxSpeed \* self.percent)) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Obj.x = Obj.x + Cos( Rad(self.angle-90) ) \* (maxSpeed \* self.percent)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Obj.y = Obj.y + Sin( Rad(self.angle-90) ) \* (maxSpeed \* self.percent)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --------------------------------------------- &nbsp; &nbsp; &nbsp; &nbsp; -- GETTER METHODS &nbsp; &nbsp; &nbsp; &nbsp; --------------------------------------------- &nbsp; &nbsp; &nbsp; &nbsp; function Group:getDistance() return self.distance &nbsp; &nbsp;end &nbsp; &nbsp; &nbsp; &nbsp; function Group:getPercent () return self.percent &nbsp; &nbsp; end &nbsp; &nbsp; &nbsp; &nbsp; function Group:getAngle &nbsp; () return Ceil(self.angle) end &nbsp; &nbsp; &nbsp; &nbsp; --------------------------------------------- &nbsp; &nbsp; &nbsp; &nbsp; -- HANDLER: ON DRAG &nbsp; &nbsp; &nbsp; &nbsp; --------------------------------------------- &nbsp; &nbsp; &nbsp; &nbsp; Group.onDrag = function ( event ) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local T &nbsp; &nbsp; = event.target -- THUMB &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local S &nbsp; &nbsp; = T.parent &nbsp; &nbsp; -- STICK &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local phase = event.phase &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local ex,ey = S:contentToLocal(event.x, event.y) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ex = ex - T.x0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ey = ey - T.y0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if "began" == phase then &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if S.Timer ~= nil then timer.cancel(S.Timer); S.Timer = nil end &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; display.getCurrentStage():setFocus( T ) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.isFocus = true &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -- STORE INITIAL POSITION &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.x0 = ex - T.x &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.y0 = ey - T.y &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elseif T.isFocus then &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if "moved" == phase then &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ----------- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S.distance &nbsp; &nbsp;= Sqr (ex\*ex + ey\*ey) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if S.distance \> S.maxDist then S.distance = S.maxDist end &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S.angle &nbsp; &nbsp; &nbsp; = ( (Atan2( ex-0,ey-0 )\*180 / Pi) - 180 ) \* -1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S.percent &nbsp; &nbsp; = S.distance / S.maxDist &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ----------- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.x &nbsp; &nbsp; &nbsp; = Cos( Rad(S.angle-90) ) \* (S.maxDist \* S.percent)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.y &nbsp; &nbsp; &nbsp; = Sin( Rad(S.angle-90) ) \* (S.maxDist \* S.percent)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elseif "ended"== phase or "cancelled" == phase then &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.x0 &nbsp; &nbsp; &nbsp;= 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.y0 &nbsp; &nbsp; &nbsp;= 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.isFocus = false &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; display.getCurrentStage():setFocus( nil ) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S.Timer = timer.performWithDelay( 33, S.onRelease, 0 ) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S.Timer.MyStick = S --added so that angle reverted to 0 when stick is released S.angle = 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -- STOP FURTHER PROPAGATION OF TOUCH EVENT! &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true &nbsp; &nbsp; &nbsp; &nbsp; end &nbsp; &nbsp; &nbsp; &nbsp; --------------------------------------------- &nbsp; &nbsp; &nbsp; &nbsp; -- HANDLER: ON DRAG RELEASE &nbsp; &nbsp; &nbsp; &nbsp; --------------------------------------------- &nbsp; &nbsp; &nbsp; &nbsp; Group.onRelease = function( event ) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local S = event.source.MyStick &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local T = S.Thumb &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local dist = S.distance \> S.maxDist and S.maxDist or S.distance &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dist = dist \* S.snapBackSpeed &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.x = Cos( Rad(S.angle-90) ) \* dist&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.y = Sin( Rad(S.angle-90) ) \* dist&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local ex = T.x &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local ey = T.y &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ----------- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S.distance = Sqr (ex\*ex + ey\*ey) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if S.distance \> S.maxDist then S.distance = S.maxDist end &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S.angle &nbsp; &nbsp;= ( (Atan2( ex-0,ey-0 )\*180 / Pi) - 180 ) \* -1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S.percent &nbsp;= S.distance / S.maxDist &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ----------- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if S.distance \< .5 then &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S.distance = 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; S.percent &nbsp;= 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.x &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; T.y &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; timer.cancel(S.Timer); S.Timer = nil &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end &nbsp; &nbsp; &nbsp; &nbsp; end &nbsp; &nbsp; &nbsp; &nbsp; Group.Thumb:addEventListener( "touch", Group.onDrag ) &nbsp; &nbsp; &nbsp; &nbsp; return Group end js.NewStick = NewStick return js

The JS I use (again, not my code…) returns a distance and a radius where the JS is pressed to.  The radius returned seems a little backwards (0 is east, 90 is north, 180 west and 270 south)

Rob

It is in <Corona Labs Install Directory>/Sample Code/Hardware/InputDevices/main.lua