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]