HSP公式BBS投稿文章:HSPのオブジェクト思考に関する議論のスレッド:その3

こんばんわ。ここのスレッドではお久しぶりでございます
自分は今回のプロコン向け作品が未完成で
資料として投稿いたしまして
そこよりテンプレートもどきの引用でございます


/////////////////////////////////////////////////////////////
//
// HSPモジュール機能。テンプレートもどき
//
/////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////
// #deffunc/#defcfunc の覚え書き
/////////////////////////////////////////////////////////////

#deffunc/#defcfunc スペース モジュール命令名 スペース 型 スペース 引数A "," 型 スペース 引数B・・・

関数/命令名と引数Aの型の区切りはスペース
引数Aの型と引数Aの名前の区切りもスペース
引数Aの名前と引数Bの型の区切りは ","

型の種類
int、整数値(値渡し)
str、文字列(値渡し)
double、実数(値渡し)
var、変数(参照渡し)
array、配列(参照渡し)
label、ラベル
local、ローカル変数

関数は値を渡す変数に代入していないとエラー
関数の引数は()で括っていないとエラー 

/////////////////////////////////////////////////////////////
// モジュール/モジュール変数の覚え書き
/////////////////////////////////////////////////////////////

トークンの区切りはスペースと "," があるのでややこしい

/////////////////////////////////////////////////////////////
// "#module"
/////////////////////////////////////////////////////////////

"#module" スペース モジュール名 スペース モジュール変数 "," モジュール変数・・・

例 #module m a,b,c・・・

モジュール名と第一変数の区切りはスペースだが
第一変数と第二変数の区切りは ","

/////////////////////////////////////////////////////////////
// "#modinit"
/////////////////////////////////////////////////////////////

モジュールのコンストラクタは "#modinit"命令

"#modinit" スペース 型 スペース 引数A "," 型 スペース 引数B・・・

#modinit int l,int n,int m・・・

命令の名前は不要
"#modinit"と引数Aの型の区切りはスペース
引数Aの型と引数Aの名前の区切りもスペース
引数Aの名前と引数Bの型の区切りは ","

/////////////////////////////////////////////////////////////
// "#modfunc"
/////////////////////////////////////////////////////////////

モジュール命令の定義は "#modfunc"命令

"#modfunc" スペース モジュール命令名 スペース 型 スペース 引数A "," 型 スペース 引数B・・・

例 #modfunc mf int l,int n,int m・・・

モジュール命令名と引数Aの型の区切りはスペース
引数Aの型と引数Aの名前の区切りもスペース
引数Aの名前と引数Bの型の区切りは ","

"#modcfunc"
"#modcfunc" スペース モジュール命令名 スペース 型 スペース 引数A "," 型 スペース 引数B・・・

例 #modcfunc mf int l,int n,int m・・・

モジュール命令名と引数Aの型の区切りはスペース
引数Aの型と引数Aの名前の区切りもスペース
引数Aの名前と引数Bの型の区切りは ","

/////////////////////////////////////////////////////////////
// "newmod"命令
/////////////////////////////////////////////////////////////

オブジェクトの作成は"newmod"命令

"newmod" スペース オブジェクト名 "," モジュール名 "," 引数A "," 引数B・・・

例 newmod o,m,1,2,3・・・

オブジェクトを"newmod"命令で作成しないとモジュール命令は使用できない
"newmod" と オブジェクト名 の区切りはスペース
オブジェクト名と モジュール名 の区切りは ","

/////////////////////////////////////////////////////////////
// "newmod" モジュール変数版
/////////////////////////////////////////////////////////////

newmodで作成するオブジェクトをモジュール変数とすることで委譲が出来る

"newmod" スペース モジュール変数 "," 委譲のモジュール名 "," 引数A "," 引数B・・・

例 newmod mem_obj_m_somet,one_something

/////////////////////////////////////////////////////////////
// モジュール命令の使用
/////////////////////////////////////////////////////////////

モジュール命令 スペース オブジェクト名 "," 引数A "," 引数B・・・

例 mf o,1,2,3・・・

モジュール命令 と オブジェクト名 の 区切りは スペース
オブジェクト名 と 引数 の 区切りは スペース

/////////////////////////////////////////////////////////////
// モジュール関数の使用
/////////////////////////////////////////////////////////////

モジュール命令 "(" オブジェクト名 "," 引数A "," 引数B・・・")"

例 mf(o,1,2,3・・・)

モジュール命令 と オブジェクト名 の 区切りは "("
オブジェクト名 と 引数 の 区切りは スペース
最後の 区切りは ")"

/////////////////////////////////////////////////////////////
// local キーワード
/////////////////////////////////////////////////////////////

#modfuncとか local 命令名

例 #modfunc local hoge

/////////////////////////////////////////////////////////////
// "thismod" キーワード
/////////////////////////////////////////////////////////////

"thismod"キーワードは"#modfunc"の中で
同じモジュール内のモジュール命令を呼び出したい時に
オブジェクト名を指定するかわりに指定する

モジュール外から

mf o,1,2,3・・・

モジュール内から

mf thismod,1,2,3・・・

/////////////////////////////////////////////////////////////
// インスタンスの配列化
/////////////////////////////////////////////////////////////

オブジェクトの作成は"newmod"命令
"newmod" スペース オブジェクト名 "," モジュール名 "," 引数A "," 引数B・・・
を複数回実行する

例
newmod Player,player_chara_status
newmod Player,player_chara_status

/////////////////////////////////////////////////////////////
// 配列化したモジュール変数の使用
/////////////////////////////////////////////////////////////

#modfunc で定義した命令

命令 スペース オブジェクト ドット 配列の添え字
コンマ 引数 の繰り返し 省略しても良い

例
set_mem_ID_many_somet obj_common.tmp_i, 100

#modcfunc で定義した命令

命令 括弧 オブジェクト ドット 配列の添え字
コンマ 引数 の繰り返し省略しても良い
括弧閉じ

例
get_mem_ID_many_somet(obj_common.tmp_i)

配列をドットで記述しているが括弧で記述してもいい気もする
興味のある方は試してみてください

/////////////////////////////////////////////////////////////
// "newmod" モジュール変数版 配列化
/////////////////////////////////////////////////////////////

newmodで作成するオブジェクトをモジュール変数とすることで委譲が出来る
newmodを複数回使用すると配列化出来る

"newmod" スペース モジュール変数 "," 委譲のモジュール名 "," 引数A "," 引数B・・・

例
	repeat MAX_OBJ
		newmod mem_obj_m_somet,one_something
	loop

/////////////////////////////////////////////////////////////
// モジュール変数 アクセサ
/////////////////////////////////////////////////////////////

setter の例
#modfunc  set_mem_ID_data int __p
	mem_ID_data = __p
	return
	
getter の例
#modcfunc get_mem_ID_data
	return mem_ID_data

/////////////////////////////////////////////////////////////
// モジュール変数 アクセサ インデックス使用 モジュール命令
/////////////////////////////////////////////////////////////

一つ一つsetterとgetterを書くのがめんどくさくなって
まとめて書いたサンプルです

例
// #moduleとモジュール変数は一行で記述して下さい
#module wep_class_kaisuu mem_ID_wep, mem_chara_name_wep, wep_kaisuu_nokori, wep_Fire, wep_Fire_cur, wep_Wind, wep_Wind_cur, wep_Thunder, wep_Thunder_cur, wep_Light, wep_light_cur

#enum WEP_KIND_FIRE = 1
#enum WEP_KIND_WIND = 2
#enum WEP_KIND_THUNDER = 3
#enum WEP_KIND_LIGHT = 4
// 略
#modfunc  set_wep_kaisuu int __p, int __p_val
	logmes "set wep kaisuu : " + mem_ID_wep
	if __p == WEP_KIND_FIRE{
		wep_Fire = __p_val : wep_Fire_cur = __p_val
		return	}
	if __p == WEP_KIND_WIND{
		wep_Wind = __p_val : wep_Wind_cur = __p_val
		return	}
	if __p == WEP_KIND_THUNDER{
		wep_Thunder = __p_val : wep_Thunder_cur = __p_val
		return	}
	if __p == WEP_KIND_LIGHT{
		wep_Light = __p_val : 	wep_Light_cur = __p_val
		return	}
	dialog "error:wep_class_kaisuu:set_wep_kaisuu:__p " + __p,1
	return
#modcfunc get_wep_kaisuu int __p
	logmes "wep wep kaisuu : " + mem_ID_wep
	if __p == WEP_KIND_FIRE{	return wep_Fire }
	if __p == WEP_KIND_WIND{	return wep_Wind	}
	if __p == WEP_KIND_THUNDER{	return wep_Thunder	}
	if __p == WEP_KIND_LIGHT{	return wep_Light	}
	dialog "error:wep_class_kaisuu:get_wep_kaisuu:__p " + __p,1
	return
// 略
#global
// 略

/////////////////////////////////////////////////////////////

// 呼び出し例
// インストラクタの例
newmod player_wep,wep_class_kaisuu
// setter使用例
set_wep_kaisuu player_wep.0,1,100
// getter使用例
get_wep_kaisuu(player_wep.0,1)

/////////////////////////////////////////////////////////////
// モジュール変数 アクセサ 委譲
/////////////////////////////////////////////////////////////

setter の例

#modfunc スペース アクセサ命令の名前 スペース int インデックス
コンマ 型 代入したい値
コンマ 型 引数 の繰り返し省略可 改行
委譲元の命令 スペース モジュール変数 ドット 配列の添え字
ドット インデックス コンマ 代入したい値
コンマ 引数 の繰り返し省略可 改行
return

#modfunc  set_mem_ID_somet int __p_index,int __p
	set_mem_ID_somet_mod mem_obj_m_somet.__p_index,__p
	return

getter の例

#modfunc スペース アクセサ命令の名前 スペース int インデックス
コンマ 型 引数 の繰り返し省略可 改行
return 委譲元の命令 括弧 モジュール変数 ドット 配列の添え字
コンマ 引数 の繰り返し 括弧閉じ 改行

#modcfunc get_mem_ID_somet int __p_index
	return get_mem_ID_somet_mod(mem_obj_m_somet.__p_index)

作成したモジュールの委譲がindex付きで操作しているが
indexなしのアクセサ版を作成したければ
試行錯誤してみれば動くと思われる