2013-05-04 3 views
0

Ci-dessous est mon fichier principal. Essentiellement, ce qui se passe, c'est que la collision fonctionne lorsque l'objet «rect» est et non en mouvement mais dès que je déplace l'objet rect, la collision cesse de prendre effet. Je pense qu'il sait qu'il entre en collision mais il ne fait rien (comme l'interaction avec les objets du tout). Est-ce que quelqu'un a des pensées, pourquoi cela se passe-t-il? et comment le réparer?Corona SDK Physics s'allume et s'éteint pendant que l'objet est en mouvement

local physics = require("physics") ; physics.start() ; physics.setGravity(0,0) ; 
physics.setDrawMode("debug") 
display.setStatusBar(display.HiddenStatusBar) 
math.randomseed(os.time()) 

physics.setVelocityIterations(10); 
physics.setPositionIterations(20); 


--set up some references and other variables 
local ox, oy = math.abs(display.screenOriginX), math.abs(display.screenOriginY) 
local cw, ch = display.contentWidth, display.contentHeight 

--set up collision filters 
local screenFilter = { categoryBits=2, maskBits=1 } 
local objFilter = { categoryBits=1, maskBits=14 } 
local fieldFilter = { categoryBits=4, maskBits=1 } 
local magnetFilter = { categoryBits=8, maskBits=1 } 

--set initial magnet pull 
local magnetPull = 0.25 

--set up world and background 
local screenBounds = display.newRect(-ox, -oy, display.contentWidth+ox+ox, display.contentHeight+oy+oy) 
screenBounds.name = "screenBounds" 
screenBounds.isVisible = false ; physics.addBody(screenBounds, "static", { isSensor=true,  filter=screenFilter }) 


local function newPositionVelocity(object) 
    local math_random = math.random  
    local side = math_random(1,4) ; local posX ; local posY ; local velX ; local velY 

if (side == 1 or side == 3) then 
    posX = math_random(0,display.pixelHeight) 
    velX = math_random(-10,10) * 5 
    if (side == 1) then posY = -oy-40 ; velY = math_random(8,18) * 16 
    else posY = display.contentHeight+oy+40 ; velY = math_random(8,16) * -16 
    end 
else 
    posY = math_random(0,display.pixelWidth) 
    velY = math_random(-10,10) * 5 
    if (side == 4) then posX = -ox-40 ; velX = math_random(8,16) * 16 
    else posX = display.contentWidth+ox+40 ; velX = math_random(8,16) * -16 
    end 
end 
object.x = posX ; object.y = posY 
object:setLinearVelocity(velX, velY) 
object.angularVelocity = math_random(-3,3) * 40 
object.alpha = 1 

end 

local rect = display.newRect(100,100,100,60); 
local offset = 250 
rect.x = cw/2; 
rect.y = ch/2-offset; 
--rect.xReference = 40; 
rect.yReference = offset; 



local function objectCollide(self, event) 
local otherName = event.other.name 
print(event.other.name); 

local function onDelay(event) 
    local action = "" 
    if (event.source) then action = event.source.action ; timer.cancel(event.source) end 

    if (action == "makeJoint") then 
     self.hasJoint = true 
     self.touchJoint = physics.newJoint("touch", self, self.x, self.y) 
     self.touchJoint.frequency = magnetPull 
     self.touchJoint.dampingRatio = 0.0 
     self.touchJoint:setTarget(512, 384) 
    elseif (action == "leftField") then 
     self.hasJoint = false ; self.touchJoint:removeSelf() ; self.touchJoint = nil 
    else 
     if (self.hasJoint == true) then self.hasJoint = false ; self.touchJoint:removeSelf() ; self.touchJoint = nil end 
     newPositionVelocity(self) 
    end 
end 

if (event.phase == "ended" and otherName == "screenBounds") then 
    local tr = timer.performWithDelay(10, onDelay) ; tr.action = "leftScreen" 
elseif (event.phase == "began" and otherName == "magnet") then 
    transition.to(self, { time=400, alpha=0, onComplete=onDelay }) 
elseif (event.phase == "began" and otherName == "field" and self.hasJoint == false) then 
    local tr = timer.performWithDelay(10, onDelay) ; tr.action = "makeJoint" 
elseif (event.phase == "ended" and otherName == "field" and self.hasJoint == true) then 
    local tr = timer.performWithDelay(10, onDelay) ; tr.action = "leftField" 
end 


end 



local function setupWorld() 

for i=1, 20 do 
    local obj = display.newCircle(0,0, 12) 
    physics.addBody(obj, "dynamic", { bounce=.3, radius=12, density = .2 --[[,filter=objFilter]] }) 
    obj. isBullet = true; 
      newPositionVelocity(obj) 
    obj.hasJoint = false 
    obj.collision = objectCollide ; obj:addEventListener("collision", obj) 
end 

local field = display.newCircle(cw/2, ch/2, 320); 
    field.alpha = 0.2; 
field.name = "field"; 
field.x = display.contentCenterX ; field.y = display.contentCenterY; 
physics.addBody(field, "static", { isSensor=true, radius=320, filter=fieldFilter }); 

magnet = display.newCircle(cw/2, ch/2, 40) 
magnet.name = "magnet" 
magnet.x = display.contentCenterX ; magnet.y = display.contentCenterY 
physics.addBody(magnet, "static", { bounce=0, radius=40, filter=magnetFilter }) 

    end 

setupWorld() 
physics.addBody(rect,"kinematic", { bounce = 1, density = 1}) 


deg = 0.0; 
prevY = 0; 
local function onTouch(event) 
if event.phase == "began" then 
    prevY = event.y 
end 
if (deg<=360) then 
    deg=0; 
end 

if(event.y >= prevY) then 
    deg = deg + 10; 
elseif(event.y <= prevY) then 
    deg = deg -10; 
end 
prevY = event.y 

rect:rotate(deg); 

end 


Runtime:addEventListener("touch", onTouch); 

Répondre

0

Les corps cinématiques ne génèrent pas de collisions. Il doit être dynamique.