为何CollisionShape2D的位置在理应不可修改后仍发生变化?
问题:所有碰撞盒位置与最后一个碰撞盒重合
我为cursor节点编写了如下GDScript代码:
extends Node2D # @onready var parent = $".", @export var lineTemplate: PackedScene = preload("res://scenes/Gameplay/linemaker/lineTemplate.tscn") @export var collisionTemplate: PackedScene = preload("res://scenes/Gameplay/linemaker/hitbox.tscn") @onready var lineContainer := lineTemplate.instantiate() @onready var line := lineContainer.get_node("Line2D") # Called when the node enters the scene tree for the first time. func _ready() -> void: Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN) # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: position = get_global_mouse_position() func _input(event: InputEvent) -> void: if event.is_action_pressed("drawEvent"): addLinePoint(position) func addLinePoint(mousePosition: Vector2) -> void: line.add_point(mousePosition) if line.get_point_count() == 1: get_parent().add_child(lineContainer) if line.get_point_count() > 1: var collision = collisionTemplate.instantiate() collision.shape.a = line.get_point_position(line.get_point_count()-2) collision.shape.b = line.get_point_position(line.get_point_count()-1) collision.name = "Segment%sHitbox" % (line.get_point_count()-1) lineContainer.add_child(collision)
相关场景、lineTemplate、hitbox的布局已配置完成。
出现的问题:所有碰撞盒的位置均与最后一个碰撞盒重合,例如Segment1Hitbox与Segment2Hitbox、Segment3Hitbox位置完全相同,开启“Visible Collision Shapes”后该问题清晰可见。
我曾推测是变量引用问题,尝试改用数组存储碰撞盒,但修改后的代码并未改善问题:
extends Node2D # @onready var parent = $".", @export var lineTemplate: PackedScene = preload("res://scenes/Gameplay/linemaker/lineTemplate.tscn") @export var collisionTemplate: PackedScene = preload("res://scenes/Gameplay/linemaker/hitbox.tscn") @onready var lineContainer := lineTemplate.instantiate() @onready var line := lineContainer.get_node("Line2D") var collision: Array[CollisionShape2D] = [collisionTemplate.instantiate()] # Called when the node enters the scene tree for the first time. func _ready() -> void: Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN) # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: position = get_global_mouse_position() func _input(event: InputEvent) -> void: if event.is_action_pressed("drawEvent"): addLinePoint(position) func addLinePoint(mousePosition: Vector2) -> void: line.add_point(mousePosition) if line.get_point_count() == 1: get_parent().add_child(lineContainer) if line.get_point_count() > 1: collision.append(collisionTemplate.instantiate()) collision[line.get_point_count() - 2].shape.a = line.get_point_position(line.get_point_count()-2) collision[line.get_point_count() - 2].shape.b = line.get_point_position(line.get_point_count()-1) collision[line.get_point_count() - 2].name = "Segment%sHitbox" % (line.get_point_count()-1) lineContainer.add_child(collision[line.get_point_count() - 2])
内容的提问来源于stack exchange,提问作者Kaympe20
相关产品推荐
相关产品推荐

