lua - 碰撞过滤器的行为不符合预期

标签 lua coronasdk

我正在研究这个联盟过滤器代码一个多星期了,但无法让它工作。 每次发生碰撞时,它都会打印所有 4 个碰撞过滤器,例如:

你好,我是 CollisionFilter1,
你好,我是 CollisionFilter2,
你好,我是 CollisionFilter3,
你好,我是墙,

我不明白如何让它工作,所以欢迎任何帮助。

代码:

badc1CollisionFilter = { categoryBits = 1, maskBits = 16 }
badc2CollisionFilter = { categoryBits = 2, maskBits = 16 }
badc3CollisionFilter = { categoryBits = 4, maskBits = 16 }
wallCollisionFilter = { categoryBits = 8, maskBits = 16 }
playerCollisionFilter = { categoryBits = 16, maskBits = 15 }

function getRandomStar()
    local temp = starTable[math.random(1, #starTable)]
    local randomStar = display.newImage(temp.imgpath)
    if ( temp.imgpath == "BCloud1.png" ) then
    physics.addBody( randomStar, { density=.1, bounce=0.1, friction=.2, radius=45, filter=badc1CollisionFilter } )
    temp.imgpath = "BCloud"..tostring(math.random(1, 3))..".png";
    end

    if ( temp.imgpath == "BCloud2.png" ) then
    physics.addBody( randomStar, { density=.1, bounce=0.1, friction=.2, radius=45, filter=badc2CollisionFilter } )
    temp.imgpath = "BCloud"..tostring(math.random(1, 3))..".png";
    end

    if ( temp.imgpath == "BCloud3.png" ) then
    physics.addBody( randomStar, { density=.1, bounce=0.1, friction=.2, radius=45, filter=badc3CollisionFilter } )
    temp.imgpath = "BCloud"..tostring(math.random(1, 3))..".png";
    end        
    randomStar.myName = "star" -- Set the name of the object to star
    randomStar.movementSpeed = temp.movementSpeed; -- Set how fast the object will move
    randomStar.x = math.random(-30, _W);    
    randomStar.y = -35;
    randomStar.rotation = math.random(0,20) -- Rotate the object

    starMove = transition.to(randomStar, {
        time=randomStar.movementSpeed, 
        y=500,
        onComplete = function(self) self.parent:remove(self); self = nil; 
        end
        }) -- Move the star
end

    ceiling = display.newImage("invisibleTile.png")
    ceiling:setReferencePoint(display.BottomLeftReferencePoint)
    ceiling.x = 0
    ceiling.y = 0
    physics.addBody(ceiling, "static", {density=.1, bounce=0.1, friction=.2, filter=wallCollisionFilter } ) 

    screenGroup:insert(ceiling)

    theFloor = display.newImage("invisibleTile.png")
    theFloor:setReferencePoint(display.BottomLeftReferencePoint)
    theFloor.x = 0
    theFloor.y = 510
    physics.addBody(theFloor, "static", {density=.1, bounce=0.1, friction=.2, filter=wallCollisionFilter } )        
    screenGroup:insert(theFloor)

    playerSpriteSheet = sprite.newSpriteSheet("player.png", 113, 55)
    playerSprites = sprite.newSpriteSet(playerSpriteSheet, 1, 4)
    sprite.add(playerSprites, "players", 1, 4, 1000, 0)
    player = sprite.newSprite(playerSprites)
    player.x = -80
    player.y = 350
    player:prepare("players")
    player:play()
    player.collided = false
    player:setReferencePoint(display.CenterReferencePoint);    
    physics.addBody(player, "static", {density=.1, bounce=0.1, friction=.2, radius=10, filter=playerCollisionFilter } )    
    player.gravityScale = 0
    screenGroup:insert(player)
    playerIntro = transition.to(player,{time=2000, x=150, onComplete=playerReady})

 local badc1collision = function( event )
 if event.phase == 'began' then
   print("Hello i am CollisionFilter1")
 end
end

 local badc2collision = function( event )
 if event.phase == 'began' then
   print("Hello i am CollisionFilter2")
 end
end

 local badc3collision = function( event )
 if event.phase == 'began' then
   print("Hello i am CollisionFilter3")
 end
end

 local wallcollision = function( event )
 if event.phase == 'began' then
   print("Hello i am the wall")
 end
end

    Runtime:addEventListener("collision", badc1collision)
    Runtime:addEventListener("collision", badc2collision)
    Runtime:addEventListener("collision", badc3collision)   
    Runtime:addEventListener("collision", wallcollision)    

更新代码后:

playerSpriteSheet = sprite.newSpriteSheet("player.png", 113, 55)
playerSprites = sprite.newSpriteSet(playerSpriteSheet, 1, 4)
sprite.add(playerSprites, "players", 1, 4, 1000, 0)
player = sprite.newSprite(playerSprites)
local newCollisionHandler
player:addEventListener( "collision", newCollisionHandler )
player.x = -80
player.y = 350
player:prepare("players")
player:play()
player.collided = false
player:setReferencePoint(display.CenterReferencePoint);
physics.addBody(player, "static", {density=.1, bounce=0.1, friction=.2, radius=10, filter=playerCollisionFilter } ) 
player.gravityScale = 0
screenGroup:insert(player)
playerIntro = transition.to(player,{time=2000, x=150, onComplete=playerReady})

我仍然收到此错误?

enter image description here

问候凯文


好的,根据你的评论,我已经这样做了:

badc1CollisionFilter = { categoryBits = 1, maskBits = 16 }
badc2CollisionFilter = { categoryBits = 2, maskBits = 16 }
badc3CollisionFilter = { categoryBits = 4, maskBits = 16 }
wallCollisionFilter = { categoryBits = 8, maskBits = 16 }
playerCollisionFilter = { categoryBits = 16, maskBits = 15 }

function getRandomStar()
    local temp = starTable[math.random(1, #starTable)] -- Get a random star from starTable
    local randomStar = display.newImage(temp.imgpath) -- Set image path for object

    if ( temp.imgpath == "BCloud1.png" ) then
    physics.addBody( randomStar, { density=.1, bounce=0.1, friction=.2, radius=45, filter=badc1CollisionFilter } )
    randomStar.myName = "star1"
    temp.imgpath = "BCloud"..tostring(math.random(1, 3))..".png";
    end

    if ( temp.imgpath == "BCloud2.png" ) then
    physics.addBody( randomStar, { density=.1, bounce=0.1, friction=.2, radius=45, filter=badc2CollisionFilter } )
    randomStar.myName = "star2"
    temp.imgpath = "BCloud"..tostring(math.random(1, 3))..".png";
    end

    if ( temp.imgpath == "BCloud3.png" ) then
    physics.addBody( randomStar, { density=.1, bounce=0.1, friction=.2, radius=45, filter=badc3CollisionFilter } )
    randomStar.myName = "star3"
    temp.imgpath = "BCloud"..tostring(math.random(1, 3))..".png";
    end

    randomStar.myName = "star" -- Set the name of the object to star
    randomStar.movementSpeed = temp.movementSpeed; -- Set how fast the object will move
    randomStar.x = math.random(-30, _W);    
    randomStar.y = -35;
    randomStar.rotation = math.random(0,20) -- Rotate the object

    starMove = transition.to(randomStar, {
        time=randomStar.movementSpeed, 
        y=500,
        onComplete = function(self) self.parent:remove(self); self = nil; 
        end
        }) -- Move the star
end--END getRandomStar()


    playerSpriteSheet = sprite.newSpriteSheet("player.png", 113, 55)
    playerSprites = sprite.newSpriteSet(playerSpriteSheet, 1, 4)
    sprite.add(playerSprites, "players", 1, 4, 1000, 0)
    player = sprite.newSprite(playerSprites)
    player.x = -80
    player.y = 350
    player:prepare("players")
    player:play()
    player.collided = false
    player:setReferencePoint(display.CenterReferencePoint);
    physics.addBody(player, "static", {density=.1, bounce=0.1, friction=.2, radius=10, filter=playerCollisionFilter } )      
    player.gravityScale = 0    
    screenGroup:insert(player)
    playerIntro = transition.to(player,{time=2000, x=150, onComplete=playerReady})


function newCollisionHandler( self, event )
   if event.other.myName == "star1" then
        print( "Collided with star1" )
   elseif event.other.myName == "star2" then
        print( "Collided with star2" )
   elseif event.other.myName == "star3" then
        print( "Collided with star3" )
   end
end


function scene:enterScene(event)
player.collision = newCollisionHandler
player:addEventListener( "collision", player)
end

终端打印:“哦,你好,我发生了碰撞”,但不是“与 star1/2/3 碰撞”?

-凯文

最佳答案

您可以尝试向玩家对象添加一个主要碰撞功能:

local newCollisionHandler    
player:addEventListener( "collision", newCollisionHandler )

function newCollisionHandler( self, event )
-- self object is player object
-- event.other object is the other object in collision

-- by giving id's or object type to all objects you can find collision type
   if event.other.myName == "star1" then
        print( "Collided with star1" )
   elseif event.other.myName == "star2" then
        print( "Collided with star2" )
   elseif event.other.myName == "star3" then
        print( "Collided with star3" )
   elseif event.other.myName == "star4" then
        print( "Collided with star4" )
   elseif event.other.myName == "star5" then
        print( "Collided with star5" )
   end
end

我刚刚编写了对象的 myName 值。你当然应该修改它。但我想解释的是,添加到物理中的所有对象都应该具有 myName 或 myType 属性。所以从这个属性中,你可以了解到,什么是与玩家对象碰撞的。

关于lua - 碰撞过滤器的行为不符合预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15464480/

相关文章:

Lua 从一个值中找到一个键

android - 如何使用 Corona SDK 工具在 Android 设备的 Facebook 墙上分享或发布游戏分数?

ios - 如何使用 corona sdk 检查我的应用程序是否安装在 IOS 设备中

ipad - Corona SDK中的分屏多人游戏

error-handling - 如何打印错误?

Lua 相当于 Python 的 Multiprocessing?

lua - 在 Lua 解释器中获取命令行参数

mobile - 将函数作为变量传递并将其分配给仍然能够在 Lua 中引用 "self"的对象

android - Android 上的 Corona SDK 音频调谐器?

c++ - 使用 Sol2 将 LUA 序列安全地传递给 C++