HSP3において、モジュールは大変便利な機能ですが、公式の解説だけでは中々理解するのが難しいものでした。
自身へのメモも込めて、モジュールについて記載したいと思います。
一般的な「モジュール」は、下記のような形で定義します。
こうすることで、変数が独立して管理され、コードの再利用性が高まるというものです。割とHSPの制作者には浸透して使われていると思われます。
#module モジュール名称
~~色々処理
#global
「モジュール変数」と「モジュール型変数」は、似て非なる概念となります。
「モジュール」そのものとも違う概念なので、しっかり切り分けて理解が必要です。
//モジュール名称に指定した名前の構造体
//モジュール変数は、その構造体のメンバ変数といえます。
#module モジュール名称 モジュール変数1,モジュール変数2
#modfunc local モジュール命令
return
#global
//メインプログラム
newmod モジュール型変数,モジュール名称
モジュール変数は、作成したモジュールのメンバ変数を意味し、
モジュール型変数は、モジュールそのものが配列で管理されたものといえます。
ほかの言語で言えば、「クラス」機能に近いですが、同じではありません。
しかし、オブジェクト指向に近い記述と管理ができるのは大いに利用価値があります。
メリット:メインプログラムから、ゲームのキャラクター、敵、弾などを分離して管理することができます。これにより、変数が重複したりすることを防げます。バグが減ります。コードの再利用性も高まります。
メインプログラムには、モジュールの初期化、更新処理をloopで指定することでコードを簡素化することができます。
#include "モジュール.hsp"
//メインプログラム
newmod モジュール型変数,モジュール名称
*main
redraw 0
foreach モジュール型変数
モジュール命令@モジュール名 モジュール型変数(cnt)
loop
redraw 1
await 16
*goto main
これです。このforeach~loopが最高によいのです。
モジュールがどんなに増えても、メインプログラムはこのforeachが増えていくだけで、コードの可読性が一気にアップします。
サンデープログラマは、しばらく間をあけてプログラムを再開することも多いですが、思い出すのもすごく楽ちんです。だって部分部分で完結させられるから。
イマイチ人気が無いモジュール変数とモジュール型変数ですが、絶対マスターしたほうが楽しくなりますよ!!!
説明が不十分なので、今後も加筆していきたいと思います。
あ~~~~伝わらないなぁ~~~( ;∀;)
---------------------------------------------------------------------------------------------------------------
補足★
#modfunc local モジュール命令
return
上記のモジュール命令に「local」キーワードがついています。こうすることで、同じ名前の命令を別のモジュールで使用できます。ただし命令の後に「@モジュール名」を指定してやる必要があります。
(マニュアルに一切記述がありません。。。)
たとえば、updateという命令をあらゆるモジュールに作成して共通化しておくことで非常に見やすくなります。
foreach モジュール型変数A: update@モジュールA モジュール型変数A(cnt) :loop
foreach モジュール型変数B: update@モジュールB モジュール型変数B(cnt) :loop
foreach モジュール型変数C: update@モジュールC モジュール型変数C(cnt) :loop
あたらしいモジュール(機能やキャラ)が増えても、上記の種類を増やすだけ
補足2★
モジュール内の「deffunc命令」と「modfunc命令」の違い
deffuncは、モジュール変数(メンバ変数)へ基本的にアクセスすることができません。モジュール全体の処理や共通する処理などが適しています。
modfuncは、モジュール変数(メンバ変数)へアクセスできます。各キャラクター一つ一つのxy座標などの処理を行うのに適しています。
参考外部リンク: