ゲームの次のギミックである、旗の回収部分を作る。といっても、標準スプライトに機能があるし、サンプルプログラムもあるので、簡単にできる!と思っていた…
前回のエントリーで書いた通り、旗もマップの表示チップの1つとして定義して、マップ内に配置している。(画像を準備していないので、コインなのはツッコまないでww)
この旗のチップに対して、イベントを発生する属性ESMAP_ATTR_EVENTを、es_bgattr命令で設定する。
es_bgattr 0,3,4,ESMAP_ATTR_EVENT
スプライトとマップの当たり判定は、es_bghit命令を実行した後、es_getbghit命令を実行して取得できる。
ただ、床との当たり判定も一緒に行われるので、当たり判定が複数あることになる。
まず、es_getbghit命令の第三引数に-1を指定して、いくつ当たり判定があるかを取得する。
そのあと、repeat~loopなどで1つずつインデックスを指定して情報を取得し、イベント設定したチップ(今回は旗のチップ)との判定であるかを判定する。
ちょっとここでつまづいた。es_getbghit命令で取得する情報は、配列で返ってくる。
ヘルプには、自動的にintの配列になると書いていたが、どう見ても添え字無しの単独の変数にしかならない。
当たり判定の結果は、旗のチップと接触してイベントが発生したことを示す値になっているが、配列に入るはずのマップのXY座標が無いから、旗を取って消す処理が作れない…
試行錯誤した結果、dimであらかじめ配列として定義した後に渡すと、ヘルプ通りの値が返ってくることが分かった。
dimの処理があっても問題はないので、HSP掲示板で報告し、とりあえず進めることにした。
旗を取る→旗を消す処理は、該当するマップデータ内のチップNoを、空間である0に変更すればよい。
es_getbghit命令で配列に入った、イベントの発生したマップのXY座標を使う。マップを作った時と同じように、XYの値から、1次元配列の添え字を計算して指定する。
これで、旗を取ったら、消す処理が完成。ゲームの骨格はこれで目途が立った。
dim myres2,7 es_bghit 0 es_getbghit hitcnt,0,-1 repeat hitcnt es_getbghit myres2,0,cnt if myres2(0)&ESMAPHIT_EVENT { ;旗を取ったら logmes "旗ゲット X="+str(myres2(3))+",Y="+str(myres2(4)) flagnum++ map(myres2(4)*mapsx+myres2(3))=0 } loop