Quick Links: Download Gideros Studio | Gideros Documentation | Ultimate Guide | Gideros Development Center
Box2dEasy - no collision / isSensor question - Gideros Forum

Box2dEasy - no collision / isSensor question

NinjadoodleNinjadoodle Member
edited October 8 in General questions
Hi guys

I'm making some shards of a bottle breaking and I don't want them to collide, astray get created in the same spot. I'm using Box2dEasy, but can't figure out how to disable collision.

I've tried setting isSensor = true, but it doesn't seem to have an effect.

Any help would be awesome :)

Thanks in advance!
local shard1 = Prop.new(self.pack, "shard.png", target.sprite:getX(), target.sprite:getY() - 96, 0.5, 0.5, mg)
world:createRectangle(shard1, {type = "dynamic", isSensor = true})
shard1:setRotation(0)
shard1:set("linearVelocityX", 5 * math.cos(math.random(360)))
shard1:set("linearVelocityY", 5 * math.sin(math.random(360)))
 
local shard2 = Prop.new(self.pack, "shard.png", target.sprite:getX(), target.sprite:getY() - 96, 0.5, 0.5, mg)
world:createRectangle(shard2, {type = "dynamic", isSensor = true})
shard2:setRotation(90)
shard2:set("linearVelocityX", 5 * math.cos(math.random(360)))
shard2:set("linearVelocityY", 5 * math.sin(math.random(360)))

Comments

  • antixantix Member
    edited October 8 Accepted Answer
    Check out collision filtering. If you make these objects in a group that doesn't collide with any others that should get you the desired result. If you want to read more about this checkout the iForce tutorial... http://www.iforce2d.net/b2dtut/collision-filtering

    and here's a wee example I made over breakfast :)
     
    -- Simple box2d objects collision filter example
    -- objects in this example collide with only the walls, not other objects
     
    require ("box2d")
     
    application:setFps(60)
    application:setBackgroundColor(0x000000)
     
    local random, sin, cos = math.random, math.sin, math.cos
     
    local w = application:getContentWidth()
    local h = application:getContentHeight()
     
    -- our collision masks
    BALL_MASK = 1
    WALL_MASK = 2
     
    -- init box2d
    b2.setScale(10)
    local world = b2.World.new(0, 0, true)
     
    -- set box2d debug
    local debugDraw = b2.DebugDraw.new()
    world:setDebugDraw(debugDraw)
    stage:addChild(debugDraw)
     
    -- create walls
    local walls = world:createBody{type = b2.STATIC_BODY}
    local chain = b2.ChainShape.new()
    chain:createLoop(1, 1, w, 1, w, h, 1, h)
    walls.fixture = walls:createFixture{shape = chain, density = 1.0, friction = 0, restitution = 1}
    walls.fixture:setFilterData({categoryBits = WALL_MASK, maskBits = BALL_MASK, groupIndex = 0}) -- determines what collides with this object
     
    MAX_BALLS = 50
     
    local heading = 0
     
    -- create balls
    for i = 1, MAX_BALLS do
    local x, y = w * 0.5, h * 0.5
    local ball = world:createBody{type = b2.DYNAMIC_BODY} -- create the box2d thing
    local circle = b2.CircleShape.new(0, 0, 10)
    ball.fixture = ball:createFixture{shape = circle, density = 0.1, friction = 0, restitution = 0}
    ball.fixture.userData = TYPE_BALL
    ball.fixture:setFilterData({categoryBits = BALL_MASK, maskBits = WALL_MASK, groupIndex = 0}) -- determines what the ball collides with
    ball:setLinearDamping(0)
    ball:setAngularDamping(0)
    ball:setPosition(x, y)
     
    local location = {x = x + sin(heading), y = y + cos(heading)} -- set ball moving at random speed in random direction
    local mag = random() * 2 + 2.34 -- velocity
    local vx = (x - location.x) * mag
    local vy = (y - location.y) * mag
    print(xVect, yVect, x, y, location.x, location.y)
    ball:applyLinearImpulse(vx, vy, location.x, location.y) -- go ball go!
     
    heading = heading + (360 / MAX_BALLS)
    end
     
    -- run this every frame
    local function onEnterFrame(event)
    world:step(1/60, 8, 3) -- run box2d simulation
    end
     
    stage:addEventListener(Event.ENTER_FRAME, onEnterFrame)
    Check out my DevBlog, my GitHub, and my games Falling Animals | Breaky Wall | Exetor
  • antixantix Member
    edited October 8
    Then again, if you don't require any collision at all then maybe you could just use the new Particle system built into Gideros?
    Check out my DevBlog, my GitHub, and my games Falling Animals | Breaky Wall | Exetor
  • NinjadoodleNinjadoodle Member
    edited October 9
    Hi @antix

    Thanks for the reply, I pretty much got it going after a bit of hair pulling, but I'm having an issue.

    I can't seem to add a physics sprite into a group and have it effected by the physics world (probably doing something wrong here).

    Instead I have to add it to the scene e.g:self:addChild(sprite)

    What I really need to do is to add it to a group I've created called 'bg' - bg:addChild(sprite)

    Everything is working fine when I don't try and add it to the group.

    This probably has something to do with me not understanding how the physics world etc. works.

    Any ideas would be awesome!

    Thanks again!
  • Got it! It was an error I've made in the onEnterFrame function :)

    Thanks heaps for your help!

    Aye: antix

    +1 -1 (+1 / -0 ) Share on Facebook
  • YanYan Member
    Is better to use FilterCollisions, because sensors, are handled any way, but when you use filters, bodies are ignoring totally
  • Hi @Yan

    Thank for the tip, I'll keep that in mind!

    In this case I'm only using 4 small physics objects that get destroyed after half a second, so it should not cause any performance issues :)
Sign In or Register to comment.