ユーザー定義のHSP命令・関数の利用 Yahoo!ブックマーク に追加 はてなブックマーク に追加

無料のWindows向けプログラミングツール「HSP」(公式サイト 「HSPTV!」)で、自前の命令や関数を定義してスクリプトから利用 できるようにしてみましょう。

スクリプト内で一定のパターン化した処理がたくさん存在する場合は、処理を1つにまとめる形で新規命令 や新規関数を定義し、モジュール化ておくと便利です。モジュールファイルは他のプログラムのスクリプトにも流用できます。HSP付属リファレンスでは下のファイルで解説されてます。

#deffunc命令

#deffunc命令は新規に命令を定義するプロプロセッサ命令です。
 お題として、位置指定を行うpos命令と文字描画を行うmes指定を合体させた命令とういうのを用意してみましょう。

//	一般的な処理

	pos, 100, 150
	mes "Hello World!"

	pos 50, 250
	mes "Let's HSP!"
//	サブルーチン処理で再現

	moji = "Hello World!"
	itix = 100
	itiy = 150
	gosub *jump

	moji = "Let's HSP!"
	itix = 50
	itiy = 250
	gosub *jump

	stop

*jump
	pos itix, itiy
	mes moji

	return
//	新規命令で定義
//	posmes "文字列", X座標, Y座標

#module

#deffunc posmes str p1, int p2, int p3
	pos p2, p3
	mes p1

	return

#global

	posmes "Hello World!", 100, 150
	posmes "Let's HSP!", 50, 250

まず、#deffunc命令は通常「#module〜#global」でくくります。#deffunc命令の1番目のパラメータは 定義するユニークな命令名です。他の命令や関数、変数の名前と被ったりしないようにしてください。

2番目以降のパラメータは新規命令のパラメータを宣言していきます。エイリアス名の「str」は文字列、 「int」は整数値を意味します。ここでは触れませんが「double」は実数値(小数点数値)を意味します。
 「p1〜p3」というのは、この定義内で利用する変数名です。ここではパラメータ1〜3という意味をこめて、 このような名前にしてあります。そして、実際にpos命令とmes命令にこれを反映させてます。
 最後に必ず処理をreturnさせてください。

この一連の処理をサブルーチンで再現したものもありますが、1度命令を定義しておけば後々楽という のがよく分かるかと思います。

次のお題として、指定した数値を100倍した結果を返す命令です。#deffunc命令の「var」は変数を意味し、 このパラメータに結果が返ります。また、同じパラメータに10000倍した結果を返すことも可能です。

#module

#deffunc bai var p1, int p2
	p1 = p2 * 100

	return

#deffunc baibai var p1
	p1 *= 10000

	return

#global

	value1 = 777
	bai kekka, value1
	mes kekka

	value2 = 5
	bai kekka, value2
	mes kekka

	value3 = 10
	baibai value3
	mes value3

最後に配列変数の「array」です。100倍にした結果を返します。

#module

#deffunc sample_array array p1
	foreach p1
		p1.cnt *= 100
	loop

	return 

#global

	value = 5, 4, 3, 2, 1
	sample_array value

	foreach value
		mes value.cnt
	loop

#defcfunc命令

#defcfunc命令は新規に関数を定義するプロプロセッサ命令です。使用方法は#deffunc命令 と同じです。
 上の100倍した結果を返す命令というのは関数形式にした方がスッキリします。必ずreturnにパラメータを 指定して結果を返すようにしてください。

#module

#defcfunc bai int p1
	return p1 * 100

#global

	value1 = 777
	mes bai(value1)

	value2 = 5
	mes bai(value2)

配列変数を意味する「array」を使って加算する。文字同士を結合する。

#module

#defcfunc tasu array p1
	return p1.0 + p1.1

#defcfunc ketugo str p1, str p2
	return p1 + p2

#global

	value = 123, 321
	mes tasu(value)

	mes ketugo("あいうえお", "かきくけこ")

メモ

新規に定義された命令や関数の処理を別ファイルにすれば、いわゆるモジュールファイルになります。 「#module〜#global」の範囲を別ファイルにして、メインのスクリプトからこのファイルを#includeします。
 たとえば、文字のゆっくり表示関連のtext命令は、HSP2(HSP 2.x)では標準命令でしたが、HSP3(HSP 3.x)では廃止されました。 そこで、モジュールファイル「hsp3util.as」にて、#deffunc命令でtext命令やemes命令を定義して、実際の処理を 標準命令で再現させてるわけです。

ちなみに、新規命令や新規関数はコード量が減った結果として、実行ファイルのサイズ減量につながる 場合があります。ただ、あらかじめ処理が定義されてるからといって高速化するようなことはないでしょう。
 このページで提示してるサンプルは、あくまで説明のためのコードであって、実際にはこのような小さな処理 のためだけに、わざわざ定義を用意する効果はほとんどありません。

#deffunc命令と#defcfun命令で指定するパラメータタイプ(型)の入出力表。

IN OUT
int (整数値) O -
str (文字列) O -
double (実数値) O -
var (変数) O O
array (配列変数) O O

キーワード de HSP

HSPミニ講座

★ Yahoo!経由用ページ : ファイル | フォルダ | メニュー | マウス | ウィンドウ | オブジェクト | 文字列 | システム | 関数 | sendmsg命令 | その他 | サイトマップ | リンク