godot 如何知道点击是否在精灵内部:
godot how to know if a click is inside a sprite :
我有一个 p12 Sprite,它有一个 KinematicBody2D,而 KinematicBody2D 有一个 Collision polygon2d。
我正在尝试检查鼠标点击是否在 p12 内:
var inside : bool = p12.get_node("KinematicBody2D").has_point(to_local(pos))
或
var inside : bool = p12.get_node("KinematicBody2D").get_node("Collision polygon2d").has_point(to_local(pos))
没有工作。
知道如何检查点击是否在我的 sprite 内部吗?
这是我的代码:
func wich_piece(mouse_pos : Vector2 ):
for piece in pieces:
var inside : bool = ((piece as Sprite).get_node("KinematicBody2D") as KinematicBody).has_point(to_local(mouse_pos))
if inside:
return piece
return null
此致
如果我没理解错的话,您想检测 sprite 中的鼠标点击吗?
我假设你的精灵在 KinematicBody2D
中,像这样:
将 KinematicBody2D
中的信号 input_event()
连接到任何脚本并检查鼠标是否在其中单击:
func _on_KinematicBody2D_input_event(viewport, event, shape_idx):
if(event.is_pressed()):
print("pressed!")
现在每次点击我都会收到这样的信号:
I have a p12 Sprite that have a KinematicBody2D and the KinematicBody2D have a Collision polygon2d.
这是一个奇怪的设置,这意味着如果您移动 KinematicBody2D
而 Sprite
则不会。您确定不希望将 KinematicBody2D
与 Sprite
作为 child 吗?
如果你想知道某个位置是否在精灵内部,你可以这样做:
var inside:bool = p12.get_rect().has_point(p12.to_local(pos))
请注意,我在 Sprite
上呼叫 to_local
。如果您使用的是本地坐标,那么它们的本地坐标很重要。 当然,我一开始就假设 pos
在全球坐标系中。
但是,如果目标是查找某个位置是否在 PhysicsBody2D
(例如 KinematicBody2D
)内,我们会做一些不同的事情。
我们可以这样做:
func collides(body:PhysicsBody2D, pos:Vector2) -> bool:
var results := get_world_2d().direct_space_state.intersect_point(pos)
for result in results:
if result.collider == body:
return true
return false
正如您想象的那样,如果我们像您一样遍历数组,那将是一种浪费。由于 intersect_point
已经告诉我们 PhysicsBody2D
,您将采用不同的方法。像这样:
func wich_piece(pos:Vector2):
var bodies := []
var results := get_world_2d().direct_space_state.intersect_point(pos)
for result in results:
bodies.append(result.collider)
for piece in pieces:
var body := ((piece as Sprite).get_node("KinematicBody2D") as KinematicBody)
if bodies.has(body):
return piece
return null
但如果您真正想要的只是找出用户何时单击 KinematicBody2D
。将 input_pickable
设置为 true
。您将获得 "mouse_entered"
、"mouse_exited
" 和 "input_event"
信号。加上对 _input_event
.
的调用
我有一个 p12 Sprite,它有一个 KinematicBody2D,而 KinematicBody2D 有一个 Collision polygon2d。
我正在尝试检查鼠标点击是否在 p12 内:
var inside : bool = p12.get_node("KinematicBody2D").has_point(to_local(pos))
或
var inside : bool = p12.get_node("KinematicBody2D").get_node("Collision polygon2d").has_point(to_local(pos))
没有工作。
知道如何检查点击是否在我的 sprite 内部吗?
这是我的代码:
func wich_piece(mouse_pos : Vector2 ):
for piece in pieces:
var inside : bool = ((piece as Sprite).get_node("KinematicBody2D") as KinematicBody).has_point(to_local(mouse_pos))
if inside:
return piece
return null
此致
如果我没理解错的话,您想检测 sprite 中的鼠标点击吗?
我假设你的精灵在 KinematicBody2D
中,像这样:
将 KinematicBody2D
中的信号 input_event()
连接到任何脚本并检查鼠标是否在其中单击:
func _on_KinematicBody2D_input_event(viewport, event, shape_idx):
if(event.is_pressed()):
print("pressed!")
现在每次点击我都会收到这样的信号:
I have a p12 Sprite that have a KinematicBody2D and the KinematicBody2D have a Collision polygon2d.
这是一个奇怪的设置,这意味着如果您移动 KinematicBody2D
而 Sprite
则不会。您确定不希望将 KinematicBody2D
与 Sprite
作为 child 吗?
如果你想知道某个位置是否在精灵内部,你可以这样做:
var inside:bool = p12.get_rect().has_point(p12.to_local(pos))
请注意,我在 Sprite
上呼叫 to_local
。如果您使用的是本地坐标,那么它们的本地坐标很重要。 当然,我一开始就假设 pos
在全球坐标系中。
但是,如果目标是查找某个位置是否在 PhysicsBody2D
(例如 KinematicBody2D
)内,我们会做一些不同的事情。
我们可以这样做:
func collides(body:PhysicsBody2D, pos:Vector2) -> bool:
var results := get_world_2d().direct_space_state.intersect_point(pos)
for result in results:
if result.collider == body:
return true
return false
正如您想象的那样,如果我们像您一样遍历数组,那将是一种浪费。由于 intersect_point
已经告诉我们 PhysicsBody2D
,您将采用不同的方法。像这样:
func wich_piece(pos:Vector2):
var bodies := []
var results := get_world_2d().direct_space_state.intersect_point(pos)
for result in results:
bodies.append(result.collider)
for piece in pieces:
var body := ((piece as Sprite).get_node("KinematicBody2D") as KinematicBody)
if bodies.has(body):
return piece
return null
但如果您真正想要的只是找出用户何时单击 KinematicBody2D
。将 input_pickable
设置为 true
。您将获得 "mouse_entered"
、"mouse_exited
" 和 "input_event"
信号。加上对 _input_event
.