【发布时间】:2022-01-06 18:31:12
【问题描述】:
我不擅长编码。我目前正在尝试制作一个可以在玩家攻击时被破坏的 2D 盒子,但是(就像我之前说的)我不擅长编码。我设法让它工作了一些(我的意思是一点也不)盒子有一个动画,当玩家在范围内攻击时播放,但动画几乎从不播放(有时它会但我不知道为什么)
盒子代码
extends Area2D
var inside = false
var attacking = false
func _physics_process(delta):
pass
func _on_Area2D_body_entered(body):
if Input.is_action_just_pressed("Attack"):
$AnimationPlayer.play("box_hit")
$boxdeathtimer.set_wait_time(0.5)
$boxdeathtimer.start()
func _on_boxdeathtimer_timeout():
queue_free()
武器代码(如果需要)
extends RigidBody2D
var picked = false
func _ready():
Global.weapon = self
func _exit_tree():
Global.weapon = null
var attacking = false
func _physics_process(delta):
if picked == true:
self.position = get_node("../player/Position2D").global_position
func _input(event):
if Input.is_action_just_pressed("e"): #picks up weapon when in range
var bodies = $detector.get_overlapping_bodies()
for b in bodies:
if (b.get_name() == "player"):
picked = true
sleeping = true
rotation_degrees = 90
if Input.is_action_just_pressed("Attack"):
if picked == true && Global.player.facing_right == true:
$AnimationPlayer.play("attack")
attacking = true
if picked == true && Global.player.facing_right == false:
$AnimationPlayer.play("attack2")
attacking = true
【问题讨论】:
-
假设
Global.player是get_node("../player/"),你可以在拾取武器的代码中查看if (b == Global.player)。事实上,您可以查看$detector.overlaps_body(Global.player)。此外,要让武器随玩家移动,您可以这样做:get_parent().remove_child(self); Global.player.get_node("Position2D").add_child(self),并且您不必在每个物理帧都传送武器。编辑:像这样删除它会触发_exit_tree。编辑 2:另见is_queued_for_deletion和is_instance_valid。