|
|
@@ -8,6 +8,8 @@
|
|
|
|
|
|
#include "danmaku/level.hpp"
|
|
|
|
|
|
+#include <json/json.h>
|
|
|
+
|
|
|
#include "danmaku/actor.hpp"
|
|
|
#include "danmaku/bullet.hpp"
|
|
|
#include "danmaku/player.hpp"
|
|
|
@@ -16,7 +18,30 @@
|
|
|
|
|
|
using namespace danmaku;
|
|
|
|
|
|
-level::level() : engine::scene(""), player_() {}
|
|
|
+std::vector<std::unique_ptr<actor>>
|
|
|
+get_wave(Json::Value const & json, graphics::manager const & manager) {
|
|
|
+ std::vector<std::unique_ptr<actor>> out;
|
|
|
+ for (int i = 0; i < json.size(); ++i) {
|
|
|
+ // TODO
|
|
|
+ out.emplace_back(nullptr);
|
|
|
+ }
|
|
|
+ return out;
|
|
|
+}
|
|
|
+
|
|
|
+std::deque<std::vector<std::unique_ptr<actor>>>
|
|
|
+get_waves(Json::Value const & json, graphics::manager const & manager) {
|
|
|
+ std::deque<std::vector<std::unique_ptr<actor>>> out;
|
|
|
+ for (int i = 0; i < json.size(); ++i) {
|
|
|
+ out.emplace_back(get_wave(json[i], manager));
|
|
|
+ }
|
|
|
+ return out;
|
|
|
+}
|
|
|
+
|
|
|
+level::level(Json::Value const & json,
|
|
|
+ std::shared_ptr<engine::game_dispatch> dispatch)
|
|
|
+ : engine::scene(json["id"].asString(), dispatch),
|
|
|
+ player_(), wave_timer_{json["timeBetweenWaves"].asFloat()},
|
|
|
+ waves_(get_waves(json["waves"], graphics_manager())) {}
|
|
|
|
|
|
level::~level() {}
|
|
|
|
|
|
@@ -26,6 +51,7 @@ void level::add_bullet(bullet b) {
|
|
|
}
|
|
|
|
|
|
void level::update(float delta) {
|
|
|
+
|
|
|
for (auto & a : actors_) {
|
|
|
a->update(delta);
|
|
|
}
|
|
|
@@ -41,6 +67,17 @@ void level::update(float delta) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void level::update_waves(float delta) {
|
|
|
+ if (waves_.empty()) { return; }
|
|
|
+ if ((wave_timer_.remainder -= delta) <= 0.f) {
|
|
|
+ for (auto & actor : waves_.front()) {
|
|
|
+ actor->level(this);
|
|
|
+ actors_.emplace_back(std::move(actor));
|
|
|
+ }
|
|
|
+ waves_.pop_front();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void level::render(graphics::renderer & renderer) {
|
|
|
for (auto & a : actors_) {
|
|
|
renderer.draw(a->render_info());
|