Edited at
DxLibDay 8

自作のノベルゲームエンジンを作ってみた


はじめに

この記事は、DxLib Advent Calendar 2018 の8日目の記事です

僕が代表を務めているゲームリンクスで使用することを目的に制作したノベルゲームエンジン「LINKS」について書きます


つくったもの

これらをDxLibを使い作りましたー

Novel.Game.Engine.LINKS(C版)

Novel.Game.Engine.LINKS.for.CPP(C++版)

実際のデモは以下のような感じです

links.gif

C版LINKSに関してはyumetodoせんせーからのPull Requestなどを受けつつリファクタリングしてたり

C++版LINKSはそのあとにC++で実装しなおしてみたものになります。


実装のあれこれ

一応は、ノベルゲームのエンジンをうたっているので各種素材を読み込む処理を実装しています


#include "ConstantExpressionVariable.hpp"
#include <vector>
#include <string>
#include <array>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <boost/filesystem.hpp>
#include <boost/range/iterator_range.hpp>

namespace fs = boost::filesystem;

namespace {

//各素材ファイルパス取得
const std::vector<std::string> AllFilePath(const std::string& Path) {

std::vector<std::string> Container;

const fs::path path(Path);

for (const auto& p : boost::make_iterator_range(fs::recursive_directory_iterator(path), {})) {
if (!fs::is_directory(p.path()))
Container.emplace_back(std::move(Path + "/" + p.path().filename().string()));
}

return Container;
}
}

//各種素材読込テンプレート関数
template <typename T, typename Func>
constexpr std::vector<T> MaterialLoad(std::vector<T> Material, const std::string& Path, Func&& Loader) noexcept {

//サウンドデータの読み込み形式
DxLib::SetCreateSoundDataType(DX_SOUNDDATATYPE_MEMPRESS);

std::vector<std::string> Container = AllFilePath(Path);

for (auto&& c : Container)
Material.emplace_back(std::move(Loader(c.c_str())));

return Material;
}

ちなみにこれはC++版LINKSでBoostを使って実装した部分になります

ファイルパスを渡し、その中にある全てのファイルへのパスを格納させています。

そのあとラムダ式:Loaderで受け取ったパスを使い、各種素材を読み込むようにしています


今後

今後としては、もうちょい機能拡充を図るか高速化を図るかといったところかなぁと

あとは、LINKS使ってのフリーゲーム制作とかどんどんやっていきたいなと思います