object not rejoining correctly

I am posting another thread here because I feel I am not explaining myself correctly.

I have a group of enemies in a grid formation.

There are 4 types of enemy created with a for loop.

There are 4 other groups which mirror the above groups so I can reference their x,y positions. ( a ghost group)

Each group has its own collision detection.

The enemies are moved across the screen individually, not as a group as this messed up collisions.

There is a sensor Rect at the bottom of the screen.

Some of the enemies break off the grid formation and are transitioned to the bottom of the screen.

When they reach the sensor bar I cancel the transition and move the enemy to an x,y above the top of the screen.

I then transition the enemy to the fake x,y ( the enemies initial starting position).

The problem is they do not join back on at the correct x,y, they are sometimes 5px off or 20px off.

If I stop the grid moving they work correctly.

I know it is because Iam using physics but how do I solve the problem?

What is going on?

I have tried to solve this for 2 days on and off and spent many hours with it.

Can somebody offer their opinion please.

This is my enemy class as is:

why do the lua wrap tags not work correctly sometimes??? I hate having to post code like his

[lua]

function createEnemy(layer)

    local layer = layer or display.currentStage

    ----------------------------------------------------------------------------------
    – frontgroup
    -----------------------------------------------------------------------------------

    frontgroup = display.newGroup()

    local posXfront = { 60, 80, 100, 120, 140, 160, 180, 200, 220, 240 }
    local posYfront = { 80, 95, 110 }

    enemy = {}
    local b = 1

    for y = 1, 3 do
        for x = 1, 10 do
            enemy[b] = display.newRect(0, 0, 15, 10)
            physics.addBody(enemy[b], { isSensor = true, filter = filtersModule.enemyFilter })
            enemy[b].isVisible = true
            enemy[b].isBodyActive = true
            enemy[b].myName = “enemy”
            enemy[b]:addEventListener(“collision”, enemy)
            frontgroup:insert(enemy[b])
            enemy[b].x, enemy[b].y = posXfront[x], posYfront[y]
            b = b + 1
        end

    end

    function enemy:collision (event)
        local phase = event.phase
        if phase == “ended” then

            print(" blue collision enemy")
        end
    end

    timer.performWithDelay(1000, diveBomb, 1) -
  
    ---------------------------------------------------------------------------
    – Fake topgroup
    ---------------------------------------------------------------------------

    fakeEnemy = {}
    local r = 1

    for y = 1, 3 do
        for x = 1, 10 do
            fakeEnemy[r] = display.newRect(0, 0, 15, 10)       
            fakeEnemy[r].isVisible = false
            fakeEnemy[r].myName = “enemy”
            frontgroup:insert(fakeEnemy[r])
            fakeEnemy[r].x, fakeEnemy[r].y = posXfront[x], posYfront[y]
            r = r + 1
        end
    end

    ----------------------------------------------------------------------------
    – Midgroup
    ----------------------------------------------------------------------------

    local posXmid = { 80, 100, 120, 140, 160, 180, 200, 220 }
    local posYmid = { 65, 65, 65, 65, 65, 65, 65, 65 }

    enemyPurple = {}
    local c = 1

    for y = 1, 1 do
        for x = 1, 8 do
            enemyPurple[c] = display.newRect(0, 0, 15, 10)
            physics.addBody(enemyPurple[c], { isSensor = true, filter = filtersModule.enemyFilter })
            enemyPurple[c].isVisible = true
            enemyPurple[c].isBodyActive = true
            enemyPurple[c].myName = “enemy”
            enemyPurple[c]:addEventListener(“collision”, enemyPurple)
            frontgroup:insert(enemyPurple[c])
            enemyPurple[c].x, enemyPurple[c].y = posXmid[x], posYmid[y]
            c = c + 1
        end
    end

    function enemyPurple:collision (event)
        local phase = event.phase
        if phase == “ended” then
            print(" purple collision enemy")
        end
    end

    fakePurple = {}
    local s = 1

    for y = 1, 1 do
        for x = 1, 8 do
            fakePurple[s] = display.newRect(0, 0, 15, 10)
            fakePurple[s].isVisible = false
            fakePurple[s].myName = “enemy”
            frontgroup:insert(fakePurple[s])
            fakePurple[s].x, fakePurple[s].y = posXmid[x], posYmid[y]
            s = s + 1
        end
    end

    ----------------------------------------------------------------------------
    – backgroup
    ----------------------------------------------------------------------------

    local posXback = { 100, 120, 140, 160, 180, 200 }
    local posYback = { 50, 50, 50, 50, 50, 50 }

    enemyRed = {}
    local d = 1

    for y = 1, 1 do
        for x = 1, 6 do
            enemyRed[d] = display.newRect(0, 0, 15, 10)
            physics.addBody(enemyRed[d], { isSensor = true, filter = filtersModule.enemyFilter })
            enemyRed[d].isVisible = true
            enemyRed[d].isBodyActive = true
            enemyRed[d].myName = “enemy”
            enemyRed[d]:addEventListener(“collision”, enemyRed)
            frontgroup:insert(enemyRed[d])
            enemyRed[d].x, enemyRed[d].y = posXback[x], posYback[y]
            d = d + 1
        end
    end

    function enemyRed:collision (event)
        local phase = event.phase
        if phase == “ended” then
            print(" red collision enemy")
        end
    end

    fakeRed = {}
    local t = 1

    for y = 1, 1 do
        for x = 1, 6 do
            fakeRed[t] = display.newRect(0, 0, 15, 10)
            fakeRed[t].isVisible = false
            fakeRed[t].myName = “enemy”
            frontgroup:insert(fakeRed[t])
            fakeRed[t].x, fakeRed[t].y = posXback[x], posYback[y]
            t = t + 1
        end
    end

    ----------------------------------------------------------------------------
    – bossgroup
    ----------------------------------------------------------------------------

    local posXboss = { 120, 180 }
    local posYboss = { 35, 35 }

    enemyYellow = {}
    local j = 1

    for y = 1, 1 do
        for x = 1, 2 do
            enemyYellow[j] = display.newRect(0, 0, 15, 10)
            physics.addBody(enemyYellow[j], { isSensor = true, filter = filtersModule.enemyFilter })
            enemyYellow[j].isVisible = true
            enemyYellow[j].isBodyActive = true
            enemyYellow[j].myName = “enemy”
            enemyYellow[j]:addEventListener(“collision”, enemyYellow)
            frontgroup:insert(enemyYellow[j])
            enemyYellow[j].x, enemyYellow[j].y = posXboss[x], posYboss[y]
            j = j + 1
        end
    end

    function enemyYellow:collision (event)
        local phase = event.phase
        if phase == “ended” then
            print(" yellow collision enemy")
        end
    end

    fakeYellow = {}
    local u = 1

    for y = 1, 1 do
        for x = 1, 2 do
            fakeYellow[u] = display.newRect(0, 0, 15, 10)
            fakeYellow[u].isVisible = false
            fakeYellow[u].myName = “enemy”
            frontgroup:insert(fakeYellow[u])
            fakeYellow[u].x, fakeYellow[u].y = posXboss[x], posYboss[y]
            u = u + 1
        end
    end

  local movement = 0.5

    moveEnemy = function()

        frontgroup.X = (frontgroup.X or 0) + movement

        if frontgroup.X == 60 then
            movement = -0.5
        end
        if frontgroup.X == -35 then
            movement = 0.5
        end
        for i = 1, frontgroup.numChildren do
            frontgroup[i].x = frontgroup[i].x + movement
        end
    end
    Runtime:addEventListener(“enterFrame”, moveEnemy)
end

local movement = 0.5

diveBomb = function()

    local group = display.newGroup()

    enemytrans = transition.to(enemy[1], { time = 4000, x = 100, y = 500 })
    enemytrans3 = transition.to(enemyYellow[2], { time = 4000, x = 120, y = 500 })

end

enemyCancel = function()

        if enemytrans then transition.cancel(enemytrans) end
        enemytrans = nil

        if enemytrans3 then transition.cancel(enemytrans3) end
        enemytrans3 = nil

        enemy[1].isVisible = true
        enemyYellow[2].isVisible = true

        timer.performWithDelay(1, function()

            enemy[1].x = 50
            enemy[1].y = -10
            enemyYellow[2].x = 50
            enemyYellow[2].y = -10

        end)

        timer.performWithDelay(100, function()

            enemytrans = transition.to(enemy[1], { time = 1600, x = fakeEnemy[1].x, y = fakeEnemy[1].y, rotation = 360 })
            enemytrans3 = transition.to(enemyYellow[2], { time = 1600, x = fakeYellow[2].x, y = fakeYellow[2].y, rotation = 360 })
      
        end)

end

function destroyEnemy()
    print(“destroyenemy called”)

    Runtime:removeEventListener(“enterFrame”, moveEnemy)

    for k, v in pairs(enemy) do
        display.remove(enemy)
        enemy = nil
    end
    for k, v in pairs(enemyPurple) do
        display.remove(enemyPurple)
        enemyPurple = nil
    end
    for k, v in pairs(enemyRed) do
        display.remove(enemyRed)
        enemyRed = nil
    end
    for k, v in pairs(enemyYellow) do
        display.remove(enemyYellow)
        enemyYellow = nil
    end

    display.remove(frontgroup)
    frontgroup = nil

    print(enemy, “…enemy”)
    print(enemyPurple, “…purpleenemy”)
    print(enemyRed, “…enemyRed”)
    print(enemyYellow, “…enemyYellow”)
end


– 4. The Module

local public = {}

public.create = createEnemy
public.destroy = destroyEnemy

return public

[lua]