[07]バレットによるダメージを追加
プレイヤーバレット
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()