Difference between revisions of "B2.World"

From GiderosMobile
Line 7: Line 7:
 
The `b2.World` class manages all physics entities and dynamic simulation. It is possible to create and manage more than one `b2.World` instance.<br />
 
The `b2.World` class manages all physics entities and dynamic simulation. It is possible to create and manage more than one `b2.World` instance.<br />
 
<br />
 
<br />
 +
=== Examples ===
 +
'''Creating Box2d body and moving Bitmap along the body'''<br/>
 +
<source lang="lua">require "box2d"
 +
local world = b2.World.new(0, 10, true)
 +
 +
--create ball bitmap object from ball graphic
 +
local ball = Bitmap.new(Texture.new("ball.png"))
 +
--reference center of the ball for positioning
 +
ball:setAnchorPoint(0.5,0.5)
 +
 +
ball:setPosition(100,100)
 +
 +
--get radius
 +
local radius = ball:getWidth()/2
 +
 +
--create box2d physical object
 +
local body = world:createBody{type = b2.DYNAMIC_BODY}
 +
local circle = b2.CircleShape.new(0, 0, radius)
 +
local fixture = body:createFixture{shape = circle, density = 1.0,
 +
friction = 0.1, restitution = 0.2}
 +
ball.body = body
 +
 +
--add to scene
 +
stage:addChild(ball)
 +
 +
stage:addEventListener(Event.ENTER_FRAME, function()
 +
-- edit the step values if required. These are good defaults!
 +
    world:step(1/60, 8, 3)
 +
ball:setPosition(ball.body:getPosition())
 +
ball:setRotation(math.rad(ball.body:getAngle()))
 +
end)</source>
 +
'''Detecting collisions between bodies'''<br/>
 +
<source lang="lua">--add collision event listener
 +
world:addEventListener(Event.BEGIN_CONTACT, function(e)
 +
    --getting contact bodies
 +
    local fixtureA = e.fixtureA
 +
    local fixtureB = e.fixtureB
 +
    local bodyA = fixtureA:getBody()
 +
    local bodyB = fixtureB:getBody()
 +
   
 +
    --do what you need with colliding bodies
 +
end)
 +
 +
--add collision event listener
 +
world:addEventListener(Event.END_CONTACT, function(e)
 +
    --getting contact bodies
 +
    local fixtureA = e.fixtureA
 +
    local fixtureB = e.fixtureB
 +
    local bodyA = fixtureA:getBody()
 +
    local bodyB = fixtureB:getBody()
 +
   
 +
    --do what you need with colliding bodies
 +
end)
 +
 +
--add collision event listener
 +
world:addEventListener(Event.PRE_SOLVE, function(e)
 +
    --getting contact bodies
 +
    local fixtureA = e.fixtureA
 +
    local fixtureB = e.fixtureB
 +
    local bodyA = fixtureA:getBody()
 +
    local bodyB = fixtureB:getBody()
 +
   
 +
    --do what you need with colliding bodies
 +
end)
 +
 +
--add collision event listener
 +
world:addEventListener(Event.POST_SOLVE, function(e)
 +
    --getting contact bodies
 +
    local fixtureA = e.fixtureA
 +
    local fixtureB = e.fixtureB
 +
    local bodyA = fixtureA:getBody()
 +
    local bodyB = fixtureB:getBody()
 +
   
 +
    --do what you need with colliding bodies
 +
 +
--additionally get collision force
 +
print(event.maxImpulse)
 +
end)</source>
 
{|-
 
{|-
 
| style="width: 50%;"|
 
| style="width: 50%;"|

Revision as of 10:45, 23 August 2018

Supported platforms: android, ios, mac, pc
Available since: Gideros 2011.6

Description

The `b2.World` class inherits from the following class: `EventDispatcher`.

The `b2.World` class manages all physics entities and dynamic simulation. It is possible to create and manage more than one `b2.World` instance.

Examples

Creating Box2d body and moving Bitmap along the body

require "box2d"
local world = b2.World.new(0, 10, true)

--create ball bitmap object from ball graphic
local ball = Bitmap.new(Texture.new("ball.png"))
--reference center of the ball for positioning
ball:setAnchorPoint(0.5,0.5)
 
ball:setPosition(100,100)
 
--get radius
local radius = ball:getWidth()/2
 
--create box2d physical object
local body = world:createBody{type = b2.DYNAMIC_BODY}
local circle = b2.CircleShape.new(0, 0, radius)
local fixture = body:createFixture{shape = circle, density = 1.0, 
friction = 0.1, restitution = 0.2}
ball.body = body
 
--add to scene
stage:addChild(ball)

stage:addEventListener(Event.ENTER_FRAME, function()
	-- edit the step values if required. These are good defaults!
    world:step(1/60, 8, 3)
	ball:setPosition(ball.body:getPosition())
	ball:setRotation(math.rad(ball.body:getAngle()))
end)

Detecting collisions between bodies

--add collision event listener
world:addEventListener(Event.BEGIN_CONTACT, function(e)
    --getting contact bodies
    local fixtureA = e.fixtureA
    local fixtureB = e.fixtureB
    local bodyA = fixtureA:getBody()
    local bodyB = fixtureB:getBody()
     
    --do what you need with colliding bodies
end)

--add collision event listener
world:addEventListener(Event.END_CONTACT, function(e)
    --getting contact bodies
    local fixtureA = e.fixtureA
    local fixtureB = e.fixtureB
    local bodyA = fixtureA:getBody()
    local bodyB = fixtureB:getBody()
     
    --do what you need with colliding bodies
end)

--add collision event listener
world:addEventListener(Event.PRE_SOLVE, function(e)
    --getting contact bodies
    local fixtureA = e.fixtureA
    local fixtureB = e.fixtureB
    local bodyA = fixtureA:getBody()
    local bodyB = fixtureB:getBody()
     
    --do what you need with colliding bodies
end)

--add collision event listener
world:addEventListener(Event.POST_SOLVE, function(e)
    --getting contact bodies
    local fixtureA = e.fixtureA
    local fixtureB = e.fixtureB
    local bodyA = fixtureA:getBody()
    local bodyB = fixtureB:getBody()
     
    --do what you need with colliding bodies
	
	--additionally get collision force
	print(event.maxImpulse)
end)

Methods

b2.World.new -
b2.World:clearForces - call this after you are done with time steps to clear the forces
b2.World:createBody - creates a rigid body given a definition
b2.World:createJoint - creates a joint given a definition
b2.World:createParticleSystem - create particle system
b2.World:destroyBody - destroys a rigid body
b2.World:destroyJoint - destroys a joint
b2.World:getGravity - returns the gravity vector
b2.World:queryAABB - query the world for all fixtures that potentially overlap the provided AABB
b2.World:rayCast - raycast the world for all fixtures in the path of the ray
b2.World:setDebugDraw - registers a b2.DebugDraw instance for debug drawing
b2.World:setGravity - sets the gravity vector
b2.World:step - takes a time step

Events

Event.BEGIN_CONTACT
Event.BEGIN_CONTACT_PARTICLE
Event.END_CONTACT
Event.POST_SOLVE
Event.PRE_SOLVE

Constants