この記事は筆者が実践したことを元に記事を構築しています。なぜか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
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を使うやり方は古いやり方なのかもしれない。実行結果は以下のようになる。地味ではあるが結構感動する。
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の合計値を違ったものにするとエラーこそでないが、うまく動かなくなる。この構文は自機を動かす際の決まり文句みたいなものだ。
上記のコードを実行すると「山」自在に動かせるようになった。地味だが感動する。
特定のキーに対する番号をみていこう
さきほど使ったキー番号はカーソルキーのものだけだったが他にも用意されている。key番号は2進数表記や16進数表記もできるようだが、そういう小難しいことはどうでもいい。普段使っている10進数だけを表にまとめる。
入力の種類 | キーボード・マウス | 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(y550):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の構文は見た瞬間はうっ・・・となってしまうが、とりあえず一旦コピペして実行してみると理解が深まるだろう。
コメント