创建新文件夹

  • 创建一个GeneralNodes文件夹来放置通用文件
    • 在下面创建一个HitBox(被伤害的节点)
      • 创建一个Area2D类型的场景
      • 取消Monitoring选项,不会主动检测碰撞
      • 保留Monitorable选项,表示可以被检测
      • Collision选择第九层
      • 创建一个hit_box的脚本
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        class_name HitBox extends Area2D

        signal Damaged( damage: int)

        func _ready() -> void:
        pass

        func _process(delta: float) -> void:
        pass

        func TakeDamage( damage: int) -> void:
        print("take damage", damage)
        Damaged.emit(damage)
      • 创建一个信号,在收到伤害的时候发送信号,让监听的节点处理
    • 创建一个HurtBox(伤害节点)
      • 创建一个Area2D类型的场景
      • 保留Monitoring选项,主动检测碰撞
      • 取消Monitorable选项,不被检测碰撞
      • Collision Mask 第二层,表示和第二层的物体进行碰撞
      • 创建一个hurt_box脚本
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        class_name HurtBox extends Area2D

        @export var damage: int = 1

        func _ready() -> void:
        area_entered.connect( AreaEntered )
        pass

        func _process(delta: float) -> void:
        pass

        func AreaEntered( a : Area2D) -> void:
        if a is HitBox:
        a.TakeDamage(damage)
        pass

    • 创建一个植物场景
      • 引入一个HitBox,表示这是一个可以被伤害的部分

      • 加入一个staticBody

      • 将其Layer设置为5,表示和第五层有交互的可以触碰

      • 添加plant脚本

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
         class_name Plant extends Node

        func _ready() -> void:
        $HitBox.Damaged.connect(TakeDamage)
        pass

        func _process(delta: float) -> void:
        pass

        func TakeDamage(damage: int) -> void:
        queue_free()
        pass
      • 监听HitBox的通知

      • player和playground的y sort enable要打开

    • Player添加一个Node2D类型的名称为Interaction的节点
      • 在这下面添加HurtBox,选择一个图形,表示可以造成伤害

      • 在状态机Attack下添加代码

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        	func  Enter() -> void:
        player.UpdateAnimation("attack")
        attack_animation_player.play("attack_" + player.AnimationDirection())
        animation_player.animation_finished.connect( EndAttack )
        audio.stream = audio_stream
        audio.pitch_scale = randf_range(0.9, 1.1)
        audio.play()
        attacking = true
        await get_tree().create_timer(0.075).timeout
        hurt_box.monitoring = true
        pass

        func Exit() -> void:
        animation_player.animation_finished.disconnect( EndAttack )
        hurt_box.monitoring = false
        pass
      • 为Interaction节点添加脚本PlayerInteractionHost

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        class_name PlayerInteractionHost extends Node2D

        @onready var player: Player = $".."

        func _ready() -> void:
        player.DirectionChanged.connect(DirectionChanged)
        pass

        func DirectionChanged(direction: Vector2) -> void:
        match direction:
        Vector2.DOWN:
        rotation_degrees = 0
        Vector2.UP:
        rotation_degrees= 180
        Vector2.LEFT:
        rotation_degrees = 90
        Vector2.RIGHT:
        rotation_degrees = -90
        _:
        rotation_degrees = 0
        pass
      • 同时修改Player脚本,新增信号,在收到DirectionChanged信号时修改hurtBox的方向