Godot4での弾幕シューティングゲームの作り方について掲載しています。ぜひ参考にしてください。
第1回はこちらです。
ボスを作る
Bossシーンを追加する
まずは、ボス(敵)を作りましょう。
Boss(Area2D)シーンを追加して、保存してください。
追加できたら、以下のようなシーン構成にしてください。
Boss
CollisionShape2D
ColorRect
そして、playerやbulletと同じようにCollisionShape2Dに長方形の衝突形状を追加して、大きさを100×100にしてください。
ColorRectの大きさも同じように100×100にしてください。位置は、真ん中になるように-50,-50にして、色は「00f419(緑色)」にしてください。
ボスの弾幕を作る
次に、ボスが発射する弾幕を作りましょう。下のサイトに円形弾幕の作り方を掲載しています。弾は、「enemybullet」という新しいものを作ってください。
ボスの弾幕を作ることができたら、Mainシーンにボスのインスタンスを追加してください。
弱い敵を作る
ボスを作ることができたら、弱い敵を作りましょう。Bossと同じようなシーン構成で「enemy」を追加してください。大きさはplayerと同じにして、色はBossと同じ緑色にしてください。
そして、Mainシーンにインスタンスを2つ追加してください。1つ目の位置は100,150にして、2つ目の位置は380,150にしてください。
敵からも弾幕を発射する
次に、Enemyが発射する渦巻弾幕を作りましょう。作り方は下のサイトに掲載しています。弾はB尾ssと共通の物にしてください。
弾幕を作ることができたら、実行してみましょう。
HPを作る
自機のHPを作る
次に、自機のHPを作りましょう。
playerシーンに「ProgressBar」を追加して、大きさを100,27にして、位置は-50、-50にしてください。
そして、HPを表示させるためのコードを追加しましょう。
var hp = 100 #HPを100にする
func _process(delta):
$ProgressBar.value = hp #HPによってBarの%を変動させる
hpという変数を追加して、HPバーをhpによって変動させるプログラムです。
ボスのHPを作る
次に、ボスのHPを作りましょう。
自機と同じようなものを追加して、位置を-50、-100に変えてください。そして、同じようにHPを表示させるためのコードを追加しましょう。
var hp = 1000 #HPを000にする
func _process(delta):
$ProgressBar.value = hp #HPによってBarの%を変動させる
弱い敵にも追加する
弱い敵にも自機と同じものを追加し、以下のコードを追加してください。
var hp = 300 #HPを300にする
func _process(delta):
$ProgressBar.value = hp #HPによってBarの%を変動させる
これで、HPの設定は完成です。
当たり判定を作る
次に、当たり判定を追加しましょう。
敵弾に当たったら自機のHPを減らす
まずは、自機の当たり判定を追加しましょう。
敵弾に、以下のコードを追加してください。
func _ready():
add_to_group("enemybullet")
これで、敵弾を、「enemybullet」というグループに追加することができます。
そして、自機に「area_entered(area:Area2D)」というシグナルを接続しましょう。
そして、自機に以下のコードを追加してください。
func _on_area_entered(area): #area2Dに触れたとき
if area.is_in_group("enemybullet"): #触れたものがenemybulletなら
hp -= 10 #HPを10減らす
area.queue_free() #触れた弾を削除する
これで、自機の当たり判定は完成です。
弾に当たったら敵のHPを減らす
次に、敵の当たり判定を追加しましょう。
同じように、Bulletに以下のようなコードを追加してください。
func _ready():
add_to_group("bullet")
これで、Bulletを「Bullet」というグループに追加することができます。
BossとEnemyに「area_entered(area:Area2D)」というシグナルを接続して、以下のコードを追加してください。
func _on_area_entered(area): #area2Dに触れたとき
if area.is_in_group("bullet"): #触れたものがbulletなら
hp -= 10 #HPを減らす
area.queue_free() #触れた弾を削除する
これで、敵の当たり判定は完成です。
HPが0になった時
ゲームオーバーを作る
次に、自機のHPが0になった時にゲームオーバーにするようにしましょう。
「result」というシーンを追加して、その子ノードに、「Label」を追加してください。
そして、Labelを以下のように設定してください。
- サイズ 160,240
- スケール 3,3
そして、resultにスクリプトをアタッチして、以下のコードを入力してください。
extends Node2D
@onready var main = get_node("/root/main") #Mainを取得
func _process():
if main.result == 1: #負けたなら
$Label.text = "GAMEOVER"
else: #負けていないなら
$Label.text = "GAMECLEAR"
そして、プレイヤーに以下のコードを入力してください。
func _process(delta):
$ProgressBar.value = hp
if hp <= 0:
get_parent().result = 1
get_parent()._result()
さらに、ボスにも同じようなコードを入力してください。
func _process(delta):
$ProgressBar.value = hp / 10
if hp <= 0: #hpが0になったら
get_parent().result = 2 #Mainのresultを2にする
get_parent()._result() #Mainの_resultという関数を実行
次に、resultシーンをMainシーンにインスタンスしてください。そして、Mainにスクリプトをアタッチして、以下のコードを追加してください。
extends Node2D
var result = 0
func _result():
$Result.show()
これで、自機のHPが0になったらGAMEOVER,ボスのHPが0になったらGAMECLEARという文字が表示されると思います。
完成!
これで完成です。ですが、自分なりにアレンジを加えたりしてみても面白いと思います。