ELF's Software for HSPmemorandum
[HOME]


HSP覚え書き
■シューティング編

★‥更新箇所 02/12/16
◆DirectX(Hspdx.dll)関係
◇es_palfadeが遅い
◇es_bufferの確保の仕方
◇アニメーションのもう一つのやり方
◇ダメージでフラッシュ
★爆風など新規発生スプライトを上にする
◆高速化
◇条件判断
◇サブルーチンへのパラメータ渡し
■その他
◆裏技的なもの
◇自身にメッセージを送る
◇Exforce.dllで作ったメニューになんかする
★オブジェクトを残したままウィンドウを初期化する

DirectX(Hspdx.dll)関係

◇es_palfadeが遅い
ウチのビデオボードだと遅い。
フェードするスピードが0でも遅い。
ていうか、元々付いてるボードより遅い。

FPS
1フレーム毎に
se_palsetでアイテムの縁を点滅させる
なんて事をすると半分以下に‥(泣)


◇es_bufferの確保の仕方
es_bufferは0から
順番に確保していかないとエラーになる。(ウチのビデオボード)
一度確保すればあとは自由。(サイズは同じでないとだめかも)

なので、最初に
	buffer 2,320,960,1 :es_buffer 0,0	;プレイヤー
	buffer 2,320,960,1 :es_buffer 1,0	;敵
	buffer 2,320,240,1 :es_buffer 2,0	;オブジェ
	buffer 2,320,512,1 :es_buffer 3,0	;背景
	buffer 2,192,480,1 :es_buffer 4,0	;背景描画用
	buffer 2,320,240,1 :es_buffer 5,0	;その他
などとしておく。

横幅を表示画面以上にするとエラーに。
ならないボードもあるので厄介かも。

※確保先がメインメモリなら制限を受けないような気が。


◇当たり判定(es_size)
自機の当たり判定をあまり小さくすると、
アイテムが取りにくくなる。
だからといって大きくすれば敵や弾に当たりやすくなる‥。

それならば‥。
アイテムの当たり判定を200%にしちゃえ。という話。


◇アニメーションのもう一つのやり方
es_xferで、
バッファ内の画像を直接変えるだけ‥

es_patで登録したキャラクタの座標部分に、
アニメのコマをコピーすると、表示されるスプライトも変わる。


◇ダメージでフラッシュ
敵に攻撃が当たるとフラッシュするやつ。
es_pat 0,  0,0,6
es_pat 1  64,0,6 :es_link 1,0
es_pat 2,128,0,1 :es_link 2,0	;ダメージで白くなった敵の絵
ダメージを受けたら、
es_chrでキャラを"2"に変える。

※アニメは最初からになっちゃうけど。
 (es_getで現在のキャラNoを調べてとかすればある程度防げます)

ダメージを受け続けると画面上では白いままになるので
現在のフレーム数をカウントする変数を用意して‥
if Acnt&1 :es_chr ‥
こうするとフラッシュしているように見える。という話。


◇爆風など新規発生スプライトを上にする
爆風などを発生させるとき、普通にやってもなぜかぱっとしない、
と思ったことはありませんか?
「小さい番号が上に来る」というHspdx.dllの仕様のため
新たに発生させた爆風はいつも古い爆風の下に隠れてしまい、
ドッカ〜ン!の「ドッ」の部分が見えず迫力に欠けてしまうためです。

残像も普通にやったのでは
古い残像が新しい残像の上に乗ってしまうのでよろしくありません。

要するに、ケツから探せばいいワケで‥。
;MAX_EXP	爆風の最大数
;MAX_EXP_NO	爆風のスプライトNoの最後

repeat MAX_EXP
	i=MAX_EXP_NO-cnt
	es_new newNo,i :if newNo=i :break
loop
if newNo!i :‥		;新規スプライトの取得ができなかった
es_new p1,p2に
p2から逆に探すオプションでもあれば楽なんですけど(^^;


◆高速化
◇条件判断
○nが-1、もしくは200以上という条件
(es_newとかで‥)
if n<0|(n>200) :‥
 ↓
if n&$FFFF>200 :‥
○stick命令で
 押されたキーが16(スペースキー)又は32(Enterキー)という条件

if key&16|(key&32) :‥
 ↓
if key&48 :‥		;48=16|32

◇サブルーチンへのパラメータ渡し
パラメータ渡し用の変数を決め、dupでクローン
	dim p,16
	dup p0,p.0
	dup p1,p.1
	dup p2,p.2
	  :
・渡すとき
	p=a,b,c,d,‥
・サブルーチン内では
	es_new no,0
	shotX.no=p0
	shotY.no=p1
	shotZ.no=p2
	  :
※1つのスプライトのパラメータが多い場合、
 2次元配列の方が効率が良いこともある。
	dim shot,8,64
	;no スプライトNo等
	;shot.0.no 弾の種類
	;shot.1.no X位置
	;shot.2.no Y位置
	  :

	shot.0.no=2,x,y,‥
	;shot.0.no=2
	;shot.1.no=x
	;shot.2.no=y
	  :
	------------------
	dup Cshot,shot.0.cnt
	dup CshotX,Cshot.0		;shot.0.cntのクローン
	dup CshotY,Cshot.1		;shot.1.cntのクローン
	dup CshotZ,Cshot.2		;shot.2.cntのクローン
	  :
※HSP2.55からはmemcpyも使えるようになった事ですし‥


◆裏技的なもの
◇自身にメッセージを送る
objsendのp1(オブジェクトID)に-28(13-41)を指定する。
objsend -28,$114,x<<16+5,a,1
objsend -28,$115,y<<16+5,a,1
x,yを変えると、
ウィンドウ(ID2〜ID31)のスクロールが出来たりする。

objsendはBMSCR構造体に記録されている
オブジェクトのハンドルを参照するっぽいので、
参照先をウィンドウハンドルが記憶されている場所にしてみた、というワケ。
でもまさかマイナスが指定できるとは思わなかった(汗)。

【その他】
ウィンドウを最小化(bgscrにもできます)
objsend -28,$112,$F020,a,1  ;SC_MINIMIZE

最小化したウィンドウを元に戻す
objsend -28,$112,$F120,a,1  ;SC_RESTORE

スクリーンセーバー起動
objsend -28,$112,$F140,a,1  ;SC_SCREENSAVE

スタートメニューを出す
objsend -28,$112,$F130,a,1  ;SC_TASKLIST



◇Exforce.dllで作ったメニューになんかする
・サブメニューにチェックを入れたりする方法。
apx_callなどで、WinAPIを使う必要があります。

まず、GetMenuでメニューハンドルを得ます。
CheckMenuItemでチェックのON/OFF、
EnableMenuItemで使用の可否、
CheckMenuRadioItemでラジオチェックが可能です。
(...? いくつかのアイテムのうちから一つだけ選択できるやつ)

IDにはmmcmdで指定したメニューコマンドをそのまま指定します。



◇オブジェクトを残したままウィンドウを初期化する
mref bmscr,67
dim tmp,64
memcpy tmp,bmscr.41,64*4	;オブジェクトハンドルの待避
memset bmscr.41,0,64*4	;0でクリアしてオブジェクトがないことにする
screen ‥‥			;ウィンドウ初期化
mref bmscr,67		;再割り当てしないと失敗する場合あり
memcpy bmscr.41,tmp,64*4	;オブジェクトハンドルを戻す