MOD(追加要素)が作れるゲーム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Aozora0630
記事: 85
登録日時: 9年前
住所: 日本
連絡を取る:

MOD(追加要素)が作れるゲーム

#1

投稿記事 by Aozora0630 » 9年前

こんにちわ。
今回、ふと思ったことを質問させていただきます。

私は良く、C++のDxLibでゲームを作るのですが、マインクラフトなどのように、作ったゲームに第三者が新要素を追加できるようにする為には、どんな方法があるのでしょうか?
(つまりMODを追加できるゲームの作り方ということです。)

私が思いついたのは、
・ゲームの処理をDLLに任せて追加要素はDLLを摩り替える。(追加要素が一つしか入れられない。)
・アイテムなどのデータを別ファイルにまとめてゲーム実行時に読み込む。(ゲームを本格的に変更することは出来ない。(例えばUIを変える追加要素など。))

回答お願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: MOD(追加要素)が作れるゲーム

#2

投稿記事 by softya(ソフト屋) » 9年前

俗にいうプラグイン方式ではどうでしょうか?
MOD用のAPIを用意して、APIに準拠したDLLをpluginファルダに入れてもらって起動時に読み込む方式です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Aozora0630
記事: 85
登録日時: 9年前
住所: 日本
連絡を取る:

Re: MOD(追加要素)が作れるゲーム

#3

投稿記事 by Aozora0630 » 9年前

softya(ソフト屋) さんが書きました:俗にいうプラグイン方式ではどうでしょうか?
MOD用のAPIを用意して、APIに準拠したDLLをpluginファルダに入れてもらって起動時に読み込む方式です。
むむっ!
初めて聴いた方式ですね。調べてみます。回答ありがとう御座います。

Aozora0630
記事: 85
登録日時: 9年前
住所: 日本
連絡を取る:

Re: MOD(追加要素)が作れるゲーム

#4

投稿記事 by Aozora0630 » 9年前

すみません。プラグイン方式についてググって見たのですが、なかなか詳しく乗っているサイトが無いのでサイトを教えていただけますか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: MOD(追加要素)が作れるゲーム

#5

投稿記事 by softya(ソフト屋) » 9年前

ツールなどでよくある拡張プラグインの方式ですよ。
LoadLibrary/LoadLibraryExを使います。
https://msdn.microsoft.com/ja-jp/library/cc429241.aspx
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あごみつ
記事: 17
登録日時: 9年前

Re: MOD(追加要素)が作れるゲーム

#6

投稿記事 by あごみつ » 9年前

こんにちは
softya さんのおっしゃることを Minecraft を例に具体的に説明します
(俺は Minecraft の実装は知らないので関数などはかなり適当です)

例えば新しいブロックを追加したい時には、そのブロックの性質を記述する必要がありますよね
どのテクスチャを貼ればよいのか、どのくらいの硬さなのか、壊した時にどのアイテムをドロップするのか、などゲーム側で元々用意されているインターフェースを実装するのがこれに当たります

コード:

class MyBlock // 新しく追加したいブロック
	: public Block // Minecraft 側で用意されているクラス
{
public:
	MyBlock(void)
	{
		setHardness(1.0); // 恐らく硬さを設定する関数は Block に用意されている
	}

	int idDropped(void) override; // 壊した時にドロップするアイテムのidを返す
	int getTexture(int /* ブロックは6面あるので欲しい面の番号 */) override; // テクスチャのidを返す
};
そして、MyBlock を追加する MOD を登録するために、同様に MOD のインターフェースを実装していきます

コード:

class MyMod
	: public Mod
{
public:
	void load(void) // MOD の読み込み時に呼ばれる関数
	{
		addBlock(new MyBlock); // addBlock(Block*) 関数でブロックを追加できる
	}
};

Mod* getMod(void) // ゲーム側は dll を読み込むとこの関数を呼ぶ
{
	return new MyMod;
}
後はこいつを dll にコンパイルして決められたディレクトリ(plugins など)に配置してやります
するとゲーム側は起動時に plugins ディレクトリを走査して dll を読み込み実行してくれるという段取りになります

[hr]
参考になりそうなサイトを紹介しておきます
ガラクタ置き場: ここのプラグイン・プログラミングというシリーズをご覧ください

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: MOD(追加要素)が作れるゲーム

#7

投稿記事 by h2so5 » 9年前

いちおう補足しておくとMinecraftはMODに対応しているわけではありません。
MinecraftのMODはユーザーが勝手にJavaバイトコードを逆コンパイルして改造しているだけです。
MinecraftのMODの自由度が高いのは勝手に改造されてるからであって、Minecraftの機能とは関係ありません。

身も蓋もないですが、ユーザーに自由に拡張してほしいならソースコードを公開するのが手っ取り早いということになります。

Aozora0630
記事: 85
登録日時: 9年前
住所: 日本
連絡を取る:

Re: MOD(追加要素)が作れるゲーム

#8

投稿記事 by Aozora0630 » 9年前

成る程・・・。
応えてくださった方、ありがとう御座いました。
今度作るゲームの参考にさせていただきます。
h2so5 さんが書きました:いちおう補足しておくとMinecraftはMODに対応しているわけではありません。
MinecraftのMODはユーザーが勝手にJavaバイトコードを逆コンパイルして改造しているだけです。
MinecraftのMODの自由度が高いのは勝手に改造されてるからであって、Minecraftの機能とは関係ありません。

身も蓋もないですが、ユーザーに自由に拡張してほしいならソースコードを公開するのが手っ取り早いということになります。
そうだったんですか・・・。
回答ありがとう御座いました。

閉鎖

“C言語何でも質問掲示板” へ戻る