前回はとりあえず使い魔を登場させるところまで作りました。今回はもうちょっと使い魔らしさを出してみたいと思います。
GetKeyState
を使えば、キーの状態を取得できます。SetDamageRateEx
を使えば、敵スクリプトの敵のダメージを親へと送ることができます。それではいってみましょう。
前回までで、とりあえず使い魔を登場させるところまで作りました。しかし、東方永夜抄の使い魔は、人間時(高速移動時)と妖怪時(低速移動時)とで若干挙動が変化します。具体的には、武烈クライシスの使い魔は妖怪時にショットの当たり判定が消えてしまいます。また、グラフィックも両者で変わります。今回はこのあたりを実装してみましょう。東方弾幕風では低速移動時にも人間なのですが、そのあたりは気にしないことにします。
このような挙動を実装するには、今、高速移動中なのか低速移動中なのかを判定しなくてはいけません。ヘルプを見ても、「低速移動中であるかどうか」を直接判定する関数は存在しません。では、一体どのようにすればいいのでしょうか?
これは、低速移動中かどうかを直接判定するのではなく、低速移動のキー(ボタン)を押しているかどうかを判定すればいいのです。現在のキーの状態を取得する関数は GetKeyState
です。
state = GetKeyState(key);
// state : キーの状態
// KEY_FREE / 押されていない
// KEY_PUSH / 押された瞬間
// KEY_HOLD / 押しっぱなしになっている
// KEY_PULL / 離された瞬間
// key : 状態を取得するキー(ボタン)
// VK_LEFT / 左
// VK_RIGHT / 右
// VK_UP / 上
// VK_DOWN / 下
// VK_SHOT / ショット
// VK_BOMB / ボム
// VK_SLOWMOVE / 低速移動
// VK_SKIP / メッセージスキップ
例えば、低速移動キーの状態を取得するには、
state = GetKeyState(VK_SLOWMOVE);
という風にします。そして、キーが押しっぱなしになっているかどうかを確認したい場合は、
if(state == KEY_HOLD) { }
とすればいいのです。
では、実際にこれを使って挙動を変更してみましょう。変更する部分は、@MainLoop
の当たり判定の部分と、あとはグラフィックを変更する部分です。これは一箇所にまとめられますね。
@MainLoop { if(GetKeyState(VK_SLOWMOVE) == KEY_HOLD) { setGraphicSlow; } else { SetCollisionA(GetX, GetY, 32); setGraphicFast; } yield; } // グラフィックの設定 sub setGraphicFast { SetGraphicRect( 0, 0, 48, 48); } sub setGraphicSlow { SetGraphicRect( 0, 48, 48, 96); }
これで、キーを押している間はグラフィックが変わり、当たり判定も消失します。
以上の変更を行ったプログラムをここに置いておきます。実際に実行してみて、低速移動時に使い魔のグラフィックが変わって、ショットも当たらなくなることを確認してみて下さい。低速移動キーを押した瞬間は使い魔が変化しませんが、東方永夜抄でも微妙にタイムラグがあるので(これは意図的にタイムラグを導入してあります)、1 フレーム程度のタイムラグは問題ないかと思われます。
使い魔を攻撃した場合、使い魔自身のライフだけではなく、使い魔を従えている敵(親)のライフも減少します。今度はこれを実装してみましょう。
と言っても実装は簡単で、SetDamageRateEx
の代わりに SetDamageRateEx
という関数を使えばいいだけです。
SetDamageRateEx(shot, bomb, shot2, bomb2);
// shot : ショットのダメージレート
// bomb : ボムのダメージレート
// shot2 : ショットのダメージレート(親へのダメージ)
// bomb2 : ボムのダメージレート(親へのダメージ)
shot
と bomb
は SetDamageRate
のものと同じですが、さらに引数が2つ増えています。これらは、親へ送るダメージに対するダメージレートになります。デフォルトでは 0 であり、ダメージは親へは送られません。ここにダメージレートを設定すれば、使い魔のダメージが親へと送られるようになります。
ここにそのプログラムを置いておきます。ついでに攻撃や移動も実装しておきました。攻撃や移動は、これまでの知識を使えば普通に理解できるはずです。
スペルグラフィックを付けた完成品をここに置いておきます。ZIP 形式で圧縮されているので、解凍して script フォルダに放り込んで下さい。
ここまでの知識があれば、もう様々な弾幕が作れるはずです。弾幕を作ることに関する基本的な話は既に話し尽くしたといっても良く、あとは細かい話しか残っていません。それらを説明することに大きな意義があるとは思えませんので、各自ヘルプを読みつつ、欲しい機能がないかどうか、どんな機能があるのかなどをチェックしつつ、色んな弾幕を作ってみましょう!
GetKeyState
を使えば、キーの状態を取得できます。SetDamageRateEx
を使えば、敵スクリプトの敵のダメージを親へと送ることができます。さて、今回で Single 用のスクリプトに関する話は終了です。でも、まだ講座は終わりません。次回は、Plural で実行するスクリプトを作ってみたいと思います。