[07]バレットによるダメージを追加

2Dシューティング

プレイヤーバレット
damageは1、Area2Dのノードでbody_enteredを追加してEnemyに当たったかを検出
enemiesグループのget_damageにdamageを渡す

extends Area2D

# 移動スピード
const move_speed = 300.0
# プレーヤーからの距離
const bullet_range = 500.0
# バレットダメージ
var damage = 1

var direction = -1

func _ready() -> void:
	await get_tree().create_timer(3).timeout
	queue_free()

func _physics_process(delta: float) -> void:
	position.y += direction * move_speed * delta
	
	# プレーヤーから指定距離離れたら消す
	var player = get_tree().get_first_node_in_group("player")
	var distance = global_position.distance_to(player.global_position)
	if distance > bullet_range:
		queue_free()

func _on_body_entered(body: Node2D) -> void:
	if body.is_in_group("enemies"):
		body.get_damage(damage)
		queue_free()

エネミーのバレット
プレイヤーに当たったかを検出
playerグループのget_damageにdamageを渡す

extends Area2D

# 移動スピード
const move_speed = 200.0
# バレットダメージ
var damage = 1

var direction = 1

func _ready() -> void:
	await get_tree().create_timer(3).timeout
	queue_free()

func _physics_process(delta: float) -> void:
	position.y += direction * move_speed * delta
	


func _on_body_entered(body: Node2D) -> void:
	if body.is_in_group("player"):
		body.get_damage(damage)
		queue_free()

プレイヤー
バレットが当たった場合、get_damageでHPを引く処理

extends CharacterBody2D

# 移動スピード
const move_speed = 100.0
# 傾き
var turnTilt = 4
# HP
var health = 10

var direction: Vector2

# バレット
var canShoot = true 
const BULLET = preload("res://scenes/bullet.tscn")
@onready var marker_2d: Marker2D = $Marker2D
@onready var shoot_timer: Timer = $shootTimer

func _ready() -> void:
	add_to_group("player")

func _physics_process(delta: float) -> void:
	direction.x = Input.get_axis("move_left", "move_right")
	direction.y = Input.get_axis("move_up", "move_down")
	
	if direction.x:
		velocity = direction.normalized() * move_speed
		if direction.x < 0:
			rotation = -1 * turnTilt * delta
		elif direction.x > 0:
			rotation = 1 * turnTilt * delta
	elif direction.y:
		velocity = direction.normalized() * move_speed
		rotation = 0 * turnTilt * delta
	else :
		velocity = Vector2.ZERO

	# 攻撃
	if Input.is_action_pressed("shoot"):
		shoot()

	position += velocity * delta

	# 画面の外に行かないように	
	var viewRect = get_viewport_rect()
	var viewOffset = Vector2(50, 50)
	position = position.clamp(viewOffset, viewRect.size - viewOffset)

	move_and_slide()

func shoot():
	if canShoot:
		canShoot = false
		shoot_timer.start()

		var bullet = BULLET.instantiate()
		bullet.set_position(marker_2d.global_position)
		get_parent().add_child(bullet)

func _on_shoot_timer_timeout() -> void:
	canShoot = true
	
func get_damage(damage):
	health -= damage
	print("Play Damage")
	if health <= 0:
		queue_free()

エネミーのget_damage
プレイヤー同様にdamageをHPから引く

extends CharacterBody2D

# 移動スピード
const move_speed = 30.0
# HP
var health = 10

var direction: Vector2

# バレット
var canShoot = true
const ENEMY_BULLET = preload("res://scenes/enemy_bullet.tscn")
@onready var marker_2d: Marker2D = $Marker2D
@onready var shoot_timer: Timer = $shootTimer

func _ready() -> void:
	add_to_group("enemies")

func _physics_process(delta: float) -> void:
	direction.y = 1
	velocity = direction.normalized() * move_speed
	position += velocity * delta

	shoot()
	
	move_and_slide()

func _on_visible_on_screen_notifier_2d_screen_exited() -> void:
	print("outside")
	queue_free()
	
func shoot():
	if canShoot:
		canShoot = false
		shoot_timer.start()

		var bullet = ENEMY_BULLET.instantiate()
		bullet.set_position(marker_2d.global_position)
		get_parent().add_child(bullet)

func _on_shoot_timer_timeout() -> void:
	canShoot = true

func get_damage(damage):
	health -= damage
	print("Enemy Damage")
	if health <= 0:
		queue_free()