この記事は科学太郎氏が提供しているゲーム制作のミニ講座 シューティングゲームを作ろうを参考に実践をもとに記事を構築しています。HSPの基本的な構文等については以下の記事から参照していただければと思います。
いまさらはじめるHSP入門。
配列を使ってみよう
自機から弾を発射させるときに配列を使うので配列の基礎から。
配列の宣言
配列の宣言はdimを使います。dimのあと配列変数名を指定し、カンマ区切りで要素数を指定します。配列の要素へのアクセスはピリオドを使う方法、もしくはかっこを使ってアクセスする方法があります。
dim value, 3 value.0 = "tanaka" value.1 = "suzuki" value.2 = "sasaki" mes value.0// tanaka mes value(0)// tanaka
cntとforeachを使ってみよう
cntは繰り返しブロックの中で自動的にインクリメントされていく値になります。他のプログラミング言語の場合は、カウント変数を宣言してインクリメントする構文が一般的かと思いますがhspの場合はcntという特殊な値が使える用です。
repeat 3 mes cnt// 0 1 2 loop
foreachは配列の要素を簡単に取り出すことができます。hspの場合は要素のインデックス番号にcntを使うことができます。
foreach value mes value(cnt)// tanaka suzuki sasaki loop
HSPの真偽値をみよう
HSPの真偽値はtrueやfalseではなく0か0以外の値で管理されているそのため構文に直接trueなどは指定できない。弾の発生と発射の仕組みには真偽値がつかわれているので知っておかなければならないだろう。
if 0: mes "hello"// 0はfalse なので表示されない if 1: mes "hello"// hello if 2: mes "hello"// hello
自機から弾を発射させてみよう
自機を表示させる仕組みについては前回の記事に書いていますが、こちらのコードを見てもよいでしょう。弾に必要な処理は弾丸の発射、移動、描画。
*Init dim tamaF,10 dim tamaX,10 dim tamaY,10 *Main screen 0,600,400,SCREEN_FIXEDSIZE font MSGOTHIC,50 repeat redraw 0 stick key, 31 if(key&1):x- =5:if(x<0):x=0 if(key&2):y-=5:if(y550):x=550 if(key&8):y+=5:if(y>350):y=350 if(key&16):gosub *TamaBirth color $00,$00,$00:boxf color $00,$FF,$00:pos x,y:mes "山" gosub *TamaDraw redraw 1 await (1000/60) loop stop *TamaBirth foreach tamaF if(tamaF(cnt)==0){ tamaF(cnt)=1 tamaX(cnt)=x tamaY(cnt)=y break } loop return *TamaDraw foreach tamaF if tamaF(cnt){ tamaY(cnt)-=8 if(tamaY(cnt)<-50):tamaF(cnt)=0:continue pos tamaX(cnt),tamaY(cnt) color $FF,$FF,$00:mes ":::" } loop return
このコードは実際はやっていることは大したことがないのですが、コードの理解に苦しむでしょう。tamaFは真偽値として管理されています。dim tamF,10なので10発の弾が管理されています。スペースキーが押されると自機の位置で弾が発生され(*TamaBirth)次に*TamaDrawで描画処理が行われます。
なぜtamaFを0にする必要があるのか
hspで0はfalseを表します。*TamaDrawに書かれているコードはif(TamaY(cnt) < -50)なので弾が画面外に出ると 0 つまりは false になります。なぜこれが必要かは実際に試してみるとわかります。弾が画面外に出る前に弾の発生を行うと、posが更新されてしまうので上に飛んでいく前に弾が生成されおかしなことになります。
弾の発射間隔を調整しよう
弾の発射間隔についてはデクリメントで表現することができるようです。tamaTriggという変数で発射間隔を調整できるようになります。ちょっと考えないとわかりませんでしたが、tamaTriggが0以外の場合にデクリメントだけで処理を終了させることにより〇サイクルに1回だけ弾を発射するというのが表現できるようになります。
*TamaBirth if(tamaTrigg):tamaTrigg--:return foreach tamaF if(tamaF(cnt)==0){ tamaF(cnt)=1 tamaX(cnt)=x tamaY(cnt)=y break } loop tamaTrigg = 2 // 2サイクルに1回弾を生成 return
まとめ
hspで自機から弾を発射させるコードは、配列と真偽値の理解が必要です。そのうえでコードを読むと時間はかかりましたが理解はできました。それにしてもなんだかコードがひどい感じがしてなりません。ここまですすめておいてあれですが、Unityでシューティングゲームが作れるのであればそちらで作ったほうが楽でしょう。hspのコードは可読性が悪いと感じるのは慣れの問題かもしれませんが、ちょっとひどいです。
コメント