我如何有一个物理身体否定的另一种碰撞。(how do i have one physics body

2019-10-18 21:54发布

我有重叠称为A和B.我有称为C的第三图像,所述用户能够在屏幕上移动在屏幕上的两个图像。 两个复位的大(A)的C到上碰撞产生点。 我需要知道如何让这个C能走过去图像B,而不是被重置为重生点。 如在图像B重叠图像A和否定冲突功能。

这里是代码:

--Hides status bar from top of page
display.setStatusBar( display.HiddenStatusBar )

--Set a test background image 
local backgroundimg = display.newImageRect("testbackground.png", 320,576)
backgroundimg.x = display.contentWidth*0.5
backgroundimg.y = display.contentHeight*0.5

--Set the position and amount of score and lives

local score = 0
local lives = 5

local showscore = display.newText("Score: "..score,0,-36,native.systemFont,25)
showscore:setTextColor(0, 0, 0)

local showlives = display.newText("Lives: "..lives,230,-36,native.systemFont,25)
showlives:setTextColor(0, 0, 0)

--Set physics for collisions, etc.
physics = require("physics")
physics.start()
physics.setGravity(0,0)

--set water
local water = display.newImageRect("water.png",320,192)
water.x = display.contentWidth*0.5
water.y = 144
physics.addBody(water,"static")
water:addEventListener("collision", function()timer.performWithDelay(50,waterCollide)end)

function waterCollide(event)
    lives = lives - 1
    display.remove(frog)
    frog = display.newImageRect("FrogTest.png",32,48)
    frog.x = display.contentWidth*0.5
    frog.y = 504
    physics.addBody(frog, "dynamic")
    frog.isFixedRotation = true
end

--Sets buttons images and positions
local forward = display.newImageRect("Forward Button.png",106,100)
forward.x = 160
forward.y = 478

local left = display.newImageRect("Left Button.png",106,100)
left.x = 53
left.y = 478

local right = display.newImageRect("Right Button.png",106,100)
right.x = 267
right.y = 478

--Set log position and movement
local log1 = display.newImageRect("log1.png", 96, 48)
log1.x = 32
log1.y = 226
physics.addBody(log1,"kinematic")
transition.to(log1, {time = 3500, x = 288})


--Set a frog sprite on the screen
frog = display.newImageRect("FrogTest.png",32,48)
frog.x = display.contentWidth*0.5
frog.y = 504
physics.addBody(frog, "dynamic",{density = 1.0, friction = 1, bounce = -1})
frog.isFixedRotation = true

--Sets motion variables
local motionX = 0
local motionY = 0
local speed = 4

--Moving forward
function forward:touch()
    motionX = 0
    motionY = -speed
end
forward:addEventListener("touch",forward)

--Moving Right
function right:touch()
    motionX = speed
    motionY = 0
end
right:addEventListener("touch",right)

--Moving left
function left:touch()
    motionX = -speed
    motionY = 0
end
left:addEventListener("touch",left)

--Moves Frog each time frame is called
function movefrog (event)
    frog.x = frog.x + motionX
    frog.y = frog.y + motionY
end
Runtime:addEventListener("enterFrame", movefrog)

--Stops frog from moving continuously 
local function stop (event)
    if event.phase == "ended" then
        motionX = 0
        motionY = 0
    end
end
Runtime:addEventListener("touch", stop)

--Making sure the frog does not go off the screen
local function stopfrog (event)
    if frog.x <= 16 then
        frog.x = 16
    end
    if frog.x >= 304 then
        frog.x = 304
    end
end
Runtime:addEventListener("enterFrame", stopfrog)

Answer 1:

您需要设置一个条件waterCollide为了否定重生功能。

根据你多么复杂需要它,你可以简单地检查是否frog的位置是内log1的边界, 或者你可以有log1任何未来的日志有它设置碰撞标志 ,以自己的碰撞事件不会触发重生然后当任何日志碰撞结束清除该标志。

下面是一个例子:

local onLog = 0

function frogDie()
    lives = lives - 1
    display.remove(frog)
    frog = display.newImageRect("FrogTest.png",32,48)
    frog.x = display.contentWidth*0.5
    frog.y = 504
    physics.addBody(frog, "dynamic")
    frog.isFixedRotation = true
end

function waterCollide(event)
    if onLog < 1 then frogDie() end
end

function logCollide(event)
    if event.phase == 'began' then
        onLog = onLog + 1
    else
        onLog = onLog - 1
    end
end

log1:addEventListener("collision", logCollide)
--log2:addEventListener("collision", logCollide)

用一个数字来跟踪青蛙是否是对数应该比一个布尔更安全,因为日志最终可能会重叠和清除之前多次碰撞通过它可以正确复位标志。



文章来源: how do i have one physics body negate the collision of another.