Godot3.5で2D弾幕シューティングゲームを作る
https://gyazo.com/06d9d63da83cfbfa5a1df0ff85c37b7e
itch.ioリンク: https://sparklewing.itch.io/tanitani-wizard
ブラウザ上でプレイ可能、無料
Godot 3.5 で 2D弾幕系シューティングゲームを個人ゲーム制作
TANITANI WIZARD
Godot ゲームエンジンを学習する目的で作成したのでメモる
制作に関するメモ
Godot: 継承したクラスからSuperクラスのメソッドを呼ぶ
Godot3.5 Particle Systems で爆発エフェクト
Godot 3.5 プレイヤーが通ったポジションを追従するオプション的キャラ
敵弾幕パターン
Godot3 プレイヤーを狙う敵の弾
Godot3 敵を中心として渦巻き型に広がる弾
Godot3 敵を中心としてX方向に拡散する弾
Godot3で分裂する弾
Godot3で出現後に一時停止してから動き出す弾
Godot3で出現後に一時停止した弾が分裂する
Godot3でカーブ軌道弾
Godot3で上昇した後に重力落下してくるかのような弾幕
Godot3で追い越し弾
Godot3 で徐々に速度を落としていく弾&戻ってくる弾
Godot3で花火模様を描いて一時停止し、プレイヤーをゆっくり狙う弾
Godot3 プレイヤーショットでタイルマップのコリジョンタイルを破壊
宝箱からアイテム抽選システム
今回は基本的に各アイテム同確率で抽選したので、単純にrandi()を使って抽選した
code:gd
var rand_ChestItemType = ChestItemType.keys()randi() % ChestItemType.size()
match ChestItemTyperand_ChestItemType:
ChestItemType.WIDE_SHOT_LEFT:
# 以下省略
被弾したらしばらく点滅にする
Godot 3.5でTimerを使って点滅させる
Godot3.5 敵の弾を一時的にスローにする味方の弾
死ぬ前に徐々に透明にしていくTweenを挟む
敵が死ぬ際に、alpha値を1 -> 0 に変化する tween を生成し、tween終了後に queue_freeを呼び出す
code:gd
var tween:Tween = Tween.new()
var duration = 0.5
tween.interpolate_property($Sprite, "modulate", Color(1,1,1,1), Color(1,0,0,0),
duration, Tween.TRANS_QUART, Tween.EASE_IN)
tween.interpolate_callback(self, duration, "queue_free")
add_child(tween)
tween.start()
弾のz_indexと自機のz_index
自機の当たり判定は自機中心の小さい範囲に設定しているため、自機と敵の弾が重なった時に自機で弾を隠さないように z_index を調整した。敵の弾が最前面に出るようにしている。
弾幕チェック用のDebugStage
https://gyazo.com/17920e9c2abd3ac271fe76d93b2e6c09
単体で敵の弾幕や移動パターンを確認するための Debug Scene を用意した。
毎回ステージに敵を配置して確認するのは作業効率が低いため
被弾時にカメラを揺らす
GodotでRigidbody2dのプレイヤーへの衝突検出してCameraをshakeするをベースにして、ダメージ判定時に揺らすようにした
Godot: 画面に現在のFPSを表示する
Godot3.5 十字キー/マウスで難易度選択操作
Godot3.5でヒットストップを入れる
Godot 3.5 で Cannot use enum as variable と出て AutoLoadに指定したclassからenum定義を読めないエラー
Godot3.5 で一時的に collision を disableにする
AudioStreamPlayer2Dを使うと位置依存の音になる件
Godot 3.5 AudioStreamPlayer 2D#6309b021a19e400000f1c1a3
2Dゲームだから AudioStreamPlayer2D を選んでしまっていたため、意図せず中心との距離に応じて音が弱まって再生されていた。
Godot3.5 弾を消してスコアアイテムに変換
ボム使用時の挙動について
ボム使用と同時に敵弾全てを消す処理を追加
ボム使用後は数秒「ボム使用中状態」とし、その間は敵が新たな弾を発生させないようにした