初心者のためのゲームプログラミング入門

プログラミングとゲームの杜

初心者のためのプログラミング入門 & ゲームプログラムの作り方入門

Small Basic 入門

30.ふらふらUFOを作ろう その4

 

ふらふらUFOを作ろう その3 ] の続きです。

 

ゲームオーバーを表示しよう

やられ演出の次はゲームオーバーを表示します。
絵は使わず、Shapes の機能を使って次のような感じにします。

 

ゲームオーバーの表示

 

テキストに影が付いているのに気が付きましたか?
2つのテキストを少しずらして表示しています。
Shapes を使ったテキストの登録は次のようになります。

 

shape を使ってテキストを表示する

 

影となる黒い文字を msg2 として先に登録します。(30行目)
黄緑の文字を msg1 として後に登録します。(34行目)
後に登録するほど表示優先は高くなります。(手前に表示されます)

はじめて使った Shapes.AddText はテキストを図形のように扱える便利なものです。
移動や回転など簡単にできます。

30行目 登録、31行目 表示位置の指定、32行目 隠す
という処理を msg1 でも行ってます。

 

Shapes.AddText を表示する

 

やられ演出とあわせてゲームオーバーを mcnt = 600 のタイミングで 表示します。
30フレーム(1秒間に30回処理する)で動かしているので、やられてから2秒後に
「GAME OVER」の表示となります。

リトライの機能を付けるので、メッセージを隠します。(144・145行目)

 

今回はテキストを表示しましたが、Shapes を使ったので簡単だったと思います。
絵と同じように扱えるのは便利ですね。

 

 

リトライの仕組みを入れよう

ゲームをくり返し遊べるようにリトライの仕組みを入れます。

 

リトライの仕組みを作る

 

初期処理のサブルーチン init() 以外は、While を使ってくり返すようにしました。
これで gameover() を抜けたら start() へ戻ります。

 

ゲームオーバー中、スペースキーを押すとリトライするようにします。
メッセージは次の画像のように「 PUSH SPACE KEY 」と表示します。

 

スペースキーを押すとリトライする

 

ここでゲーム作成のポイントです。
可能な限り、操作デバイスは1つにすること
つまり、ゲーム中マウスを使うなら、タイトルでもマウス操作に統一することです。
ゲーム中キーボード操作なのに、タイトルではマウス操作だったりすると
操作に面倒臭さを感じます。


それではサブルーチン init に「 PUSH SPACE KEY 」を登録します。
登録方法はゲームオーバーの時と同じです。

 

shapes を使ったテキストの登録

 

次にゲームオーバー中に「 PUSH SPACE KEY 」を点滅表示させます。
この方法は前回のメテオゲームと同じです。

 

メッセージを点滅させる

 

155行目、スペースキーを押された場合、変数 state に " start " を代入します。
state の内容が変わることで、137行目のループから抜けます。
163行目、メッセージを隠します。

これでゲームがくり返されるようになりました。
実行して確認してみましょう。

 

 

初期化の見直し

リトライの確認はしましたか?

試してみると分かりますが、リトライ後、自機が勝手に移動したり
絵が傾いていたりします。

 

リトライを考慮した初期化がされていない

 

これは初期化にミスがあります。
そのため、前回の状態が残っているのです。
プレイ前の準備サブルーチン start で初期化をしっかり行います。

 

リトライを考えて初期化する

 

自機が勝手に移動するのは、変数 movekey に前回の値が入っているからです。
" (ダブルコーテーション) を2つつなげて変数を初期化します。(50行目)
これにより変数 movekey には何も入っていない状態になります。

自機が傾いているのは、やられ演出で回転させたからです。
回転の角度を0に設定することで、傾きの無い表示になります。(54行目)

それではリトライしても正常にプレイできるか確認してみましょう。

 

リトライに関して、直したい所がまだ1つあります。
スペースキーを押してリトライした後、キーを操作しないでそのままにすると
ゲームオーバー後、勝手にリトライしてしまう所です。

原因は GraphicsWindow.LastKey に " Space " が入ったままになるからです。
LastKey は初期化できないため、別の方法で解決するしかありません。
キー押下のイベント処理で対応できますが、この説明はまた別の機会にします。