【Godot】弾幕シューティングゲームの作り方②

この記事は約6分で読めます。

Godotでの弾幕シューティングゲームの作り方について掲載しています。

ぜひ参考にしてください。

第1回はこちらです。

【Godot】弾幕シューティングゲームの作り方①
godotでの弾幕シューティングゲームの作り方について解説しています。ぜひ参考にしてください。画面の大きさを設定するまずは、画面の大きさを縦長に設定しましょう。プロジェクト>プロジェクト設定を開き、その中にある、「ウィンドウ(window)...

ボスを作る

Bossシーンを追加する

まずは、ボス(敵)を作りましょう。

Boss(Area2D)シーンを追加して、保存してください。

追加できたら、以下のようなシーン構成にしてください。

Boss
 CollisionShape2D
 ColorRect

そして、playerbulletと同じようにCollisionShape2D長方形衝突形状を追加して、大きさを100×100にしてください。

ColorRectの大きさも同じように100×100にしてください。

位置は、真ん中になるように-50-50にして、色は「00f419(緑色)」にしてください。

ボスの弾幕を作る

次に、ボスが発射する弾幕を作りましょう。

下のサイトに円形弾幕の作り方を掲載しています。

弾は、「enemybullet」という新しいものを作ってください。

【Godot】本格的な円形弾幕の作り方
godotでのシューティングゲームなどに使える本格的な円形弾幕の作り方について掲載しています。ぜひ参考にしてください。弾を作るBulletというノードを追加するまずは発射する弾となるBulletというノードを追加してください。ノードはAre...

ボスの弾幕を作ることができたら、Mainシーンボスインスタンスを追加してください。

弱い敵を作る

ボスを作ることができたら、弱い敵を作りましょう。

Bossと同じようなシーン構成で「enemy」を追加してください。

大きさはplayerと同じにして、色はBossと同じ緑色にしてください。

そして、Mainシーンインスタンスを2つ追加してください。

1つ目の位置は100,150にして、2つ目の位置は380, 150にしてください。

敵からも弾幕を発射する

次に、Enemyが発射する渦巻弾幕を作りましょう。

作り方は下のサイトに掲載しています。

弾はBossと共通の物にしてください。

【Godot】本格的な渦巻弾幕の作り方
godotでのシューティングゲームなどに使える本格的な渦巻弾幕の作り方について掲載しています。ぜひ参考にしてください。弾を作るBulletというノードを追加するまずは発射する弾となるBulletというノードを追加してください。ノードはAre...

弾幕を作ることができたら、実行してみましょう。

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」というグループに追加することができます。

BossEnemyに「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になった時

ゲームオーバーを作る

次に、自機のHP0になった時にゲームオーバーにするようにしましょう。

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()

これで、自機のHP0になったらGAMEOVERボスのHP0になったらGAMECLEARという文字が表示されると思います。

完成!

これで完成です。

自分なりにアレンジを加えたりしてみても面白いと思います。

タイトルとURLをコピーしました