HSPのゲームに関連しそうな構文をみていこう。

この記事は筆者が実践したことを元に記事を構築しています。なぜかUnityからスクリプト言語のHSPを学びはじめましたが、2000年代前半の森に迷い込んでしまった感があります。ネット上のコードが読めないのではやくも挫折しそうです。前回はHSP公式の入門編をまとめた記事を作成しています。
HSPのスクリプトエディタをつかってみよう。HSPの基本的な構文も。

今回は「丸中のHSPゲーム講座」というサイトの情報をもとにコードを動かして、こんなものかというのを感じていきたいと思います。

repeat, waitを使ってみよう

repeatは単純な命令で、指定した回数を処理をこなすための命令文だ。repeatはloopステートメントで閉じる決まりになっている。loopがないとエラーになるので注意が必要だ。下記のコードはrepeatを使ってアニメーションを再現している。動かしてみると少しおもしろいことがおこる

	button "開始",*hata
	stop
*hata
	repeat 50
	cls 0
	pos X,0
	mes"●"
	X=X+1
	wait 1
	loop

screenshot-20181216-0233
pos xを1ずつずらして黒い点を表示するのを50回繰り返している。すると上のようなアニメーションができあがる。waitは0.1秒だけ待つ処理でwaitを使わないと動いては見えるものの処理がかなり早く終わることを確認した。

screenとbufferを使ってみよう

screenとbufferはアニメーションをなめらかに表示させる仕組みだ。しかし仕組みがちょっとわかりにくいので、役割を表にしておこうと思う。

命令文 パラメーター 役割
screen 画面番号 画面番号を指定する(見える画面)
buffer 画面番号 画面番号を指定する(見えない画面)
gsel 画面番号 画面番号を切り替える
gcopy 画面番号,,,ピクセル 画面番号を〇〇ピクセル分コピーする

重要な点としてscreenもbufferも1番はwindowsが使用しているので使うとエラーになるようだ。原理としては見えない画面(buffer)に書き出された処理をgcopyでコピーすることによってアニメーションを滑らかに表現できるようだ。

	screen 0
	buffer 2
	repeat 50
	gsel 2
	cls 0
	pos X,0
	mes"●"
	X=X+1
	gsel 0
	gcopy 2,,,99
	wait 1
	loop

このコードの意味は「画面2の画面を白くし、黒い●を描いたら画面0番にその画面をコピーする。そしてこれを繰り返す。」となる。上のコードを実行すると前回のコードとほとんど同じ結果になる。正直な感想としてあまり違いがわからなかった。(こちらのやり方は情報が古い可能性があります

・・・挫折しそうだ。

redrawをつかってみよう

ここからさきは科学太郎氏が提供しているゲーム制作のミニ講座 シューティングゲームを作ろうを参考にして記事を書いている。

redrawも画面ちらつき対策防止のための構文のようだ。redraw 0のとき再描画を停止し、redraw 1の時に再描画を開始する。以下のコードは「山」という文字を横にいったりきたりさせるコードだ

*Main
    screen 0,600,400,SCREEN_FIXEDSIZE
    font MSGOTHIC,50
    ;アニメ処理
    x=0:y=200
    repeat
        redraw 0
        color $00,$00,$00:boxf
        color $00,$FF,$00:pos x,y:mes "山"
        redraw 1
        await 0
        x=x+1
        if(x>=600):x=0
    loop
stop

このコードはredrawがなくても動くが、redrawありとなしで実行結果を見比べてみると、違いがはっきりする。もしかするとbufferを使うやり方は古いやり方なのかもしれない。実行結果は以下のようになる。地味ではあるが結構感動する。
screenshot-20181216-0421

stickをつかってみよう

stickはカーソルキーや特定のキーが押されたのを検出するための命令だ。stickの他にはgetkeyもあるが、stickは一度の宣言で複数のキーを一度にチェックできるという利点があるようだ。おもむろに構文をみていこう。

*Main
    screen 0,600,400,SCREEN_FIXEDSIZE
    font MSGOTHIC,50
    repeat
        redraw 0
        stick key,15
        if(key&1):x-=5
        if(key&2):y-=5
        if(key&4):x+=5
        if(key&8):y+=5 
        color $00,$00,$00:boxf
        color $00,$FF,$00:pos x,y:mes "山"
        redraw 1
        await (1000/60)
    loop
stop

この構文で「山」という文字を自在に動かすことができる。カーソルキーなどは値が決まっていて、stickの引数にはkeyとチェックするkeyの値が合計したものだ。keyの合計値を違ったものにするとエラーこそでないが、うまく動かなくなる。この構文は自機を動かす際の決まり文句みたいなものだ。
screenshot-20181216-1440
上記のコードを実行すると「山」自在に動かせるようになった。地味だが感動する。

特定のキーに対する番号をみていこう

さきほど使ったキー番号はカーソルキーのものだけだったが他にも用意されている。key番号は2進数表記や16進数表記もできるようだが、そういう小難しいことはどうでもいい。普段使っている10進数だけを表にまとめる。

HSPの入力検出
入力の種類 キーボード・マウス key番号
カーソルキー ←キー 1
↑キー 2
→キー 4
↓キー 8
特殊キー Spaceキー 16
Returnキー 32
Ctrlキー 64
Escキー 128
マウス マウスの左ボタン 256
マウスの右ボタン 512
特殊キー Tabキー 1024

自機が画面外に出ないようにしよう

先ほどのgif画像では実は最後のほう自機が画面外にでてしまっている。これを制限する構文は思いのほか簡単だ。

*Main
    screen 0,600,400,SCREEN_FIXEDSIZE
    font MSGOTHIC,50
    repeat
        redraw 0
        stick key,15
        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
        color $00,$00,$00:boxf
        color $00,$FF,$00:pos x,y:mes "山"
        redraw 1
        await (1000/60)
    loop
stop

if文で移動制限をかけていることがうかがえる。画面サイズは600×400なのに550や350で比較しているのは、山とう文字の左上が基点になっているためだ。

まとめ

とりあえずこの記事でとりあつかうものはここまでにしておく。最後のほうはシューティングゲームっぽい構文になってきた。コードをコピペして実行してみるとわかるが、そんなに大したことは書かれていない。HSPの構文は見た瞬間はうっ・・・となってしまうが、とりあえず一旦コピペして実行してみると理解が深まるだろう。