Changed Physical size to be passed via Yaml.
This commit is contained in:
parent
daaf8c8d9a
commit
9b61304d1e
10 changed files with 56 additions and 33 deletions
|
@ -34,7 +34,7 @@ TileManager::TileManager(b2World& world) :
|
||||||
*/
|
*/
|
||||||
TileManager::Tile::Tile(Type type, const TilePosition& position, b2World& world) :
|
TileManager::Tile::Tile(Type type, const TilePosition& position, b2World& world) :
|
||||||
Sprite(getTexture(type), PhysicalData(Vector2f(position.x * TILE_SIZE.x, position.y * TILE_SIZE.y),
|
Sprite(getTexture(type), PhysicalData(Vector2f(position.x * TILE_SIZE.x, position.y * TILE_SIZE.y),
|
||||||
TILE_SIZE, world, CATEGORY_WORLD, (type == Type::FLOOR) ? MASK_NONE : MASK_ALL, false)),
|
world, CATEGORY_WORLD, (type == Type::FLOOR) ? MASK_NONE : MASK_ALL, false)),
|
||||||
mType(type) {
|
mType(type) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,14 +11,17 @@
|
||||||
|
|
||||||
#include <Thor/Vectors.hpp>
|
#include <Thor/Vectors.hpp>
|
||||||
|
|
||||||
|
const String Physical::KEY_SIZE = "size";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initializes Box2D body.
|
* Initializes Box2D body.
|
||||||
*
|
*
|
||||||
* @param data Data needed for construction.
|
* @param data Data needed for construction.
|
||||||
*/
|
*/
|
||||||
Physical::Physical(const PhysicalData& data) :
|
Physical::Physical(const PhysicalData& data, const Yaml& config) :
|
||||||
mDelete(false) {
|
mDelete(false) {
|
||||||
assert(data.size != Vector2i());
|
Vector2i size = config.get<Vector2i>(KEY_SIZE);
|
||||||
|
assert(size != Vector2i());
|
||||||
|
|
||||||
b2BodyDef bodyDef;
|
b2BodyDef bodyDef;
|
||||||
bodyDef.type = (data.moving)
|
bodyDef.type = (data.moving)
|
||||||
|
@ -34,14 +37,14 @@ Physical::Physical(const PhysicalData& data) :
|
||||||
|
|
||||||
b2Shape* shape;
|
b2Shape* shape;
|
||||||
if (data.circle) {
|
if (data.circle) {
|
||||||
assert(data.size.x == data.size.y);
|
assert(size.x == size.y);
|
||||||
shape = new b2CircleShape;
|
shape = new b2CircleShape;
|
||||||
shape->m_radius = pixelToMeter(data.size.x) / 2;
|
shape->m_radius = pixelToMeter(size.x) / 2;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
b2PolygonShape* box = new b2PolygonShape;
|
b2PolygonShape* box = new b2PolygonShape;
|
||||||
box->SetAsBox(pixelToMeter(data.size.x) / 2,
|
box->SetAsBox(pixelToMeter(size.x) / 2,
|
||||||
pixelToMeter(data.size.y) / 2);
|
pixelToMeter(size.y) / 2);
|
||||||
shape = dynamic_cast<b2Shape*>(box);
|
shape = dynamic_cast<b2Shape*>(box);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,16 +73,15 @@ Physical::~Physical() {
|
||||||
*
|
*
|
||||||
* @link Physical::PhysicalData
|
* @link Physical::PhysicalData
|
||||||
*/
|
*/
|
||||||
Physical::PhysicalData::PhysicalData( const Vector2f& position, const Vector2i& size,
|
Physical::PhysicalData::PhysicalData( const Vector2f& position, b2World& world, uint16 category,
|
||||||
b2World& world, uint16 category, uint16 maskExclude, bool moving, bool bullet, bool circle) :
|
uint16 maskExclude, bool moving, bool bullet, bool circle) :
|
||||||
position(position),
|
position(position),
|
||||||
size(size),
|
world(world),
|
||||||
world(world),
|
category(category),
|
||||||
category(category),
|
maskExclude(maskExclude),
|
||||||
maskExclude(maskExclude),
|
moving(moving),
|
||||||
moving(moving),
|
bullet(bullet),
|
||||||
bullet(bullet),
|
circle(circle) {
|
||||||
circle(circle) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -10,7 +10,11 @@
|
||||||
|
|
||||||
#include <Box2D/Box2D.h>
|
#include <Box2D/Box2D.h>
|
||||||
|
|
||||||
|
#include "../util/String.h"
|
||||||
#include "../util/Vector.h"
|
#include "../util/Vector.h"
|
||||||
|
#include "../util/Yaml.h"
|
||||||
|
|
||||||
|
class Yaml;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An object with physical properties.
|
* An object with physical properties.
|
||||||
|
@ -26,13 +30,10 @@ public:
|
||||||
class PhysicalData {
|
class PhysicalData {
|
||||||
public:
|
public:
|
||||||
PhysicalData() = default;
|
PhysicalData() = default;
|
||||||
PhysicalData(const Vector2f& position, const Vector2i& size, b2World& world,
|
PhysicalData(const Vector2f& position, b2World& world, uint16 category,
|
||||||
uint16 category, uint16 maskExclude, bool moving, bool bullet = false,
|
uint16 maskExclude, bool moving, bool bullet = false, bool circle = false);
|
||||||
bool circle = false);
|
|
||||||
/// World position of the body in pixel coordinates.
|
/// World position of the body in pixel coordinates.
|
||||||
const Vector2f& position;
|
const Vector2f& position;
|
||||||
/// Pixel size of the body if it is a box.
|
|
||||||
Vector2i size;
|
|
||||||
/// Box2D world object.
|
/// Box2D world object.
|
||||||
b2World& world;
|
b2World& world;
|
||||||
/// The category for collision filtering. Only one may be set. @link Physical::Category
|
/// The category for collision filtering. Only one may be set. @link Physical::Category
|
||||||
|
@ -72,7 +73,7 @@ public:
|
||||||
|
|
||||||
// Public functions.
|
// Public functions.
|
||||||
public:
|
public:
|
||||||
Physical(const PhysicalData& data);
|
Physical(const PhysicalData& data, const Yaml& config);
|
||||||
virtual ~Physical() = 0;
|
virtual ~Physical() = 0;
|
||||||
|
|
||||||
Vector2f getPosition() const;
|
Vector2f getPosition() const;
|
||||||
|
@ -97,6 +98,8 @@ protected:
|
||||||
|
|
||||||
// Private variables.
|
// Private variables.
|
||||||
private:
|
private:
|
||||||
|
static const String KEY_SIZE;
|
||||||
|
|
||||||
b2Body* mBody;
|
b2Body* mBody;
|
||||||
bool mDelete;
|
bool mDelete;
|
||||||
};
|
};
|
||||||
|
|
|
@ -18,10 +18,10 @@ const String Sprite::KEY_TEXTURE = "texture";
|
||||||
* @param texturePath Relative path to the texture file in the resource folder.
|
* @param texturePath Relative path to the texture file in the resource folder.
|
||||||
*/
|
*/
|
||||||
Sprite::Sprite(const Yaml& config, const PhysicalData& data) :
|
Sprite::Sprite(const Yaml& config, const PhysicalData& data) :
|
||||||
Physical(data),
|
Physical(data, config),
|
||||||
mTexture(ResourceManager::i().acquire(Loader::i()
|
mTexture(ResourceManager::i().acquire(Loader::i()
|
||||||
.fromFile<sf::Texture>(config.get<String>(KEY_TEXTURE)))),
|
.fromFile<sf::Texture>(config.get<String>(KEY_TEXTURE)))),
|
||||||
mSize(data.size) {
|
mSize(Vector2i(getSize())) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -30,9 +30,9 @@ Sprite::Sprite(const Yaml& config, const PhysicalData& data) :
|
||||||
* @param texture Pointer to the texture to be used (must already be loaded).
|
* @param texture Pointer to the texture to be used (must already be loaded).
|
||||||
*/
|
*/
|
||||||
Sprite::Sprite(const std::shared_ptr<sf::Texture>& texture, const PhysicalData& data) :
|
Sprite::Sprite(const std::shared_ptr<sf::Texture>& texture, const PhysicalData& data) :
|
||||||
Physical(data),
|
Physical(data, Yaml("tile.yaml")),
|
||||||
mTexture(texture),
|
mTexture(texture),
|
||||||
mSize(data.size) {
|
mSize(Vector2i(getSize())) {
|
||||||
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -25,7 +25,7 @@ const String Bullet::KEY_SPEED = "speed";
|
||||||
Bullet::Bullet(const Vector2f& position, b2World& world, Physical& shooter, float direction,
|
Bullet::Bullet(const Vector2f& position, b2World& world, Physical& shooter, float direction,
|
||||||
const Yaml& config) :
|
const Yaml& config) :
|
||||||
Particle(ResourceManager::i().acquire(Loader::i().fromFile<sf::Texture>("bullet.png")),
|
Particle(ResourceManager::i().acquire(Loader::i().fromFile<sf::Texture>("bullet.png")),
|
||||||
PhysicalData(position, SIZE, world, CATEGORY_PARTICLE, CATEGORY_PARTICLE,
|
PhysicalData(position, world, CATEGORY_PARTICLE, CATEGORY_PARTICLE,
|
||||||
true, true, true), config),
|
true, true, true), config),
|
||||||
mShooter(shooter),
|
mShooter(shooter),
|
||||||
mDamage(config.get<int>(KEY_DAMAGE)),
|
mDamage(config.get<int>(KEY_DAMAGE)),
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
#include "Body.h"
|
#include "Body.h"
|
||||||
|
|
||||||
Body::Body(b2World& world, const Vector2f& position, const Yaml& config) :
|
Body::Body(b2World& world, const Vector2f& position, const Yaml& config) :
|
||||||
Sprite(config, PhysicalData(position, Vector2i(50, 50), world,
|
Sprite(config, PhysicalData(position, world, CATEGORY_NONSOLID, MASK_NONE, false)) {
|
||||||
CATEGORY_NONSOLID, MASK_NONE, false)) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,6 @@
|
||||||
#include "Cover.h"
|
#include "Cover.h"
|
||||||
|
|
||||||
Cover::Cover(const Vector2f& position, const Vector2i& size, b2World& world, const Yaml& config) :
|
Cover::Cover(const Vector2f& position, const Vector2i& size, b2World& world, const Yaml& config) :
|
||||||
Sprite(config, PhysicalData(position, size, world, CATEGORY_WORLD, MASK_ALL, false)) {
|
Sprite(config, PhysicalData(position, world, CATEGORY_WORLD, MASK_ALL, false)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
#include "Body.h"
|
#include "Body.h"
|
||||||
|
|
||||||
Enemy::Enemy(const Instances& instances, const Vector2f& position, const Yaml& config) :
|
Enemy::Enemy(const Instances& instances, const Vector2f& position, const Yaml& config) :
|
||||||
Character(instances, "enemy.png", PhysicalData(position, Vector2i(50, 50), instances.world,
|
Character(instances, "enemy.png", PhysicalData(position, instances.world,
|
||||||
CATEGORY_ACTOR, MASK_ALL, true, false, true), config),
|
CATEGORY_ACTOR, MASK_ALL, true, false, true), config),
|
||||||
mWorld(instances.world),
|
mWorld(instances.world),
|
||||||
mCollection(instances.collection) {
|
mCollection(instances.collection) {
|
||||||
|
|
|
@ -21,7 +21,7 @@ const float Player::POINT_REACHED_DISTANCE = 1.0f;
|
||||||
* Initializes Sprite.
|
* Initializes Sprite.
|
||||||
*/
|
*/
|
||||||
Player::Player(const Instances& instances, const Vector2f& position, const Yaml& config) :
|
Player::Player(const Instances& instances, const Vector2f& position, const Yaml& config) :
|
||||||
Character(instances, "player.png", PhysicalData(position, SIZE, instances.world,
|
Character(instances, "player.png", PhysicalData(position, instances.world,
|
||||||
CATEGORY_ACTOR, MASK_ALL, true, false, true), config),
|
CATEGORY_ACTOR, MASK_ALL, true, false, true), config),
|
||||||
mWeapon(instances, *this, Yaml("weapon.yaml")),
|
mWeapon(instances, *this, Yaml("weapon.yaml")),
|
||||||
mDirection(0),
|
mDirection(0),
|
||||||
|
|
|
@ -13,6 +13,9 @@
|
||||||
#include <yaml-cpp/yaml.h>
|
#include <yaml-cpp/yaml.h>
|
||||||
|
|
||||||
#include "String.h"
|
#include "String.h"
|
||||||
|
#include "Vector.h"
|
||||||
|
|
||||||
|
namespace details {};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface to a YAML file.
|
* Interface to a YAML file.
|
||||||
|
@ -23,6 +26,7 @@ public:
|
||||||
Yaml(const String& filename);
|
Yaml(const String& filename);
|
||||||
|
|
||||||
static void setFolder(const String& folder);
|
static void setFolder(const String& folder);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a value of a specified type by key. Throws exception if key not found.
|
* Gets a value of a specified type by key. Throws exception if key not found.
|
||||||
*
|
*
|
||||||
|
@ -43,4 +47,19 @@ private:
|
||||||
YAML::Node mNode;
|
YAML::Node mNode;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stream output operators to specialize Yaml::get for other types.
|
||||||
|
*/
|
||||||
|
namespace {
|
||||||
|
void operator>>(const YAML::Node& node, Vector2i& vector) {
|
||||||
|
node[0] >> vector.x;
|
||||||
|
node[1] >> vector.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
void operator>>(const YAML::Node& node, Vector2f& vector) {
|
||||||
|
node[0] >> vector.x;
|
||||||
|
node[1] >> vector.y;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* DG_YAML_H_ */
|
#endif /* DG_YAML_H_ */
|
||||||
|
|
Reference in a new issue