The heart of all Nape simulations.

Constructor

@:value({ broadphase : null, gravity : null })new(?gravity:Vec2, ?broadphase:Broadphase)

Construct a new Space object.

Parameters:

gravity

The gravity of this space. (default (0,0))

broadphase

The broadphase type to use. (default DYNAMIC_AABB_TREE)

Returns:

The constructed Space object.

Throws:

#

If gravity is non-null, and has been disposed of.

Variables

read onlyarbiters:ArbiterList

List of all active arbiters in Space.

This list is immutable.

read onlybodies:BodyList

List of all Bodys directly placed in space.

This list is mutable, and adding an element to this list is one way of adding a Body to this Space equivalent to: body.space = space

This list is only those bodies directly placed in the space, any body that is a child of a Compound will not be in this list.

read onlybroadphase:Broadphase

Broadphase type in use.

read onlycompounds:CompoundList

List of all Compounds directly placed in space.

This list is mutable, and adding an element to this list is one way of adding a Compound to this Space equivalent to: compound.space = space

This list is only those compounds directly placed in the space, any compound that is a child of another compound will not be in this list.

read onlyconstraints:ConstraintList

List of all Constraints directly placed in space.

This list is mutable, and adding an element to this list is one way of adding a Constraint to this Space equivalent to: constraint.space = space

This list is only those bodies directly placed in the space, any constraint that is a child of a Compound will not be in this list.

read onlyelapsedTime:Float

The elapsed simulation time.

This is the total amount of 'time' that has elapsed in the Space simulation.

gravity:Vec2

Space gravity.

Units are of pixels/second/second

read onlylisteners:ListenerList

List of all Listeners in space.

This list is mutable, and adding an element to this list is one way of adding a Listener to this Space equivalent to: listener.space = space

read onlyliveBodies:BodyList

List of all active dynamic Bodies in space.

This list contains all dynamic bodies that are awake regardless of their containment in a Compound.

This list is immutable.

read onlyliveConstraints:ConstraintList

List of all active Constraints in space.

This list contains all constraints regardless of their containment in a Compound.

This list is immutable.

sortContacts:Bool

Flag controlling sorting of contact points.

If true, then collisions will be resolved in an order defined by their penetration depths. This can be shown to improve stability of the physics as well as making simulations more consistent regardless of which broadphase is used.

Having sorting enabled obviously incurs a cost, and you may consider disabling it if you are having issues with performance (Though things such as number of physics iterations will have much greater bearing on performance than this, especcialy since enabling this may permit you to use less iterations).

read onlytimeStamp:Int

The time stamp of this Space object.

This is equal to the number of times that space.step(..) has been invoked.

read onlyuserData:Dynamic<Dynamic>

Dynamic object for user to store additional data.

This object cannot be set, only its dynamically created properties may be set. In AS3 the type of this property is &#42

This object will be lazily constructed so that until accessed for the first time, will be null internally.

read onlyworld:Body

Static, immutable Body for constraint purposes.

This is a completely static, uncollidable, uninteractable Body with no Shapes, that cannot be modified in any way.

Its purpose is to provide a means for attaching Constraints from one Body to the Space itself, for instance pinning a body against a static point in space.

worldAngularDrag:Float

Angular drag applied to all bodies in Space.

This represents the fraction of a body's angular velocity which will be removed per second. This value has no unit attached.

worldLinearDrag:Float

Linear drag applied to all bodies in Space.

This represents the fraction of a body's linear velocity which will be removed per second. This value has no unit attached.

@:value(null)zpp_inner:ZPP_Space = null

@private

Methods

@:value({ output : null, filter : null, strict : true, containment : false })bodiesInAABB(aabb:AABB, containment:Bool = false, strict:Bool = true, ?filter:InteractionFilter, ?output:BodyList):BodyList

Evaluate all Bodies given an AABB.

If the filter argument is non-null, then only bodies with a shape classified as being part of the AABB, whose filter agrees to collide will be considered.

Parameters:

aabb

The bounding box to query bodies by,

containment

If true, then only Bodies entirely contained (Rather than simply intersecting) will be considered. (default false)

strict

If false, then the body's shape's bounding box will be used to classify the shapes of the body, instead of the Shape itself. (default true)

filter

Optional filter to pick and choose shapes, based on whether the filters agree to collide. (default null)

output

Optional list to append results to instead of creating a new list (default null).

Returns:

A list of all the shapes for given AABB.

Throws:

#

If AABB is null, or is degenerate.

@:value({ output : null, filter : null })bodiesInBody(body:Body, ?filter:InteractionFilter, ?output:BodyList):Null<BodyList>

Evaluate all Bodies given a Body.

If the filter argument is non-null, then only bodies with a shape classified as being part of the input body, whose filter agrees to collide will be considered. The input body is considered a purely geometric

Parameters:

body

The body to use in classifying other bodies.

filter

Optional filter to pick and choose shapes, based on whether the filters agree to collide. (default null)

output

Optional list to append results to instead of creating a new list (default null).

Returns:

A list of all the bodies for given body.

Throws:

#

If body is null.

#

If body has a shape that is a polygon, and that polygon is not 'valid'

@:value({ output : null, filter : null, containment : false })bodiesInCircle(position:Vec2, radius:Float, containment:Bool = false, ?filter:InteractionFilter, ?output:BodyList):BodyList

Evaluate all Bodies given a circle.

If the filter argument is non-null, then only bodies with a shape classified as being part of the circle, whose filter agrees to collide will be considered.

Parameters:

position

The position of the centre of the circle.

radius

The radius of the circle.

containment

If true, then only Bodies entirely contained (Rather than simply intersecting) will be considered. If a filter is supplied, only shapes that agree to collide will be used in this containment check. (default false)

filter

Optional filter to pick and choose shapes, based on whether the filters agree to collide. (default null)

output

Optional list to append results to instead of creating a new list (default null).

Returns:

A list of all the shapes for given circle.

Throws:

#

If positions is null or disposed of.

#

If radius is not strictly positive.

@:value({ output : null, filter : null, containment : false })bodiesInShape(shape:Shape, containment:Bool = false, ?filter:InteractionFilter, ?output:BodyList):BodyList

Evaluate all Bodies given a shape.

If the filter argument is non-null, then only bodies with a shape classified as being part of the input shape, whose filter agrees to collide will be considered. The input shape is considered a purely geometric

The input shape must be part of a Body so as to be well defined.

Parameters:

shape

The shape to use in classifying other shapes.

containment

If true, then only Bodies entirely contained (Rather than simply intersecting) will be considered. (default false)

filter

Optional filter to pick and choose shapes, based on whether the filters agree to collide. (default null)

output

Optional list to append results to instead of creating a new list (default null).

Returns:

A list of all the bodies for given shape.

Throws:

#

If shape is null or not part of a body.

#

If shape is a polygon, and that polygon is not 'valid'

@:value({ output : null, filter : null })bodiesUnderPoint(point:Vec2, ?filter:InteractionFilter, ?output:BodyList):BodyList

Evaluate all Bodies under a given Point.

If the filter argument is non-null, then only bodies with a shape containing the given point whose filter agrees to 'collide' will be considered.

Parameters:

point

The point to evaluate bodies.

filter

Optional filter to pick and choose shapes, based on whether the filters agree to collide. (default null)

output

Optional list to append results to instead of creating a new list (default null).

Returns:

A list of all the Bodies containing the given point.

Throws:

#

If point is null or disposed of.

clear():Void

Clear the Space of all objects.

Things such as the elapsed simulation time, and time step will too be reset to 0.

Parameters such as gravity, and worldLinearDrag will be untouched by this operation.

@:value({ filter : null, liveSweep : false })convexCast(shape:Shape, deltaTime:Float, liveSweep:Bool = false, ?filter:InteractionFilter):Null<ConvexResult>

Perform a convex cast for soonest collision.

This method will return only the soonest collision result (if any), to find more than this, use the convexMultiCast method. The shape will not be swept further than the time delta provided. Shapes already intersecting the sweep shape at t = 0 are ignored.

If the filter argument is null, then all shapes will be collidable otherwise only those for whose filter agrees to 'collide'.

Parameters:

shape

The Shape to be cast through space. This shape must belong to a body whose velocity is used to define the sweep.

deltaTime

The amount of time to sweep the shape forward.

liveSweep

If true, then moving objects in the space will have their motion considered during the sweep. Otherwise; like with normal rayCast, objects in the space are considered un-moving for the cast. (default false)

filter

Optional filter to pick and choose shapes, based on whether the filters agree to collide. (default null)

Returns:

The soonest result (if any) of convex intersection.

Throws:

#

If shape is null, or not part of a body.

#

If deltaTime is negative.

@:value({ filter : null, liveSweep : false })convexMultiCast(shape:Shape, deltaTime:Float, liveSweep:Bool = false, ?filter:InteractionFilter, output:ConvexResultList):ConvexResultList

Perform a convex cast for all collisions in time order.

This method will return all collisions, or an empty list if there are none. The shape will not be swept further than the time delta provided. Shapes already intersecting the sweep shape at t = 0 are ignored.

If the filter argument is null, then all shapes will be collidable otherwise only those for whose filter agrees to 'collide'.

Parameters:

shape

The Shape to be cast through space. This shape must belong to a body whose velocity is used to define the sweep.

deltaTime

The amount of time to sweep the shape forward.

liveSweep

If true, then moving objects in the space will have their motion considered during the sweep. Otherwise; like with normal rayCast, objects in the space are considered un-moving for the cast. (default false)

filter

Optional filter to pick and choose shapes, based on whether the filters agree to collide. (default null)

output

A list to append results to instead of allocating a new one (default null)

Returns:

The collision results in time order.

Throws:

#

If shape is null, or not part of a body.

#

If deltaTime is negative.

interactionType(shape1:Shape, shape2:Shape):Null<InteractionType>

Determine the interaction type that would occur between a pair of Shapes.

This function takes into account everything possible, and ignoring the callback system will tell you precisely the type of interaction (if any at all) which will occur between these Shapes.

This function can only work if the Shapes belong to a Body.

This function can only make use of any constraints 'ignore' property to determine if 'null' should be returned if the constraints being used are inside of a Space.

Parameters:

shape1

The first Shape to test.

shape2

The second Shape to test.

Returns:

The interaction type that will occur between these shapes, or null if no interaction will occur.

Throws:

#

If either shape is null, or is not contained within a body.

@:value({ filter : null, inner : false })rayCast(ray:Ray, inner:Bool = false, ?filter:InteractionFilter):Null<RayResult>

Perform a ray cast for closest result.

This method will return only the closest result (if any), to find more the first result, use the rayMultiCast method. The ray will not be cast beyond its maxDistance.

If the filter argument is null, then all shapes will be intersectable otherwise only those for whose filter agrees to 'collide'.

Parameters:

ray

The ray to cast through space.

inner

If true then inner surfaces of shapes will also be intersected. otherwise only the outer surfaces. (default false)

filter

Optional filter to pick and choose shapes, based on whether the filters agree to collide. (default null)

Returns:

The closest result (if any) of ray intersection.

Throws:

#

If ray is null.

@:value({ output : null, filter : null, inner : false })rayMultiCast(ray:Ray, inner:Bool = false, ?filter:InteractionFilter, ?output:RayResultList):RayResultList

Perform a ray cast for all valid results.

This method will return all intersections (in distance order) of ray with shapes in the space up to the ray's maxDistance.

If the filter argument is null, then all shapes will be intersectable otherwise only those for whose filter agrees to 'collide'.

Parameters:

ray

The ray to cast through space.

inner

If true then inner surfaces of shapes will also be intersected. otherwise only the outer surfaces. (default false)

filter

Optional filter to pick and choose shapes, based on whether the filters agree to collide. (default null)

output

A list to append results to instead of allocating a new one (default null)

Returns:

All valid results of ray cast in distance order from closest to furthest.

Throws:

#

If ray is null.

@:value({ output : null, filter : null, strict : true, containment : false })shapesInAABB(aabb:AABB, containment:Bool = false, strict:Bool = true, ?filter:InteractionFilter, ?output:ShapeList):ShapeList

Evaluate all Shapes given an AABB.

If the filter argument is non-null, then only shapes who's filter agrees to 'collide' will be considered.

Parameters:

aabb

The bounding box to query shapes by,

containment

If true, then only Shapes entirely contained (Rather than simply intersected) will be considered. (default false)

strict

If false, then the Shape's bounding box will be used to classify the Shape, instead of the Shape itself. (default true)

filter

Optional filter to pick and choose shapes, based on whether the filters agree to collide. (default null)

output

Optional list to append results to instead of creating a new list (default null).

Returns:

A list of all the shapes for given AABB.

Throws:

#

If AABB is null, or is degenerate.

@:value({ output : null, filter : null })shapesInBody(body:Body, ?filter:InteractionFilter, ?output:ShapeList):Null<ShapeList>

Evaluate all Shapes given a Body.

If the filter argument is non-null, then only shapes who's filter agrees to 'collide' will be considered. The input body's shape's own filters are never used in this method. The input body is considered a purely geometric object.

Parameters:

body

The body to use in classifying other shapes.

filter

Optional filter to pick and choose shapes, based on whether the filters agree to collide. (default null)

output

Optional list to append results to instead of creating a new list (default null).

Returns:

A list of all the shapes for given body.

Throws:

#

If body is null.

#

If body has a shape that is a polygon, and that polygon is not 'valid'

@:value({ output : null, filter : null, containment : false })shapesInCircle(position:Vec2, radius:Float, containment:Bool = false, ?filter:InteractionFilter, ?output:ShapeList):ShapeList

Evaluate all Shapes given a circle.

If the filter argument is non-null, then only shapes who's filter agrees to 'collide' will be considered.

Parameters:

position

The position of the centre of the circle.

radius

The radius of the circle.

containment

If true, then only Shapes entirely contained (Rather than simply intersected) will be considered. (default false)

filter

Optional filter to pick and choose shapes, based on whether the filters agree to collide. (default null)

output

Optional list to append results to instead of creating a new list (default null).

Returns:

A list of all the shapes for given circle.

Throws:

#

If positions is null or disposed of.

#

If radius is not strictly positive.

@:value({ output : null, filter : null, containment : false })shapesInShape(shape:Shape, containment:Bool = false, ?filter:InteractionFilter, ?output:ShapeList):ShapeList

Evaluate all Shapes given another shape.

If the filter argument is non-null, then only shapes who's filter agrees to 'collide' will be considered. The input shape's own filter is never used in this method. The input shape is considered a purely geometric object.

The input shape must be part of a Body so as to be well defined.

Parameters:

shape

The shape to use in classifying other shapes.

containment

If true, then only Shapes entirely contained (Rather than simply intersected) will be considered. (default false)

filter

Optional filter to pick and choose shapes, based on whether the filters agree to collide. (default null)

output

Optional list to append results to instead of creating a new list (default null).

Returns:

A list of all the shapes for given shape.

Throws:

#

If shape is null or not part of a body.

#

If shape is a polygon, and that polygon is not 'valid'

@:value({ output : null, filter : null })shapesUnderPoint(point:Vec2, ?filter:InteractionFilter, ?output:ShapeList):ShapeList

Evaluate all Shapes under a given Point.

If the filter argument is non-null, then only shapes who's filter agrees to 'collide' will be considered.

Parameters:

point

The point to evaluate shapes.

filter

Optional filter to pick and choose shapes, based on whether the filters agree to collide. (default null)

output

Optional list to append results to instead of creating a new list (default null).

Returns:

A list of all the Shapes containing the given point.

Throws:

#

If point is null or disposed of.

@:value({ positionIterations : 10, velocityIterations : 10 })step(deltaTime:Float, velocityIterations:Int = 10, positionIterations:Int = 10):Void

Step simulation forward in time.

Parameters:

deltaTime

The number of seconds to simulate. For 60fps physics you would use a value of 1/60.

velocityIterations

The number of iterations to use in resolving errors in the velocities of objects. This is together with collision detection the most expensive phase of a simulation update, as well as the most important for stable results. (default 10)

positionIterations

The number of iterations to use in resolving errors in the positions of objects. This is far more lightweight than velocity iterations, as well as being less important for the stability of results. (default 10)

Throws:

#

If deltaTime is not strictly positive.

#

If either of the number of iterations is not strictly positive.

visitBodies(lambda:Body ‑> Void):Void

Apply given function to all bodies in space.

This method is a way to iterate over 'every' Body in the Space regardless of containment in a Compound.

Parameters:

lambda

The function to apply to each Body.

Throws:

#

If lambda is null.

visitCompounds(lambda:Compound ‑> Void):Void

Apply given function to all compounds in space.

This method is a way to iterate over 'every' Compound in the Space regardless of containment in another Compound.

Parameters:

lambda

The function to apply to each Compound.

Throws:

#

If lambda is null.

visitConstraints(lambda:Constraint ‑> Void):Void

Apply given function to all constraints in space.

This method is a way to iterate over 'every' Constraint in the Space regardless of containment in a Compound.

Parameters:

lambda

The function to apply to each Constraint.

Throws:

#

If lambda is null.