C++側クラスのメンバ変数のLua側への公開について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
みーや

C++側クラスのメンバ変数のLua側への公開について

#1

投稿記事 by みーや » 9年前

私は今、ノベルゲームをC++とDXライブラリで作っており、
次回作(RPGの予定)の実装練習も兼ねてLuaを使っています。

Luaを使う前はC++、DXライブラリだけで作っていたので、
今は既存C++コードをLuaに置き換える作業を行っています。

ちなみに、「スクリプト言語による効率的ゲーム開発 LuaとC/C++連携プログラミング」という本と、
「Programming in Lua プログラミング言語Lua公式解説書」という本を参考にしています。

そこで、ぶち当たった問題なのですが、以下のようなLuaによる置き換え前のC++プログラムがあり、
クラスSeqTitleのプライベートメンバ変数mSelectedをLua側スクリプトで読み書きしたいと思っています。

※以下のクラスを丸ごとLuaスクリプトに置き換えるのではなく、
 processInputメソッドの中身をLuaスクリプト内に記述したLua関数(processInputの処理を行う)を呼ぶコードに
 置き換えようと思っています。

その際に、Luaスクリプト内に用意したprocessInput代替関数から、メンバ変数mSelectedを参照したり、
書き換えたりしたいのですが、どうしたらよいでしょうか。

本の場合、セッター、ゲッター関数を用意し、それをLua側に公開していたのですが、
その本では変数がグローバル変数だったので、今回のようなメンバ変数の場合は適用できないと考えました。
実際、そのメンバ変数を参照できるのはクラス内だけなので、クラス内にセッター、ゲッター関数を用意しなければ
ならないが、それだとLua側にlua_register関数などで公開できない。

何か良い方法はないでしょうか。よろしくお願いします。

コード:

class SeqTitle
{
private:
	int mSelected = 0;
	double mElapsedTime;	//seconds

	SeqChangeData processInput()
	{
		InputManager ipm = InputManager::instance();

		//マウス処理
		//ボタンにマウスが乗った状態で上下キー押しても移動しないのはどうにかしたい(後で)→実装済み
		//ボタン上でクリックされた場合フラグを立てる
		bool clickFlag = false;
		int mx, my;
		GetMousePoint(&mx, &my);
		for (int i = 0; i < 3; i++)
		{
			if (gConstants[L"HAJIMEKARA_IMAGE_X"] <= mx && mx <= gConstants[L"HAJIMEKARA_IMAGE_X"] + 150
				&& gConstants[L"HAJIMEKARA_IMAGE_Y"] + (gConstants[L"HAJIMEKARA_IMAGE_INTERVAL_Y"] * i) <= my
				&& my <= gConstants[L"HAJIMEKARA_IMAGE_Y"] + (gConstants[L"HAJIMEKARA_IMAGE_INTERVAL_Y"] * i) + 35)
			{
				mSelected = i;
				if (ipm.hitMouseKey(MOUSE_INPUT_LEFT))
				{
					clickFlag = true;
				}
			}
		}
以下略

yuni

Re: C++側クラスのメンバ変数のLua側への公開について

#2

投稿記事 by yuni » 9年前

こんばんは。
Selected変数をパブリックにできない、という理由がちょっとわかりかねますが、
出来ないな、と思ったときは素直に別のアプローチを探すのも手かと思います。

例えば、(ざっくりした対応ですが)選択肢やゲーム中のフラグだけを管理しておく
GlobalEventFlagManager、という存在を作って、
その変数をグローバル変数として置いておきLua側に公開する、という手もあります。
(Luaってポインタ渡しは対応してましたよね?)

コード:

// GlobalFlagManager.h
// フラグたちを管理
class GlobalEventFlagManager { ... };
// 実体は1つだけのポインタ(なにかクラスで囲んであげてもいいです)
static GlobalEventFlagManager* flgManager=NULL;
// ここまでヘッダ定義

// main
int main()
{
 // instance
 GlobalEventFlagManager instance;
 instance.init()
 // どこからでも使えるように設定
 flgManager = &instance;
 
 // lua に公開するのはグローバルにずっと存在するポインタの方
 SetFlagManager(flgManager);
 
 // ゲームループ
 
 // 終わり
 instance.finalize();
 flgManager = NULL;
 return 0;
}
フラグさえ見れればイベントの起きる、起きないがわかりますし、
ノベルゲームであれば1章の第一選択肢でSelected=0を選んだか、などが
後から必要になるかもしれません。
そんな時にはこのマネージャーに聞けば解決するはずです。
NULLアクセスはしないようお気を付けて。

yuni

Re: C++側クラスのメンバ変数のLua側への公開について

#3

投稿記事 by yuni » 9年前

(ちなみに、Luaからであればフラグ操作するための関数を公開してフラグ操作したりするほうが一般的かもです。参考までに…)

みーや

Re: C++側クラスのメンバ変数のLua側への公開について

#4

投稿記事 by みーや » 9年前

yuniさん、回答ありがとうございます。

ポインタが使えるとは知りませんでした。

とても勉強になりました。ありがとうございます。

閉鎖

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