让一个图像消除另一个图像的碰撞检测。

我有一张水的图片,如果碰到了用户精灵就会导致用户精灵死亡,从生命变量中减去一点,并将精灵重新生成到起点。我有另一张筏子的图片,它会不断生成新的图片并在屏幕上移动。我试图让用户可以移动到浮在水上的筏子上,而不会被重新生成到起点。

--设定死亡过程的函数。
function waterCollide(event)
    frog.x = display.contentWidth/2
    frog.y = 504
    isOnRaft = 0

    lives = lives - 1
    showlives.text = "Lives: "..lives,230,-36,native.systemFont,25

    lose()
end

--设置水
water = display.newRect(0,0,320,150)
water.x = display.contentWidth*0.5
water.y = 144
water.alpha = 0
physics.addBody(water,"static", {isSensor = true})
water:addEventListener("collision", function ()timer.performWithDelay(50,waterCollide)end)

--设置浮木的位置和移动
local mRandom = math.random
local raft = {"Raft1" ,"Raft2"}
local objectTag = 0
local object = {}

function spawnlogleft()
    objectTag = objectTag + 1
    local objIdx = mRandom(#raft)
    local objName = raft[objIdx]
    object[objectTag]  = display.newImage(objName..".png")
    object[objectTag].x = -96
    object[objectTag].y = 216
    object[objectTag].name = objectTag
    transition.to(object[objectTag], {time = 10000, x = 416, onComplete = function(obj) obj:removeSelf(); obj = nil; end})
    physics.addBody( object[objectTag], "static",{isSensor = true})
end
spawnlogleft()
timer.performWithDelay(3500,spawnlogleft,0)

--用户精灵的细节
frog = display.newSprite(frogSheet, sequenceData)
frog.x = display.contentWidth/2
frog.y = 504
physics.addBody( frog, "dynamic", physicsData:get("FrogSheetData"))
frog.isFixedRotation = true

用户精灵是由三个帧组成的动画,时长为300。如果需要更多细节,我会提供更多信息。

谢谢

点赞
用户825481
用户825481

Corona 有一个非常棒的东西叫做 CollisionFilters。你可以在 /Physics/CollisionFilter 中了解如何使用它们。

基本上,你可以设置一些位来使某些对象与其他对象无法碰撞。看看下面的 main.lua 例子:

local physics = require("physics")
physics.start()

physics.setScale( 60 )

display.setStatusBar( display.HiddenStatusBar )

local bkg = display.newImage( "stripes.png" )

borderCollisionFilter = { categoryBits = 1, maskBits = 6 } -- 仅与 (4 & 2) 碰撞
borderBodyElement = { friction=0.4, bounce=0.8, filter=borderCollisionFilter }

local borderTop = display.newRect( 0, 0, 320, 1 )
borderTop:setFillColor( 0, 0, 0, 0)     -- 隐形
physics.addBody( borderTop, "static", borderBodyElement )

local borderBottom = display.newRect( 0, 479, 320, 1 )
borderBottom:setFillColor( 0, 0, 0, 0)      -- 隐形
physics.addBody( borderBottom, "static", borderBodyElement )

local borderLeft = display.newRect( 0, 1, 1, 480 )
borderLeft:setFillColor( 0, 0, 0, 0)        -- 隐形
physics.addBody( borderLeft, "static", borderBodyElement )

local borderRight = display.newRect( 319, 1, 1, 480 )
borderRight:setFillColor( 0, 0, 0, 0)       -- 隐形
physics.addBody( borderRight, "static", borderBodyElement )

local red = {}
local blue = {}

local redCollisionFilter = { categoryBits = 2, maskBits = 3 } -- 仅与 (2 & 1) 碰撞
local blueCollisionFilter = { categoryBits = 4, maskBits = 5 } -- 仅与 (4 & 1) 碰撞

local redBody = { density=0.2, friction=0, bounce=0.95, radius=43.0, filter=redCollisionFilter }
local blueBody = { density=0.2, friction=0, bounce=0.95, radius=43.0, filter=blueCollisionFilter }

for i = 1,4 do
    red[i] = display.newImage( "red_balloon.png", (80*i)-60, 50 + math.random(20) )
    physics.addBody( red[i], redBody )
    red[i].isFixedRotation = true

    blue[i] = display.newImage( "blue_balloon.png", (80*i)-60, 250 + math.random(20) )
    physics.addBody( blue[i], blueBody )
    blue[i].isFixedRotation = true
end
2013-12-05 06:16:10