Skip to content

Commit db66d97

Browse files
committed
Change how properties are applied to objects. So the level loader has less knowledge about objects. And objects are more self contained.
1 parent 0e36ae1 commit db66d97

17 files changed

+122
-73
lines changed

src/door.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,11 @@ void Door::onFixedUpdate()
2020
{
2121
setPosition(getPosition2D() * 0.9 + target_position * 0.1);
2222
}
23+
24+
void Door::setProperty(sp::string name, sp::string value)
25+
{
26+
if (name == "offset")
27+
opened_position = sp::stringutil::convert::toVector2d(value);
28+
else
29+
TriggerableNode::setProperty(name, value);
30+
}

src/door.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ class Door : public TriggerableNode
1212
virtual void onUnTrigger() override;
1313
virtual void onFixedUpdate() override;
1414

15+
virtual void setProperty(sp::string name, sp::string value) override;
16+
1517
sp::Vector2d opened_position;
1618
private:
1719
sp::Vector2d target_position;

src/laser.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ Laser::Laser(sp::P<sp::Node> parent, sp::string trigger)
2828

2929
active = true;
3030
sparkdelay = 0;
31-
setAngle(0);
31+
aim_vector = sp::Vector2d(0, 500);
3232
}
3333

3434
void Laser::onTrigger()
@@ -43,11 +43,6 @@ void Laser::onUnTrigger()
4343
render_data.type = sp::RenderData::Type::Additive;
4444
}
4545

46-
void Laser::setAngle(float angle)
47-
{
48-
aim_vector = sp::Vector2d(0, 500).rotate(angle);
49-
}
50-
5146
void Laser::onFixedUpdate()
5247
{
5348
if (!active)
@@ -88,3 +83,11 @@ void Laser::onFixedUpdate()
8883
sparkdelay = 2;
8984
}
9085
}
86+
87+
void Laser::setProperty(sp::string name, sp::string value)
88+
{
89+
if (name == "angle")
90+
aim_vector = sp::Vector2d(0, 500).rotate(sp::stringutil::convert::toFloat(value));
91+
else
92+
TriggerableNode::setProperty(name, value);
93+
}

src/laser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class Laser : public TriggerableNode
1414
virtual void onUnTrigger() override;
1515
virtual void onFixedUpdate() override;
1616

17-
void setAngle(float angle);
17+
virtual void setProperty(sp::string name, sp::string value) override;
1818
private:
1919
sp::Vector2d aim_vector;
2020
bool active;

src/levelLoader.cpp

Lines changed: 16 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ void loadLevel(sp::P<sp::Node> root, sp::string name)
6363
float x = object["x"].number_value();
6464
float y = -object["y"].number_value();
6565
sp::Vector2d position(x / tw - offset_x, y / th + offset_y);
66+
sp::P<LevelObject> obj;
6667

6768
if (object["type"] == "ICON")
6869
{
@@ -81,6 +82,7 @@ void loadLevel(sp::P<sp::Node> root, sp::string name)
8182
spaceship->setPosition(position);
8283
spaceship->setControls(&controls[index]);
8384
spaceship->icon = addIcon(root, position, "gamepad" + sp::string(index + 1));
85+
obj = spaceship;
8486
}
8587
else if (object["type"] == "TARGET")
8688
{
@@ -91,46 +93,20 @@ void loadLevel(sp::P<sp::Node> root, sp::string name)
9193
}
9294
else if (object["type"] == "OBJECT")
9395
{
94-
sp::P<PhysicsObject> node = new PhysicsObject(root, object["name"].string_value());
95-
node->setPosition(position);
96-
97-
for(const auto& prop : object["properties"].array_items())
98-
{
99-
if (prop["name"] == "GOAL" && prop["value"] == "TARGET")
100-
node->setAsGoalObject();
101-
else if (prop["name"] == "velocity")
102-
node->setLinearVelocity(sp::stringutil::convert::toVector2d(prop["value"].string_value()));
103-
else
104-
LOG(Warning, "Unknown object property:", prop["name"].string_value(), prop["value"].string_value());
105-
}
96+
obj = new PhysicsObject(root, object["name"].string_value());
97+
obj->setPosition(position);
10698
}
10799
else if (object["type"] == "DOOR")
108100
{
109-
sp::P<Door> door = new Door(root, object["name"].string_value());
101+
obj = new Door(root, object["name"].string_value());
110102
LineNodeBuilder builder;
111103
builder.addLoop(json, object, 2.0);
112-
builder.create(door, LineNodeBuilder::CollisionType::Chains);
113-
//node->render_data.color = sp::Color(0.8, 1.0, 0.8);
114-
115-
for(const auto& prop : object["properties"].array_items())
116-
{
117-
if (prop["name"] == "offset")
118-
door->opened_position = sp::stringutil::convert::toVector2d(prop["value"].string_value());
119-
else
120-
LOG(Warning, "Unknown object property:", prop["name"].string_value(), prop["value"].string_value());
121-
}
104+
builder.create(obj, LineNodeBuilder::CollisionType::Chains);
122105
}
123106
else if (object["type"] == "LASER")
124107
{
125-
sp::P<Laser> laser = new Laser(root, object["name"].string_value());
126-
laser->setPosition(position);
127-
for(const auto& prop : object["properties"].array_items())
128-
{
129-
if (prop["name"] == "angle")
130-
laser->setAngle(sp::stringutil::convert::toFloat(prop["value"].string_value()));
131-
else
132-
LOG(Warning, "Unknown object property:", prop["name"].string_value(), prop["value"].string_value());
133-
}
108+
obj = new Laser(root, object["name"].string_value());
109+
obj->setPosition(position);
134110
}
135111
else if (object["type"] == "TRIGGER")
136112
{
@@ -144,25 +120,12 @@ void loadLevel(sp::P<sp::Node> root, sp::string name)
144120
source = target.substr(0, target.find(":"));
145121
target = target.substr(target.find(":") + 1);
146122
}
147-
new Trigger(root, sp::Rect2d(position.x, position.y + h / th, w / tw, -h / th), source, target);
123+
obj = new Trigger(root, sp::Rect2d(position.x, position.y + h / th, w / tw, -h / th), source, target);
148124
}
149125
else if (object["type"] == "TIMER")
150126
{
151127
sp::string target = object["name"].string_value();
152-
sp::P<Timer> timer = new Timer(root, target);
153-
for(const auto& prop : object["properties"].array_items())
154-
{
155-
if (prop["name"] == "delay")
156-
timer->on_time = timer->off_time = sp::stringutil::convert::toFloat(prop["value"].string_value()) * 60.0;
157-
else if (prop["name"] == "on_delay")
158-
timer->on_time = sp::stringutil::convert::toFloat(prop["value"].string_value()) * 60.0;
159-
else if (prop["name"] == "off_delay")
160-
timer->on_time = sp::stringutil::convert::toFloat(prop["value"].string_value()) * 60.0;
161-
else if (prop["name"] == "start_delay")
162-
timer->trigger_delay = sp::stringutil::convert::toFloat(prop["value"].string_value()) * 60.0;
163-
else
164-
LOG(Warning, "Unknown object property:", prop["name"].string_value(), prop["value"].string_value());
165-
}
128+
obj = new Timer(root, target);
166129
}
167130
else if (object["type"] == "GRAVITY")
168131
{
@@ -173,6 +136,11 @@ void loadLevel(sp::P<sp::Node> root, sp::string name)
173136
{
174137
LOG(Warning, "Unknown object type:", object["type"].string_value());
175138
}
139+
if (obj)
140+
{
141+
for(const auto& prop : object["properties"].array_items())
142+
obj->setProperty(prop["name"].string_value(), prop["value"].string_value());
143+
}
176144
}
177145
}
178146

@@ -207,4 +175,4 @@ sp::P<sp::Node> addDecoration(sp::P<sp::Node> root, sp::Vector2d position, sp::V
207175
node->render_data.texture = sp::texture_manager.get("decorations/" + name + ".png");
208176
node->setPosition(sp::Vector2d(position.x + coordinate_size.x / 2, position.y)); //Centered around middle of rectangle.
209177
return node;
210-
}
178+
}

src/levelObject.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#include "levelObject.h"
2+
3+
#include <sp2/logging.h>
4+
5+
LevelObject::LevelObject(sp::P<sp::Node> parent)
6+
: sp::Node(parent)
7+
{
8+
}
9+
10+
void LevelObject::setProperty(sp::string name, sp::string value)
11+
{
12+
LOG(Warning, "Setting unknown propert", name, "to", value, "on", this);
13+
}

src/levelObject.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#ifndef LEVEL_OBJECT_H
2+
#define LEVEL_OBJECT_H
3+
4+
#include <sp2/scene/node.h>
5+
6+
class LevelObject : public sp::Node
7+
{
8+
public:
9+
LevelObject(sp::P<sp::Node> parent);
10+
11+
virtual void setProperty(sp::string name, sp::string value);
12+
};
13+
14+
#endif//LEVEL_OBJECT_H

src/physicsObject.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66

77
PhysicsObject::PhysicsObject(sp::P<sp::Node> parent, sp::string name)
8-
: sp::Node(parent)
8+
: LevelObject(parent)
99
{
1010
LineNodeBuilder builder;
1111
builder.loadFrom(name + ".json", 1.5);
@@ -18,3 +18,13 @@ void PhysicsObject::onFixedUpdate()
1818
velocity += level_info.getGravityAt(getPosition2D());
1919
setLinearVelocity(velocity);
2020
}
21+
22+
void PhysicsObject::setProperty(sp::string name, sp::string value)
23+
{
24+
if (name == "GOAL" && value == "TARGET")
25+
is_goal = true;
26+
else if (name == "velocity")
27+
setLinearVelocity(sp::stringutil::convert::toVector2d(value));
28+
else
29+
LevelObject::setProperty(name, value);
30+
}

src/physicsObject.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
#ifndef PHYSICS_OBJECT_H
22
#define PHYSICS_OBJECT_H
33

4-
#include <sp2/scene/node.h>
4+
#include "levelObject.h"
55

6-
class PhysicsObject : public sp::Node
6+
class PhysicsObject : public LevelObject
77
{
88
public:
99
PhysicsObject(sp::P<sp::Node> parent, sp::string name);
1010

1111
virtual void onFixedUpdate() override;
1212

13-
void setAsGoalObject() { is_goal = true; }
13+
virtual void setProperty(sp::string name, sp::string value) override;
14+
1415
bool isGoal() { return is_goal; }
1516
private:
1617
bool is_goal = false;

src/spaceship.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111

1212
Spaceship::Spaceship(sp::P<sp::Node> parent)
13-
: sp::Node(parent)
13+
: LevelObject(parent)
1414
{
1515
LineNodeBuilder builder;
1616
builder.loadFrom("ship-a.json", 1.5);

src/spaceship.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
#ifndef SPACESHIP_H
22
#define SPACESHIP_H
33

4-
#include <sp2/scene/node.h>
4+
#include "levelObject.h"
55
#include <sp2/scene/particleEmitter.h>
66

77
class Controls;
88
class GrablingRope;
9-
class Spaceship : public sp::Node
9+
class Spaceship : public LevelObject
1010
{
1111
public:
1212
Spaceship(sp::P<sp::Node> parent);

src/timer.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99

1010
Timer::Timer(sp::P<sp::Node> parent, sp::string target)
11-
: sp::Node(parent), target(target)
11+
: LevelObject(parent), target(target)
1212
{
1313
}
1414

@@ -37,3 +37,17 @@ void Timer::onFixedUpdate()
3737
trigger_delay = on_time;
3838
}
3939
}
40+
41+
void Timer::setProperty(sp::string name, sp::string value)
42+
{
43+
if (name == "delay")
44+
on_time = off_time = sp::stringutil::convert::toFloat(value) * 60.0;
45+
else if (name == "on_delay")
46+
on_time = sp::stringutil::convert::toFloat(value) * 60.0;
47+
else if (name == "off_delay")
48+
off_time = sp::stringutil::convert::toFloat(value) * 60.0;
49+
else if (name == "start_delay")
50+
trigger_delay = sp::stringutil::convert::toFloat(value) * 60.0;
51+
else
52+
LevelObject::setProperty(name, value);
53+
}

src/timer.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,25 @@
11
#ifndef TIMER_H
22
#define TIMER_H
33

4-
#include <sp2/scene/node.h>
4+
#include "levelObject.h"
55
#include <sp2/math/rect.h>
66

77

8-
class Timer : public sp::Node
8+
class Timer : public LevelObject
99
{
1010
public:
1111
Timer(sp::P<sp::Node> parent, sp::string target);
1212

1313
virtual void onFixedUpdate() override;
1414

15+
virtual void setProperty(sp::string name, sp::string value) override;
16+
17+
private:
18+
sp::string target;
19+
1520
int on_time = 60;
1621
int off_time = 60;
1722
int trigger_delay = 0;
18-
private:
19-
sp::string target;
2023

2124
bool active = false;
2225
};

src/trigger.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77

88
Trigger::Trigger(sp::P<sp::Node> parent, sp::Rect2d area, sp::string source, sp::string target)
9-
: sp::Node(parent), area(area), source(source), target(target)
9+
: LevelObject(parent), area(area), source(source), target(target)
1010
{
1111
initialized = false;
1212
active = false;
@@ -72,3 +72,8 @@ void Trigger::onFixedUpdate()
7272
}
7373
}
7474
}
75+
76+
void Trigger::setProperty(sp::string name, sp::string value)
77+
{
78+
LevelObject::setProperty(name, value);
79+
}

src/trigger.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
#ifndef TRIGGER_H
22
#define TRIGGER_H
33

4-
#include <sp2/scene/node.h>
4+
#include "levelObject.h"
55
#include <sp2/math/rect.h>
66

77

8-
class Trigger : public sp::Node
8+
class Trigger : public LevelObject
99
{
1010
public:
1111
Trigger(sp::P<sp::Node> parent, sp::Rect2d area, sp::string source, sp::string target);
1212

1313
virtual void onFixedUpdate() override;
1414

15+
virtual void setProperty(sp::string name, sp::string value) override;
1516
private:
1617
sp::Rect2d area;
1718
sp::string source;

src/triggerableNode.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,8 @@ void TriggerableNode::triggerSubstract()
1313
if (!trigger_counter)
1414
onUnTrigger();
1515
}
16+
17+
void TriggerableNode::setProperty(sp::string name, sp::string value)
18+
{
19+
LevelObject::setProperty(name, value);
20+
}

0 commit comments

Comments
 (0)