Collision Filters Still having some problems

Yes, that’s correct (to set the body type). If you’re not getting any response from the player+wall collision, then it’s something else. I suggest you check and re-check your collision filter values, working through the chart again, if necessary.

http://forums.coronalabs.com/topic/2128-collision-filters-helper-chart/

Brent

Hi Brent,

changing randomStar.myName = “BCloud1” to randomStar.name = “BCloud1” fixed the problem of not detecting 

Hi this is complacently driving me bonkers. but is it possible to to use preCollision ?

local platform = display.newImage( "platform.png" ) platform.collType = "passthru" physics.addBody( platform, "static", { bounce=0.0, friction=0.3 } ) function character:preCollision( event ) local collideObject = event.other if ( collideObject.collType == "passthru" ) then event.contact.isEnabled = false --disable this specific collision! end end

here is a bigger snip of my code :

local starTable = {} -- Set up star table 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 initStar()     local star1 = {}     star1.imgpath = "Cloud1.png"; --Set Image Path for Star     star1.movementSpeed = 10000; --Determines the movement speed of star     table.insert(starTable, star1); --Insert Star into starTable     local star2 = {}     star2.imgpath = "Cloud2.png";     star2.movementSpeed = 12000;     table.insert(starTable, star2);                          local star3 = {}     star3.imgpath = "Cloud3.png";     star3.movementSpeed = 14000;     table.insert(starTable, star3);     local star4 = {}     star4.imgpath = "BCloud"..tostring(math.random(1, 3))..".png";     star4.movementSpeed = 16000;     table.insert(starTable, star4);              local star5 = {}     star5.imgpath = "Cloud5.png";     star5.movementSpeed = 18000;     table.insert(starTable, star5);     end --END initStar()     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     local objectb1 =      physics.addBody( randomStar, { density=.1, bounce=0.1, friction=.2, radius=45, filter=badc1CollisionFilter } )     randomStar.myName = "BCloud1"          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 = "BCloud2"     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 = "BCloud3"     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() function newCollisionHandler( self, event )         print("oh hello i have a Collision")    if myName == "BCloud1" then         print("Collided with star1")    elseif event.other.myName == "BCloud2" then         print("Collided with star2")    elseif event.other.myName == "BCloud3" then         print("Collided with star3")    end end     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 scene:enterScene(event)    jet.collision = newCollisionHandler     jet:addEventListener( "collision", jet ) end

Hi Kevin,

You could use pre-collision, but I don’t think it’s necessary here, and I don’t suggest it because it’s a bit “greedy” and should generally be used with good cause. What you have here should be possible with normal collision filters, and I’m not sure what’s “not working” at this point. Could you possibly simplify this project down to one collision filter and two physics objects, so we can get the core in place before expanding it?

Regards,

Brent

Hi Brent,

so i made this small code to test the filters but I’m missing something here i think 

local physics = require "physics" physics.start() myObject1CollisionFilter = { categoryBits = 1, maskBits = 3 } myObject2CollisionFilter = { categoryBits = 2, maskBits = 3 } movebox = { friction=0.4, bounce=0.8, filter=myObject1CollisionFilter } box = { friction=0.4, bounce=0.8, filter=myObject2CollisionFilter } local myObject1 = display.newRect( 0, 0, 100, 100 ) myObject1:setFillColor( 255 ) myObject1.myName = "movebox" physics.addBody( myObject1, "static", movebox ) local myObject2 = display.newRect( 0, 0, 100, 100 ) myObject2:setFillColor( 100 ) myObject2.x = 250 myObject2.y = 250 myObject2.myName = "box" physics.addBody( myObject2, "static", box ) function newCollisionHandler( self, event )     print("oh hello i have a Collision")    if myName == "box" then     print("test 1")     end end function myObject1:touch( event )     if event.phase == "began" then         self.markX = self.x          self.markY = self.y           elseif event.phase == "moved" then              local x = (event.x - event.xStart) + self.markX         local y = (event.y - event.yStart) + self.markY                  self.x, self.y = x, y    -- move object based on calculations above     end     return true end myObject1:addEventListener( "touch", myObject1 ) myObject1.collision = newCollisionHandler myObject1:addEventListener( "collision", myObject1 )  

Kevin-

Hi Kevin,

I think this still goes back to where you say…

[lua]

if myName == “box” then

[/lua]

…because “myName” isn’t defined in that scope. You’ve set that as a property for both objects, so you need to specify the same in the collision handler. In this case, it will either be…

[lua]

self.myName

–OR–

event.other.myName

[/lua]

…depending on which object you want to detect is equal to “box”.

Brent

oky so if i understand this is correct ?

function newCollisionHandler( self, event )    print("oh hello i have a Collision")    if randomStar.myName == "BCloud1" then         print("Collided with star1")    elseif event.other.randomStar.myName == "BCloud2" then         print("Collided with star2")    elseif event.other.randomStar.myName == "BCloud3" then         print("Collided with star3")    end end  

Not exactly… in a “local-style” collision, one object is represented by “self” and the other by “event.other”. Those are the direct references to the two objects involved in the collision, so you should deal with them at that level.

oky so  i’m trying this in a other way now :

local function onCollision(event)     if event.phase == "began" and gameIsActive == true then         local obj1 = event.object1;          local obj2 = event.object2;          if obj1.name == "player" and obj2.name == "BCloud1" then             print("hello 1")          elseif obj1.name == "player" and obj2.name == "BCloud2" then             print("hello 2")                       elseif obj1.name == "player" and obj2.name == "BCloud3" then             print("hello 3")                       elseif obj1.name == "player" and obj2.name == "wall" then             print("hello im a wall")                  end     end end

Is this correct?

kevin-

Hi Kevin,

This looks correct at first glance, but you’ll need to test it. Of course, I assume you’ve applied the “name” property to everything involved in collisions. :slight_smile:

Brent

Hi Brent,

i am using  randomStar.myName = “BCloud1”  the privies errors are gone, but still it is not printing the  print(“hello im a wall”)

​in the terminal, i will have a play about whit it but its getting there :smiley: ps dos corona handel the publication to the app/play store as well or only export the native app?

Kevin-

Hi Kevin,

Remember to check that the either the player or the wall is a “dynamic” physics body type. At least one body in a collision needs to be dynamic… you can’t get collisions from a “static” + “kinematic” event, for example.

And FYI, Corona doesn’t handle the app submission (to market). It just builds the compiled file which you’ll need to submit to Apple, Google, etc. separately. 

Take care,

Brent

physics.addBody(player, “dynamic”, {density=.1, bounce=0.1, friction=.2, radius=10,} ) 

right ?

Yes, that’s correct (to set the body type). If you’re not getting any response from the player+wall collision, then it’s something else. I suggest you check and re-check your collision filter values, working through the chart again, if necessary.

http://forums.coronalabs.com/topic/2128-collision-filters-helper-chart/

Brent

Hi Brent,

changing randomStar.myName = “BCloud1” to randomStar.name = “BCloud1” fixed the problem of not detecting