Home -> HSP講座 -> ラベル配列

ラベル型配列

あまり使われることのない(ような気がする)「ラベル配列」というものを、無責任におすすめしてみます。


#include命令?

HSPの質問掲示板を見ていると、しばしば以下のような質問があります。

次のようなスクリプトを書いて実行したのですが、
	// ステージの番号を選択させる
	number = 3		// この辺はまちまち
	
	// ステージの処理をする
	#include "stage" + number + ".hsp"
次のようなエラーが出てしまい、実行できません。
#OpenHSP script preprocessor ver3.X / onion software 1997-20XX(c)
#Use file [hspdef.as]
#Source file not found.[stage]
#Error: in line 6 [hsptmp]
#Fatal error reported.
スクリプトの line 6 は、#include の行です。
なにがおかしいのでしょうか。

※書いたコードを提示し、出たエラーまでちゃんと書くという、非常に回答しやすい質問

よくある間違いなのですが、これは、プリプロセッサ命令と普通の命令を混同している例です。
もちろん、こんなことはできません。
プリプロセッサ命令が処理されるのはスクリプトを実行するよりも前ですが、そのときに変数 number は存在しないからです。


リストラのススメ

ではどうするかというと、スクリプト stage(N).hsp を実行したいのですから、その中にジャンプ(gotogosub)するのがよいでしょう。
事態をややこしくしているのは、「変数 number の値によって行き先を変える」ということです。
実は、それ専用に on という命令があるのです。やったね!

	// ステージの番号を選択させる
	number = 3		// この辺はテキトー
	
	// ステージの処理をする
	on number, *Stage0, *Stage1, *Stage2, ...

さて!
ラベルをずらずら並べるのが嫌だというあなたへ。
ラベル型配列変数を使ってかっこいいスクリプトにしてみませんか!! (強引な流れ)

	dimtype lbStage, vartype("label")
	
#include "stage0.hsp"
#include "stage1.hsp"
#include "stage2.hsp"
	// ステージの番号を選択させる
	number = 1		// 選び方はなんでも
	
	// ステージの処理をする
	gosub lbStage(number)

WONDERFUL!!br> 見やすさ抜群ですね。(dimtype から目を逸らしながら)
ステージのスクリプトは、以下のような形式にしておきます。

// ステージのスクリプト stage2.hsp

lbStage(2) = *LProcStage2

if (0) {		// *LProcStage2 の中身は、gosub されるまで実行しない
*LProcStage2
	// ステージの処理
	return
}

他の stage(N).hsp も同様

lbStage という配列にラベルをいれておいて、それを必要なときに番号(number)で呼べるようにします。
こういう細かい機能を使ってみるのも楽しいんじゃないでしょうか。

以上、プロパガンダでした。


※追記(2014/02/21)

ステージの番号を定数にするべきでした。詳しくはプリプロセッサ編を参照。
次のようになります。

// main.as

#ifndef __MAIN_AS__	// インクルード・ガード
#define __MAIN_AS__

// ステージの番号に名前をつける
#enum STAGE_ID_TUTORIAL = 0
#enum STAGE_ID_WEST
#enum STAGE_ID_NORTH
#enum STAGE_ID_EAST
#enum STAGE_ID_SOUTH
#enum STAGE_ID_FINAL

#endif
// ステージのスクリプト stage_tutorial.hsp

lbStage(STAGE_ID_TUTORIAL) = *LProcStageTutorial

if (0) {		// *LProcStageTutorial の中身は、gosub されるまで実行しない
*LProcStageTutorial
	// ステージ tutorial の処理
	return
}
// main.hsp

#include "main.as"

	dimtype lbStage, vartype("label")
#include "stage_tutorial.hsp"
#include "stage_west.hsp"
// 以下同様

// 中略

	// ステージの番号を選択させる
	idStage = STAGE_ID_TUTORIAL		// 選び方はなんでも
	
	// ステージの処理をする
	gosub lbStage(idStage)