Public Types | Public Member Functions | Protected Member Functions | Protected Attributes | Friends | List of all members
ime::Collider Class Referenceabstract

Abstract Base class for colliders. More...

#include <Collider.h>

Inheritance diagram for ime::Collider:
ime::Object ime::BoxCollider ime::CircleCollider ime::EdgeCollider ime::PolygonCollider

Public Types

enum class  Type { Circle , Box , Polygon , Edge }
 The type of the collider. More...
 
using Ptr = std::unique_ptr< Collider >
 Unique collider pointer. More...
 
using CollisionCallback = std::function< void(Collider *, Collider *)>
 RigidBody collision callback. More...
 

Public Member Functions

 Collider (Type type)
 Construct a collider. More...
 
 Collider (Collider &&) noexcept
 Move constructor. More...
 
Collideroperator= (Collider &&) noexcept
 Move assignment operator. More...
 
virtual Collider::Ptr clone () const =0
 Create a copy of the collider. More...
 
std::string getClassType () const override
 Get the name of this class. More...
 
Type getType () const
 Get the type of the collider. More...
 
void setDensity (float density)
 Set the density of the collider. More...
 
float getDensity () const
 Get the density of the collider. More...
 
void setFriction (float friction)
 Set the coefficient of friction. More...
 
float getFriction () const
 Get the coefficient of friction. More...
 
void setRestitution (float restitution)
 Set the coefficient of restitution. More...
 
float getRestitution () const
 Get the coefficient of restitution of the collider. More...
 
void setRestitutionThreshold (float threshold)
 Set the restitution threshold of the collider. More...
 
float getRestitutionThreshold () const
 Get the restitution velocity threshold of the collider. More...
 
void setSensor (bool sensor)
 Set whether or not the collider acts as a sensor. More...
 
bool isSensor () const
 Check whether or not the collider is a sensor. More...
 
void setCollisionFilter (const CollisionFilterData &filterData)
 Set the collision filter data of the collider. More...
 
const CollisionFilterDatagetCollisionFilterData () const
 Get the collision filter data for the collider. More...
 
void resetCollisionFilterData ()
 Reset the collision filtering data to default. More...
 
void setEnable (bool enable)
 Enable or disable the collider. More...
 
bool isAttachedToBody () const
 Check if the collider is attached to a rigid body or not. More...
 
RigidBodygetBody ()
 Get the body the collider is attached to. More...
 
const RigidBodygetBody () const
 
bool containsPoint (const Vector2f &point) const
 Check if the collider contains a point or not. More...
 
PropertyContainergetUserData ()
 Get the user data extracted from the collider definition. More...
 
const PropertyContainergetUserData () const
 
void onContactBegin (const CollisionCallback &callback)
 Add an event listener to a collision start event. More...
 
void onContactEnd (const CollisionCallback &callback)
 Add an event listener to a collision end event. More...
 
void onContactStay (const CollisionCallback &callback)
 Add an event listener to a contact stay event. More...
 
void emitContact (const std::string &event, Collider *other)
 
 ~Collider () override=0
 Destructor. More...
 
void setTag (const std::string &tag)
 Assign the object an alias. More...
 
const std::string & getTag () const
 Get the tag assigned to the object. More...
 
unsigned int getObjectId () const
 Get the unique id of the object. More...
 
virtual std::string getClassName () const =0
 Get the name of the objects concrete class. More...
 
int onPropertyChange (const std::string &property, const Callback< Property > &callback, bool oneTime=false)
 Add an event listener to a specific property change event. More...
 
int onPropertyChange (const Callback< Property > &callback, bool oneTime=false)
 Add an event listener to any property change event. More...
 
void suspendedEventListener (int id, bool suspend)
 Pause or resume execution of an event listener. More...
 
bool isEventListenerSuspended (int id) const
 Check if an event listener is suspended or not. More...
 
bool removeEventListener (const std::string &event, int id)
 Remove an event listener from an event. More...
 
bool removeEventListener (int id)
 Remove an event listener. More...
 
int onDestruction (const Callback<> &callback)
 Add a destruction listener. More...
 
bool isSameObjectAs (const Object &other) const
 Check if another object is the same instance as this object. More...
 

Protected Member Functions

 Collider (const Collider &)
 Copy constructor. More...
 
Collideroperator= (const Collider &)
 Copy assignment operator. More...
 
virtual b2Shape & getInternalShape ()=0
 
virtual const b2Shape & getInternalShape () const =0
 
void emitChange (const Property &property)
 Dispatch a property change event. More...
 
void emitDestruction ()
 Emit a destruction event. More...
 

Protected Attributes

EventEmitter eventEmitter_
 Event dispatcher. More...
 

Friends

class RigidBody
 Needs access to constructor. More...
 

Detailed Description

Abstract Base class for colliders.

A collider enables collisions between rigid bodies/game objects. It defines the shape of a rigid body/game object for the purpose of physical collisions. Usually a collider is attached to a rigid Body which is then attached to a GameObject. A game object that has a rigid body attached to it which does not have a collider will be affected by physics (impulses, gravity, friction etc), but the game object cannot react/respond to collisions.

Colliders are invisible however they may be drawn on the render window during debug mode by enabling debug drawing of the physics World.

Rigid bodies enable physics while colliders enable collisions

Definition at line 119 of file Collider.h.

Member Typedef Documentation

◆ CollisionCallback

using ime::Collider::CollisionCallback = std::function<void(Collider*, Collider*)>

RigidBody collision callback.

Definition at line 122 of file Collider.h.

◆ Ptr

using ime::Collider::Ptr = std::unique_ptr<Collider>

Unique collider pointer.

Definition at line 121 of file Collider.h.

Member Enumeration Documentation

◆ Type

enum class ime::Collider::Type
strong

The type of the collider.

Enumerator
Circle 

Circle collider.

Box 

Box collider.

Polygon 

Polygon collider.

Edge 

Edge collider.

Definition at line 127 of file Collider.h.

Constructor & Destructor Documentation

◆ Collider() [1/3]

ime::Collider::Collider ( Type  type)
explicit

Construct a collider.

Parameters
typeType of the collider
Warning
The collider must be attached to a rigid body before any of its functions are are called. Calling a member function without a rigid body is undefined behavior

◆ Collider() [2/3]

ime::Collider::Collider ( Collider &&  )
noexcept

Move constructor.

◆ ~Collider()

ime::Collider::~Collider ( )
overridepure virtual

Destructor.

◆ Collider() [3/3]

ime::Collider::Collider ( const Collider )
protected

Copy constructor.

Member Function Documentation

◆ clone()

virtual Collider::Ptr ime::Collider::clone ( ) const
pure virtual

Create a copy of the collider.

Returns
A copy of the collider
Warning
The collider must be attached to a rigid body before any of its functions are are called. Calling a member function before attaching the collider to a rigid body is undefined behavior

Implemented in ime::BoxCollider, ime::CircleCollider, ime::EdgeCollider, and ime::PolygonCollider.

◆ containsPoint()

bool ime::Collider::containsPoint ( const Vector2f point) const

Check if the collider contains a point or not.

Parameters
pointThe point to be checked in world coordinates
Returns
True if the collider contains the point, otherwise false

◆ emitChange()

void ime::Object::emitChange ( const Property property)
protectedinherited

Dispatch a property change event.

Parameters
propertyThe property that changed

This function will invoke all the event listeners of the specified property

See also
emit

◆ emitDestruction()

void ime::Object::emitDestruction ( )
protectedinherited

Emit a destruction event.

Note
This function must be the first statement in the definition of a destructor to avoid undefined behavior. In addition, note that destruction listeners are invoked once. Therefore, multiple classes in a hierarchy may call this function but the class that makes the call first will be the one that invokes the destruction listeners

◆ getBody()

RigidBody * ime::Collider::getBody ( )

Get the body the collider is attached to.

Returns
The body this collider is attached to if any, otherwise a nullptr

◆ getClassName()

virtual std::string ime::Object::getClassName ( ) const
pure virtualinherited

Get the name of the objects concrete class.

Returns
The name of the objects concrete class

This function is implemented by all internal classes that inherit from this class (either directly or indirectly). Example:

class ime::GameObject : public ime::Object {...}
GameObject gObject;
std::cout << gObject.getClassName(); // Prints "GameObject"
Class for modelling game objects (players, enemies etc...)
Definition: GameObject.h:42
An abstract top-level base class for IME objects.
Definition: Object.h:40
virtual std::string getClassName() const =0
Get the name of the objects concrete class.
See also
getClassType

Implemented in ime::audio::Music, ime::audio::SoundEffect, ime::GameObject, ime::GridObject, ime::CyclicGridMover, ime::GridMover, ime::KeyboardGridMover, ime::RandomGridMover, ime::TargetGridMover, ime::AABB, ime::BoxCollider, ime::CircleCollider, ime::EdgeCollider, ime::PolygonCollider, ime::DistanceJoint, ime::RigidBody, ime::RenderLayer, ime::RenderLayerContainer, ime::Scene, ime::Camera, ime::CircleShape, ime::ConvexShape, ime::RectangleShape, ime::Sprite, ime::SpriteSheet, and ime::Tile.

◆ getClassType()

std::string ime::Collider::getClassType ( ) const
overridevirtual

Get the name of this class.

Returns
The name of this class

Note that this function is only implemented by child classes of Object which also serve as a base class for other classes

See also
Object::getClassType and Object::getClassName

Reimplemented from ime::Object.

◆ getCollisionFilterData()

const CollisionFilterData & ime::Collider::getCollisionFilterData ( ) const

Get the collision filter data for the collider.

Returns
The collision filter data of the collider

◆ getDensity()

float ime::Collider::getDensity ( ) const

Get the density of the collider.

Returns
The density of the collider

◆ getFriction()

float ime::Collider::getFriction ( ) const

Get the coefficient of friction.

Returns
The coefficient of friction

◆ getObjectId()

unsigned int ime::Object::getObjectId ( ) const
inherited

Get the unique id of the object.

Returns
The unique id of the object

Note that each instance of ime::Object has a unique id

See also
setTag

◆ getRestitution()

float ime::Collider::getRestitution ( ) const

Get the coefficient of restitution of the collider.

Returns
The coefficient of restitution of the collider

◆ getRestitutionThreshold()

float ime::Collider::getRestitutionThreshold ( ) const

Get the restitution velocity threshold of the collider.

Returns
The restitution velocity

◆ getTag()

const std::string & ime::Object::getTag ( ) const
inherited

Get the tag assigned to the object.

Returns
The tag of the object
See also
setTag

◆ getType()

Type ime::Collider::getType ( ) const

Get the type of the collider.

Returns
The type of the collider

◆ getUserData()

PropertyContainer & ime::Collider::getUserData ( )

Get the user data extracted from the collider definition.

Returns
The user data

◆ isAttachedToBody()

bool ime::Collider::isAttachedToBody ( ) const

Check if the collider is attached to a rigid body or not.

Returns
True if it is attached to a body, otherwise false
Note
A collider can only be attached to a single rigid Body

◆ isEventListenerSuspended()

bool ime::Object::isEventListenerSuspended ( int  id) const
inherited

Check if an event listener is suspended or not.

Parameters
idThe identification number of the listener to be checked
Returns
True if suspended, otherwise false

This function also returns false if the specified event listener does not exist

See also
suspendedEventListener

◆ isSameObjectAs()

bool ime::Object::isSameObjectAs ( const Object other) const
inherited

Check if another object is the same instance as this object.

Parameters
otherThe object to compare against this object
Returns
True if other is the same instance as this object, otherwise false

◆ isSensor()

bool ime::Collider::isSensor ( ) const

Check whether or not the collider is a sensor.

Returns
True if the collider is a sensor, otherwise false

◆ onContactBegin()

void ime::Collider::onContactBegin ( const CollisionCallback callback)

Add an event listener to a collision start event.

Parameters
callbackThe function to be executed when this collider starts overlapping with another collider

Note that the callback is called when the colliders come into contact and not when they remain in contact. In other words it is called once per interaction. On invocation, the callback is passed this collider and the collider that it started overlapping with respectively. In addition, only one event listener may be registered to this event, subsequent event listeners overwrite the current one. Pass nullptr to remove the current event listener

Note
The callback is invoked for sensor and non-sensor colliders
Warning
Don't keep the pointers passed to the callback, they are invalidated when the callback execution terminates
See also
onContactEnd, onContactStay and setSensor

◆ onContactEnd()

void ime::Collider::onContactEnd ( const CollisionCallback callback)

Add an event listener to a collision end event.

Parameters
callbackThe function to be executed when the event is fired

The callback is called when this collider stops overlapping with another collider. The callback is passed this collider and the collider it stopped overlapping with respectively. Note that only only one event listener may be registered to this event, subsequent event listeners overwrite the current one. Pass nullptr to remove the current event listener

Note
The callback is invoked for sensor and non-sensor colliders
Warning
Don't keep the pointers passed to the callback, they are invalidated when the callback execution terminates
See also
onContactBegin, onContactStay and setSensor

◆ onContactStay()

void ime::Collider::onContactStay ( const CollisionCallback callback)

Add an event listener to a contact stay event.

Parameters
callbackThe function to be executed when the event is fired

The callback is called while this collider remains in contact with another collider. On invocation, the callback is passed this collider and the collider its currently overlapping with respectively.

Note that only one event listener may be registered to this event, subsequent event listeners overwrite the current one. Pass nullptr to remove the current event listener

Note
The callback is only invoked for non-sensor contacts. That is, if one of the two colliders in contact is a sensor, the on stay event will not be triggered. The event is also not triggered if the body the collider is attached to is not awake
Warning
Don't keep the pointers passed to the callback, they are invalidated when the callback execution terminates
See also
onContactBegin, onContactEnd and setSensor

◆ onDestruction()

int ime::Object::onDestruction ( const Callback<> &  callback)
inherited

Add a destruction listener.

Parameters
callbackFunction to be executed when the object is destroyed
Returns
The unique id of the destruction listener

The destruction listener is called when the object reaches the end of its lifetime. Note that an object may have multiple destruction listeners registered to it

Warning
It's not advised to call virtual functions in the destruction callback as some parts of the object may have already been destroyed by the time the callback is invoked. In such an event, the behavior is undefined
See also
removeEventListener

◆ onPropertyChange() [1/2]

int ime::Object::onPropertyChange ( const Callback< Property > &  callback,
bool  oneTime = false 
)
inherited

Add an event listener to any property change event.

Parameters
callbackThe function to be executed when any property changes
oneTimeTrue to execute the callback one-time or false to execute it every time the event is triggered
Returns
The unique id of the event listener

When unsubscribing the any property change event handler, you must pass "propertyChange" as the name of the event

See also
onPropertyChange(const std::string&, const ime::Callback<ime::Property>&)

◆ onPropertyChange() [2/2]

int ime::Object::onPropertyChange ( const std::string &  property,
const Callback< Property > &  callback,
bool  oneTime = false 
)
inherited

Add an event listener to a specific property change event.

Parameters
propertyThe name of the property to add an event listener to
oneTimeTrue to execute the callback one-time or false to execute it every time the event is triggered
callbackThe function to be executed when the property changes
Returns
The unique id of the event listener

A property change event is triggered by any function that begins with set, where the the text after set is the name of the property. For example, the setTag() function, modifies the tag property of the object, thus will generate a "tag" change event each time it is called

Note that multiple event listeners may be registered to the same property change event. In addition, when adding a property change event listener, the name of the property must be in lowercase.

// Prints the tag of the player object to the console everytime it changes
player.onPropertyChange("tag", [](const Property& property) {
cout << "New tag: " << property.getValue<std::string>() << endl;
});
...
//Sets tag = "player1" and invokes event listener(s)
player.setTag("player1");
See also
unsubscribe and onPropertyChange(const ime::Callback<ime::Property>&)

◆ operator=() [1/2]

Collider & ime::Collider::operator= ( Collider &&  )
noexcept

Move assignment operator.

◆ operator=() [2/2]

Collider & ime::Collider::operator= ( const Collider )
protected

Copy assignment operator.

◆ removeEventListener() [1/2]

bool ime::Object::removeEventListener ( const std::string &  event,
int  id 
)
inherited

Remove an event listener from an event.

Parameters
eventThe name of the event to remove an event listener from
idThe unique id of the event listener to be removed
Returns
True if the event listener was removed or false if the event or the event listener is does not exist
// Display the tag of the object to console every time it changes
auto tagChangeId = object.onPropertyChange("tag", [](ime::Property tag) {
std::cout << name.getValue<std::string>() << std::endl;
});
// Stop displaying the tag of the object when it changes
object.removeEventListener("tag", tagChangeId);
Class that can store a value of any type.
Definition: Property.h:38

◆ removeEventListener() [2/2]

bool ime::Object::removeEventListener ( int  id)
inherited

Remove an event listener.

Parameters
idThe id of the event listener to be removed
Returns
True if the event listener was removed or false if no such handler exists

◆ resetCollisionFilterData()

void ime::Collider::resetCollisionFilterData ( )

Reset the collision filtering data to default.

By default, the collider does not belong to any collision group and the rigid body the collider is attached to will collide with any rigid body (that is also collidable) it comes into contact with

◆ setCollisionFilter()

void ime::Collider::setCollisionFilter ( const CollisionFilterData filterData)

Set the collision filter data of the collider.

Parameters
filterDataThe new collision filter data

This function will not update contacts until the next time step when either parent body is active or awake

By default, the collider does not belong to any collision group and the rigid body the collider is attached to will collide with any rigid body (that is also collidable) it comes into contact with

◆ setDensity()

void ime::Collider::setDensity ( float  density)

Set the density of the collider.

Parameters
densityThe density to set

The colliders density is used to compute the mass properties of the rigid body. The density can be zero or positive. You should use similar densities for all of your colliders. This will improve stacking stability

By default, the density is 1.0f

◆ setEnable()

void ime::Collider::setEnable ( bool  enable)

Enable or disable the collider.

Parameters
enableTrue to enable or false to disable

This function will only modify the collision bitmask and leave the category bit and group index as is. When enable is set to false, the collision bitmask will be set to 0 causing the collider to not collide with any other collider and when enable is set to true, the collision bitmask will be set to the value it was before it was set to zero.

This function is a just a shortcut for:

// When set this way, you will also have to save/remember the previous
// collision bitmask value if you wish to restore it and not set a new
// one
auto filterData = collider.getCollisionFilterData();
filterData.collisionBitMask = 0;
collider.setCollisionFilter(filterData);

By default, the collider is enabled

See also
setCollisionFilter

◆ setFriction()

void ime::Collider::setFriction ( float  friction)

Set the coefficient of friction.

Parameters
frictionThe coefficient to set

Friction is used to make objects slide along each other realistically The friction parameter is usually set between 0 and 1, but can be any non-negative value. A friction value of 0 turns off friction and a value of 1 makes the friction strong

Note
This will not change the coefficient of existing contacts

By default, the friction is 0.2f

◆ setRestitution()

void ime::Collider::setRestitution ( float  restitution)

Set the coefficient of restitution.

Parameters
restitutionThe coefficient to set

Restitution is used to make objects bounce. The restitution value is usually set to be between 0 and 1. Consider dropping a ball on a table. A value of zero means the ball won't bounce. This is called an inelastic collision. A value of one means the ball's velocity will be exactly reflected. This is called a perfectly elastic collision

Note
This will not change the restitution of existing contacts

By default, the restitution is 0.0f

◆ setRestitutionThreshold()

void ime::Collider::setRestitutionThreshold ( float  threshold)

Set the restitution threshold of the collider.

Parameters
thresholdThe new restitution threshold
Note
This will not change the restitution threshold of existing contacts

By default, the restitution threshold is 1.0f

◆ setSensor()

void ime::Collider::setSensor ( bool  sensor)

Set whether or not the collider acts as a sensor.

Parameters
sensorTrue to set as sensor, otherwise false

A sensor detects a collision but does not generate a collision response. This is useful if you only want to know when two colliders overlap. You can flag any collider as being a sensor. Sensors may be attached to static, kinematic, or dynamic bodies. Remember that you may have multiple colliders per body and you can have any mix of sensors and non-sensor colliders. However, sensors only form contacts when at least one body is dynamic, therefore, you will not get a contact for kinematic versus kinematic, kinematic versus static, or static versus static

By default, the collider is not a sensor

◆ setTag()

void ime::Object::setTag ( const std::string &  tag)
inherited

Assign the object an alias.

Parameters
tagThe alias of the object

This function is useful if you want to refer to the object by a tag instead of its object id. Unlike an object id, multiple objects may have the same tag

By default, the tag is an empty string

See also
getObjectId

◆ suspendedEventListener()

void ime::Object::suspendedEventListener ( int  id,
bool  suspend 
)
inherited

Pause or resume execution of an event listener.

Parameters
idThe event listeners unique identification number
suspendTrue to suspend/pause or false to unsuspend/resume
See also
isEventListenerSuspended

Friends And Related Function Documentation

◆ RigidBody

friend class RigidBody
friend

Needs access to constructor.

Definition at line 499 of file Collider.h.

Member Data Documentation

◆ eventEmitter_

EventEmitter ime::Object::eventEmitter_
protectedinherited

Event dispatcher.

Definition at line 289 of file Object.h.


The documentation for this class was generated from the following file: