Hello guys, after some struggle I managed to parameterize the functions in my code but I get an error I can’t solve: attempt to perform arithmetic on a nil value (x2). Here’s the code (the error is at line 3 which is called by invert() function). Any suggestion?
--calcola la lunghezza di un segmento dati gli estremi local function segmentLenght( x1, y1, x2, y2 ) local xFactor = x2 - x1 local yFactor = y2 - y1 local dist = math.sqrt( (xFactor\*xFactor) + (yFactor\*yFactor) ) return dist end --calcola l'intervallo di tempo per percorrere un segmento con una certa velocità local function segmentTime(S, V) local timeInterval = S / V return timeInterval end --calcola l'angolo tra due oggetti local function angleBetween ( srcObj, dstObj ) local xDist = dstObj.x-srcObj.x ; local yDist = dstObj.y-srcObj.y local angleBetween = math.deg( math.atan( yDist/xDist ) ) if srcObj.x \< dstObj.x then angleBetween = angleBetween+90 else angleBetween = angleBetween-90 end return angleBetween end local iblue=0 local ired=0 local jblue=0 local jred=0 local deltablue = 1 local deltared = 1 local blueSegmentTransition local redSegmentTransition local blueInPitch = false local redInPitch = false local blueX = {} local blueY = {} local redX = {} local redY = {} local timeTable = {} local lenblueX local function invert(player, i, j, delta, SegmentTransition, playerX, playerY) transition.pause(player) if player.x \<= display.contentCenterX - halfpost or player.x \>= display.contentCenterX + halfpost then delta = delta \* (-1) if j==0 then j = 1 else j = 0 end segmentTransition = transition.to(player, { time = segmentTime( segmentLenght( player.x, player.y, playerX[i+delta+j], playerY[i+delta+j]), v), x = playerX[i+delta+j], y = playerY[i+delta+j], onComplete=function() onCompleteMove(player, i, j, delta, SegmentTransition, playerX, playerY); end }) else transition.resume(player) end end local function startMoving(player, i, j, delta, SegmentTransition, playerX, playerY) i = 1 if player.x \< display.contentCenterX then while playerX[i] \< player.x do i = i + 1 end delta = 1 j = 0 else i = playerX while playerX[i] \> player.x do i = i - 1 end delta = -1 j = 1 end segmentTransition = transition.to(player, { time = segmentTime( segmentLenght( player.x, player.y, playerX[i], playerY[i]), v), x = playerX[i], y = playerY[i], onComplete=function() onCompleteMove(player, i, j, delta, SegmentTransition, playerX, playerY); end }) end local function EllipseY(X) return display.contentCenterY - math.sqrt((1-(X^2)/(a^2))\*b^2) - longside end local leftX = display.contentCenterX - a - halfpost local leftPostX = display.contentCenterX - halfpost local rightPostX = display.contentCenterX + halfpost local rightX = display.contentCenterX + a + halfpost local highY = display.contentCenterY - longside - b local function blueHooking(player, i, j, delta, SegmentTransition, playerX, playerY, playerInPitch) if playerInPitch and player.y \<= display.contentCenterY then if player.x - leftX \<= 3 or rightX - player.x \<= 3 or player.y - highY \<= 2 then player.isAwake = false startMoving(player, i, j, delta, SegmentTransition, playerX, playerY) playerInPitch = false elseif player.x \< leftPostX and player.y - EllipseY(player.x-display.contentCenterX+halfpost) \<= 3 then player.isAwake = false startMoving(player, i, j, delta, SegmentTransition, playerX, playerY) playerInPitch = false elseif player.x \>rightPostX and player.y - EllipseY(player.x-display.contentCenterX-halfpost) \<= 3 then player.isAwake = false startMoving(player, i, j, delta, SegmentTransition, playerX, playerY) playerInPitch = false end end end Runtime:addEventListener( "enterFrame", function() blueHooking(player2, iblue, jblue, deltablue, blueSegmentTransition, blueX, blueY, blueInPitch); end)
button1:addEventListener( “tap”, function()
invert(player1, ired, jred, deltared, redSegmentTransition, redX, redY);
end)