HSPで縦シューティングゲームを作っていこう①自機から弾の発射

この記事は科学太郎氏が提供しているゲーム制作のミニ講座 シューティングゲームを作ろうを参考に実践をもとに記事を構築しています。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(y<0):y=0
        if(key&4):x+=5:if(x>550):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が更新されてしまうので上に飛んでいく前に弾が生成されおかしなことになります。 screenshot-20181216-1835

弾の発射間隔を調整しよう

弾の発射間隔についてはデクリメントで表現することができるようです。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のコードは可読性が悪いと感じるのは慣れの問題かもしれませんが、ちょっとひどいです。


Warning: Undefined array key "thumbnail_url" in /home/users/1/boy.jp-rolpop/web/skc/wp-content/themes/godios/inc/schema-org.php on line 49

Warning: Undefined array key "thumbnail_url" in /home/users/1/boy.jp-rolpop/web/skc/wp-content/themes/godios/inc/schema-org.php on line 78