遇到节点获取问题别慌,我们先从基础排查。以下是代码的主要问题和修正方案:
主要问题分析:
- 变量未初始化:bullets和distances需要初始化为空数组
- 节点路径错误:获取Player节点的路径可能不正确
- 子弹距离计算错误:distance_to()参数使用错误
- 子弹实例未正确存储:list变量未正确赋值
修正后的完整代码:
- extends Area2D
- var launcher: CharacterBody2D
- @export var speed : float = 300.0
- @export var rate : float = 0.2
- @export var max_distance : float = 500.0
- var bullets = [] # 修复1:初始化数组
- var scene = preload("res://bullet/bullet.tscn")
- var is_firing := false
- func _ready() -> void:
- # 修复2:使用更可靠的节点路径获取方式
- launcher = get_parent().get_node("Player") # 假设Player节点与当前节点同级
-
- if not launcher:
- push_error("无法找到 launcher 节点! 检查节点路径是否正确")
- func _process(delta: float) -> void:
- # 修复3:改用临时数组避免遍历时修改原始数组
- var to_remove = []
-
- for bullet in bullets:
- var direction = Vector2.UP.rotated(bullet.rotation).normalized()
- bullet.position += direction * speed * delta
-
- # 修复4:正确计算移动距离
- if bullet.global_position.distance_to(launcher.global_position) >= max_distance:
- to_remove.append(bullet)
- bullet.queue_free()
-
- # 移除超出距离的子弹
- for bullet in to_remove:
- bullets.erase(bullet)
- func _create_bullet() -> void:
- var ins = scene.instantiate()
- add_child(ins)
- bullets.append(ins) # 修复5:直接添加实例到数组
-
- # 设置初始位置和旋转
- ins.global_position = launcher.global_position
- ins.global_rotation = launcher.global_rotation
复制代码
常见排查步骤:
1. 确认Player节点的
name属性确实为"Player"
2. 检查场景树层级关系(按F1打开场景面板)
3. 在Player脚本中添加
print(get_path())查看实际路径
4. 确保子弹场景(bullet.tscn)的根节点是继承自Area2D/Node2D
5. 在项目设置中检查输入映射的"fire"动作是否正确定义
如果问题仍然存在,可以尝试使用绝对路径获取节点:
- launcher = get_node("/root/MainScene/Player") # 根据实际场景路径调整
复制代码
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。