〜 オブジェクト 〜
1025個以上のオブジェクトを配置

1ウィンドウ内のオブジェクト配置数には限界があり、
HSP2は64個、HSP3では1024個を超えると問題が出てきます。
HSP2は65個以上配置すると、変数が別に設定していても正常に保持できず、
HSP3以降は1025個以上配置すると、エラーでアベンドしてしまいます。
どちらも値の保持変数以外に、オブジェクト自体の情報(位置やサイズ等)を保持した領域があり、
ウィンドウごとに用意されたBMSCR構造体にソレは格納されていますが、
HSP2では、オブジェクト64個分固定の領域があることに対し、
HSP3では、オブジェクトを管理するHSPOBJINFO構造体の位置だけを保持しており、
そのHSPOBJINFO構造体は可変長であるので、1025個以上配置可能となっています。
1025個目の配置でエラーになるのは、BMSCR構造体内のオブジェクト数上限を確認してる為で、
そのオブジェクト数リミッター領域を書き換えることで1025個以上配置できるようになります。
場所はBMSCRの配列要素73番目に位置するobjlimitとなっているので、
下記のサンプルのように上書きすれば、新しく設定したリミット数以下はエラーが出なくなります。
ただ、コレはあくまで「HSP3以降での上限数を超えるやり方」についての説明であり、
そんなに多くのオブジェクトを配置しなければならないようなプログラムは見直すべきでしょう。
使用してないオブジェクトは擬似的に画像に置き換える等の工夫をしないと、
ムダに重いだけのソフトで、とても「使う側の立場に立って作られたソフト」だとは思えないと思います。
	

objlimit 最大数
最大数1以上の配置できるオブジェクト最大数を指定する。
尚、statに設定数が返されるので、省略するか0以下を指定すると最大数の取得のみを行う。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#module
#deffunc objlimit int num
	mref bmscr, 67
	if num > 0 : bmscr.73 = num
	return bmscr.73
#global

	screen 0, 800, 600
	// 下記の数だけテスト的に配置しますので無謀な数はやめましょう
	objnum = 1200
	// オブジェクト数の変更テスト
	objlimit objnum
	mes "変更後のオブジェクト配置可能数:" + stat
	sdim buf, 4, objnum
	// 配置テスト
	font "", 10 : objmode 2
	repeat objnum
		buf.cnt = cnt
		pos cnt \ 32 * 25, cnt / 32 * 15 + 20 : input buf.cnt, 25, 15
	loop
	// 配置エラーテスト(下記のコメント外すとエラーになる)
/*
	pos objnum \ 32 * 25, objnum / 32 * 15 + 20 : input buf, 25, 15
*/