有一个图像否定另一个图像的碰撞检测

时间:2013-11-23 10:54:06

标签: lua collision-detection corona physics

我有一个水图像,它会在碰撞时杀死用户精灵,从生命变量中取1并重新生成精灵到开始。我有另一张木筏图像,不断产生在屏幕上移动的新图像。我试图得到它,以便用户可以移动到木筏上,即水面图像,而不是重新产生回到开始。

--sets the function for the death sequence.
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

--sets water
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)

--Set log position and movement
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)

--user sprite details
frog = display.newSprite(frogSheet, sequenceData)
frog.x = display.contentWidth/2
frog.y = 504
physics.addBody( frog, "dynamic", physicsData:get("FrogSheetData"))
frog.isFixedRotation = true

用户精灵是一个三帧的动画,时间是300.任何帮助将不胜感激。如果需要,我会提供更多细节。

谢谢

1 个答案:

答案 0 :(得分:1)

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 } -- collides with (4 & 2) only
borderBodyElement = { friction=0.4, bounce=0.8, filter=borderCollisionFilter }

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

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

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

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


local red = {}
local blue = {}

local redCollisionFilter = { categoryBits = 2, maskBits = 3 } -- collides with (2 & 1) only
local blueCollisionFilter = { categoryBits = 4, maskBits = 5 } -- collides with (4 & 1) only

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