こんにちわ。
今回、ふと思ったことを質問させていただきます。
私は良く、C++のDxLibでゲームを作るのですが、マインクラフトなどのように、作ったゲームに第三者が新要素を追加できるようにする為には、どんな方法があるのでしょうか?
(つまりMODを追加できるゲームの作り方ということです。)
私が思いついたのは、
・ゲームの処理をDLLに任せて追加要素はDLLを摩り替える。(追加要素が一つしか入れられない。)
・アイテムなどのデータを別ファイルにまとめてゲーム実行時に読み込む。(ゲームを本格的に変更することは出来ない。(例えばUIを変える追加要素など。))
回答お願いします。
MOD(追加要素)が作れるゲーム
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: MOD(追加要素)が作れるゲーム
俗にいうプラグイン方式ではどうでしょうか?
MOD用のAPIを用意して、APIに準拠したDLLをpluginファルダに入れてもらって起動時に読み込む方式です。
MOD用のAPIを用意して、APIに準拠したDLLをpluginファルダに入れてもらって起動時に読み込む方式です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 85
- 登録日時: 9年前
- 住所: 日本
- 連絡を取る:
Re: MOD(追加要素)が作れるゲーム
むむっ!softya(ソフト屋) さんが書きました:俗にいうプラグイン方式ではどうでしょうか?
MOD用のAPIを用意して、APIに準拠したDLLをpluginファルダに入れてもらって起動時に読み込む方式です。
初めて聴いた方式ですね。調べてみます。回答ありがとう御座います。
-
- 記事: 85
- 登録日時: 9年前
- 住所: 日本
- 連絡を取る:
Re: MOD(追加要素)が作れるゲーム
すみません。プラグイン方式についてググって見たのですが、なかなか詳しく乗っているサイトが無いのでサイトを教えていただけますか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: MOD(追加要素)が作れるゲーム
ツールなどでよくある拡張プラグインの方式ですよ。
LoadLibrary/LoadLibraryExを使います。
https://msdn.microsoft.com/ja-jp/library/cc429241.aspx
LoadLibrary/LoadLibraryExを使います。
https://msdn.microsoft.com/ja-jp/library/cc429241.aspx
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: MOD(追加要素)が作れるゲーム
こんにちは
softya さんのおっしゃることを Minecraft を例に具体的に説明します
(俺は Minecraft の実装は知らないので関数などはかなり適当です)
例えば新しいブロックを追加したい時には、そのブロックの性質を記述する必要がありますよね
どのテクスチャを貼ればよいのか、どのくらいの硬さなのか、壊した時にどのアイテムをドロップするのか、などゲーム側で元々用意されているインターフェースを実装するのがこれに当たります
そして、MyBlock を追加する MOD を登録するために、同様に MOD のインターフェースを実装していきます
後はこいつを dll にコンパイルして決められたディレクトリ(plugins など)に配置してやります
するとゲーム側は起動時に plugins ディレクトリを走査して dll を読み込み実行してくれるという段取りになります
[hr]
参考になりそうなサイトを紹介しておきます
ガラクタ置き場: ここのプラグイン・プログラミングというシリーズをご覧ください
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を返す
};
class MyMod
: public Mod
{
public:
void load(void) // MOD の読み込み時に呼ばれる関数
{
addBlock(new MyBlock); // addBlock(Block*) 関数でブロックを追加できる
}
};
Mod* getMod(void) // ゲーム側は dll を読み込むとこの関数を呼ぶ
{
return new MyMod;
}
するとゲーム側は起動時に plugins ディレクトリを走査して dll を読み込み実行してくれるという段取りになります
[hr]
参考になりそうなサイトを紹介しておきます
ガラクタ置き場: ここのプラグイン・プログラミングというシリーズをご覧ください
Re: MOD(追加要素)が作れるゲーム
いちおう補足しておくとMinecraftはMODに対応しているわけではありません。
MinecraftのMODはユーザーが勝手にJavaバイトコードを逆コンパイルして改造しているだけです。
MinecraftのMODの自由度が高いのは勝手に改造されてるからであって、Minecraftの機能とは関係ありません。
身も蓋もないですが、ユーザーに自由に拡張してほしいならソースコードを公開するのが手っ取り早いということになります。
MinecraftのMODはユーザーが勝手にJavaバイトコードを逆コンパイルして改造しているだけです。
MinecraftのMODの自由度が高いのは勝手に改造されてるからであって、Minecraftの機能とは関係ありません。
身も蓋もないですが、ユーザーに自由に拡張してほしいならソースコードを公開するのが手っ取り早いということになります。
-
- 記事: 85
- 登録日時: 9年前
- 住所: 日本
- 連絡を取る:
Re: MOD(追加要素)が作れるゲーム
成る程・・・。
応えてくださった方、ありがとう御座いました。
今度作るゲームの参考にさせていただきます。
回答ありがとう御座いました。
応えてくださった方、ありがとう御座いました。
今度作るゲームの参考にさせていただきます。
そうだったんですか・・・。h2so5 さんが書きました:いちおう補足しておくとMinecraftはMODに対応しているわけではありません。
MinecraftのMODはユーザーが勝手にJavaバイトコードを逆コンパイルして改造しているだけです。
MinecraftのMODの自由度が高いのは勝手に改造されてるからであって、Minecraftの機能とは関係ありません。
身も蓋もないですが、ユーザーに自由に拡張してほしいならソースコードを公開するのが手っ取り早いということになります。
回答ありがとう御座いました。