2012-09-09 20:50:15 +00:00
|
|
|
/*
|
|
|
|
* Physical.cpp
|
|
|
|
*
|
|
|
|
* Created on: 11.08.2012
|
|
|
|
* Author: Felix
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "Physical.h"
|
|
|
|
|
|
|
|
#include <math.h>
|
|
|
|
|
|
|
|
#include <Thor/Vectors.hpp>
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Initializes Box2D body.
|
|
|
|
*
|
|
|
|
* @param data Data needed for construction.
|
|
|
|
*/
|
|
|
|
Physical::Physical(const PhysicalData& data) :
|
|
|
|
mDelete(false) {
|
|
|
|
assert(data.size != Vector2i());
|
|
|
|
|
2012-09-12 12:21:57 +00:00
|
|
|
b2BodyDef bodyDef;
|
2012-09-28 16:43:28 +00:00
|
|
|
bodyDef.type = (data.moving)
|
2012-09-12 12:21:57 +00:00
|
|
|
? b2_dynamicBody
|
2012-09-09 20:50:15 +00:00
|
|
|
: b2_staticBody;
|
|
|
|
bodyDef.position = vector(data.position);
|
|
|
|
bodyDef.allowSleep = true;
|
|
|
|
bodyDef.fixedRotation = true;
|
|
|
|
bodyDef.bullet = data.bullet;
|
|
|
|
bodyDef.userData = this;
|
|
|
|
|
|
|
|
mBody = data.world.CreateBody(&bodyDef);
|
|
|
|
|
2012-09-13 12:34:36 +00:00
|
|
|
b2Shape* shape;
|
|
|
|
if (data.circle) {
|
|
|
|
assert(data.size.x == data.size.y);
|
|
|
|
shape = new b2CircleShape;
|
|
|
|
shape->m_radius = pixelToMeter(data.size.x) / 2;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
b2PolygonShape* box = new b2PolygonShape;
|
|
|
|
box->SetAsBox(pixelToMeter(data.size.x) / 2,
|
|
|
|
pixelToMeter(data.size.y) / 2);
|
|
|
|
shape = dynamic_cast<b2Shape*>(box);
|
|
|
|
}
|
2012-09-09 20:50:15 +00:00
|
|
|
|
|
|
|
b2FixtureDef fixtureDef;
|
2012-09-13 12:34:36 +00:00
|
|
|
fixtureDef.shape = shape;
|
2012-09-09 20:50:15 +00:00
|
|
|
fixtureDef.density = 1.0f;
|
|
|
|
fixtureDef.filter.categoryBits = data.category;
|
|
|
|
fixtureDef.filter.maskBits = ~data.maskExclude;
|
2012-09-12 12:21:57 +00:00
|
|
|
fixtureDef.restitution = 0;
|
|
|
|
fixtureDef.density = (data.bullet) ? 0 : 10000;
|
2012-09-09 20:50:15 +00:00
|
|
|
|
|
|
|
mBody->CreateFixture(&fixtureDef);
|
2012-09-13 12:34:36 +00:00
|
|
|
|
|
|
|
delete shape;
|
2012-09-09 20:50:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Removes body from world.
|
|
|
|
*/
|
|
|
|
Physical::~Physical() {
|
|
|
|
mBody->GetWorld()->DestroyBody(mBody);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Initializes container.
|
|
|
|
*
|
|
|
|
* @link Physical::PhysicalData
|
|
|
|
*/
|
|
|
|
Physical::PhysicalData::PhysicalData( const Vector2f& position, const Vector2i& size,
|
2012-09-13 12:34:36 +00:00
|
|
|
b2World& world, uint16 category, uint16 maskExclude, bool moving, bool bullet, bool circle) :
|
2012-09-09 20:50:15 +00:00
|
|
|
position(position),
|
|
|
|
size(size),
|
|
|
|
world(world),
|
|
|
|
category(category),
|
|
|
|
maskExclude(maskExclude),
|
|
|
|
moving(moving),
|
2012-09-13 12:34:36 +00:00
|
|
|
bullet(bullet),
|
|
|
|
circle(circle) {
|
2012-09-09 20:50:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the position of the sprite (center).
|
|
|
|
*/
|
|
|
|
Vector2f
|
|
|
|
Physical::getPosition() const {
|
|
|
|
return vector(mBody->GetPosition());
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the movement speed of the body.
|
|
|
|
*/
|
|
|
|
Vector2f
|
|
|
|
Physical::getSpeed() const {
|
|
|
|
return vector(mBody->GetLinearVelocity());
|
|
|
|
}
|
|
|
|
|
2012-09-15 13:28:15 +00:00
|
|
|
/**
|
|
|
|
* Returns the rotation of the body (converted to an SFML angle).
|
2012-09-09 20:50:15 +00:00
|
|
|
*/
|
|
|
|
float
|
|
|
|
Physical::getAngle() const {
|
2012-09-13 11:35:16 +00:00
|
|
|
return thor::toDegree(mBody->GetAngle());
|
2012-09-09 20:50:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns true if this object should be deleted.
|
|
|
|
*/
|
|
|
|
bool
|
|
|
|
Physical::getDelete() const {
|
|
|
|
return mDelete;
|
|
|
|
}
|
2012-09-12 12:21:57 +00:00
|
|
|
|
2012-09-11 17:37:19 +00:00
|
|
|
/**
|
|
|
|
* Returns the Physical::Category of this object.
|
2012-09-12 12:21:57 +00:00
|
|
|
*/
|
2012-09-16 18:33:00 +00:00
|
|
|
Physical::Category
|
2012-09-09 20:50:15 +00:00
|
|
|
Physical::getCategory() const {
|
2012-09-16 18:33:00 +00:00
|
|
|
return (Category) mBody->GetFixtureList()->GetFilterData().categoryBits;
|
2012-09-09 20:50:15 +00:00
|
|
|
}
|
|
|
|
|
2012-09-28 16:43:28 +00:00
|
|
|
/**
|
|
|
|
* Returns the size of the body as a vector.
|
|
|
|
*/
|
|
|
|
Vector2f
|
|
|
|
Physical::getSize() const {
|
|
|
|
b2AABB aabb(mBody->GetFixtureList()->GetAABB(0));
|
|
|
|
return vector(aabb.upperBound - aabb.lowerBound);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns true if collisions are enabled for the body.
|
|
|
|
*/
|
|
|
|
bool
|
|
|
|
Physical::isSolid() const {
|
|
|
|
return mBody->GetFixtureList()->GetFilterData().maskBits != 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns true if the body is able to move.
|
|
|
|
*/
|
|
|
|
bool
|
|
|
|
Physical::isMovable() const {
|
|
|
|
return mBody->GetType() != b2_staticBody;
|
|
|
|
}
|
|
|
|
|
2012-09-09 20:50:15 +00:00
|
|
|
/**
|
|
|
|
* This method filters collisions with other physicals. Implement it if you want to
|
|
|
|
* limit collisions to/with certain objects. Default implementation always returns true.
|
|
|
|
*
|
|
|
|
* @param other The Physical this object is about to collide with.
|
|
|
|
* @return True if the objects should collide.
|
|
|
|
*/
|
|
|
|
bool
|
|
|
|
Physical::doesCollide(Physical& other) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Called when a collision with another body occured. Override this method
|
|
|
|
* to manage collision events.
|
|
|
|
*
|
|
|
|
* @param other Reference to the other Physical in the collision.
|
|
|
|
* @param category The Category of the other object (as passed in constructor).
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
Physical::onCollide(Physical& other, uint16 type) {
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set to true to mark this object for deletion from the world.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
Physical::setDelete(bool value) {
|
|
|
|
mDelete = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets movement speed and direction of the body. Set either value to zero to stop movement.
|
|
|
|
*
|
|
|
|
* @param direction The direction the body moves in, does not have to be normalized.
|
|
|
|
* @param speed The value of the movement speed to be used.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
Physical::setSpeed(Vector2f direction, float speed) {
|
|
|
|
if (direction != Vector2f()) {
|
|
|
|
direction = thor::unitVector<float>(direction);
|
|
|
|
}
|
|
|
|
direction *= speed;
|
|
|
|
mBody->SetLinearVelocity(vector(direction));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the angle of the body based on the direction of a vector.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
Physical::setAngle(float angle) {
|
2012-09-13 11:35:16 +00:00
|
|
|
mBody->SetTransform(mBody->GetPosition(), thor::toRadian(angle));
|
2012-09-09 20:50:15 +00:00
|
|
|
}
|