CollisionObject2D
继承: Node2D < CanvasItem < Node < Object
派生: Area2D, PhysicsBody2D
2D 物理对象的抽象基类。
描述
2D 物理对象的抽象基类。CollisionObject2D 能够容纳任意数量的 Shape2D 用作碰撞形状。每个形状必须分配给一个形状所有者。形状所有者不是节点,也不会出现在编辑器中,但可以通过代码使用 shape_owner_*
方法访问。
注意:仅支持相同画布中不同对象的碰撞(Viewport 画布或 CanvasLayer)。不同画布中的对象之间的碰撞行为是未定义的。
属性
| ||
| ||
| ||
| ||
|
方法
信号
input_event(viewport: Node, event: InputEvent, shape_idx: int) 🔗
当输入事件发生时发出。要求 input_pickable 为 true
并且至少设置了一个 collision_layer 位。详见 _input_event。
mouse_entered() 🔗
当鼠标指针进入该对象的任何形状时发出。要求 input_pickable 为 true
并且至少设置了一个 collision_layer 位。请注意,在单个 CollisionObject2D 中的不同形状之间移动,不会导致发出该信号。
注意:由于缺少连续的碰撞检测,如果鼠标移动得足够快并且 CollisionObject2D 的区域很小,则该信号可能不会按预期的顺序发出。如果另一个 CollisionObject2D 与所讨论的 CollisionObject2D 重叠,则也可能不会发出该信号。
mouse_exited() 🔗
当鼠标指针离开该对象的所有形状时发出。要求 input_pickable 为 true
并且至少设置了一个 collision_layer 位。请注意,在单个 CollisionObject2D 中的不同形状之间移动,不会导致发出该信号。
注意:由于缺少连续的碰撞检测,如果鼠标移动得足够快并且 CollisionObject2D 的区域很小,则该信号可能不会按预期的顺序发出。如果另一个 CollisionObject2D 与所讨论的 CollisionObject2D 重叠,则也可能不会发出该信号。
mouse_shape_entered(shape_idx: int) 🔗
当鼠标指针进入该实体的任何形状或从一种形状移动到另一种形状时发出。shape_idx
是新进入的 Shape2D 的子索引。要求 input_pickable 为 true
并且至少设置一个 collision_layer 位。
mouse_shape_exited(shape_idx: int) 🔗
当鼠标指针离开该实体的任何形状时发出。shape_idx
是退出的 Shape2D 的子索引。要求 input_pickable 为 true
并且至少设置一个 collision_layer 位。
枚举
enum DisableMode: 🔗
DisableMode DISABLE_MODE_REMOVE = 0
当 Node.process_mode 被设置为 Node.PROCESS_MODE_DISABLED 时,从物理仿真中移除,停止与此 CollisionObject2D 的所有物理交互。
当该 Node 再次被处理时,会自动重新加入到物理仿真中。
DisableMode DISABLE_MODE_MAKE_STATIC = 1
当 Node.process_mode 被设置为 Node.PROCESS_MODE_DISABLED 时,使物体进入静态模式。不影响 Area2D。处于静态模式的 PhysicsBody2D 不会受到力和其他物体的影响。
当该 Node 再次被处理时,会自动将 PhysicsBody2D 设置回其原始模式。
DisableMode DISABLE_MODE_KEEP_ACTIVE = 2
当 Node.process_mode 被设置为 Node.PROCESS_MODE_DISABLED 时,不影响物理仿真。
属性说明
此 CollisionObject2D 所在的物理层。碰撞对象可以存在于 32 个不同层中的一个或多个中。另见 collision_mask。
注意:只有当对象 B 在对象 A 扫描的任何层中时,对象 A 才能检测到与对象 B 的接触。有关更多信息,请参阅文档中的《碰撞层与掩码》。
此 CollisionObject2D 扫描的物理层。碰撞对象可以扫描 32 个不同层中的一个或多个。另见 collision_layer。
注意:只有当对象 B 在对象 A 扫描的任何层中时,对象 A 才能检测到与对象 B 的接触。有关更多信息,请参阅文档中的《碰撞层与掩码》。
float collision_priority = 1.0
🔗
发生穿透时用于解决碰撞的优先级。优先级越高,对物体的穿透度就越低。例如,可以用来防止玩家突破关卡的边界。
DisableMode disable_mode = 0
🔗
void set_disable_mode(value: DisableMode)
DisableMode get_disable_mode()
当 Node.process_mode 被设置为 Node.PROCESS_MODE_DISABLED 时,定义物理行为。有关不同模式的更多详细信息,请参阅 DisableMode。
如果为 true
,则该对象是可拾取的。可拾取的对象可以检测鼠标指针的进入/离开,鼠标位于其中时,就会报告输入事件。要求至少设置一个 collision_layer 位。
方法说明
void _input_event(viewport: Viewport, event: InputEvent, shape_idx: int) virtual 🔗
接收未处理的 InputEvent。shape_idx
是被点击的 Shape2D 的子索引。连接到 input_event 即可轻松获取这些事件。
注意:_input_event 要求 input_pickable 为 true
,并且至少要设置一个 collision_layer 位。
void _mouse_enter() virtual 🔗
当鼠标指针进入该实体的任何形状时调用。要求 input_pickable 为 true
并且至少设置了一个 collision_layer 位。请注意,在单个 CollisionObject2D 中的不同形状之间移动,不会导致该函数被调用。
void _mouse_exit() virtual 🔗
当鼠标指针退出该实体的所有形状时调用。要求 input_pickable 为 true
并且至少设置了一个 collision_layer 位。请注意,在单个 CollisionObject2D 中的不同形状之间移动,不会导致该函数被调用。
void _mouse_shape_enter(shape_idx: int) virtual 🔗
当鼠标指针进入该实体的任何形状或从一个形状移动到另一个形状时调用。shape_idx
是新进入的 Shape2D 的子索引。要求 input_pickable 为 true
并且要至少设置一个 collision_layer 位。
void _mouse_shape_exit(shape_idx: int) virtual 🔗
当鼠标指针离开该实体的任何形状时调用。shape_idx
是退出的 Shape2D 的子索引。要求 input_pickable 为 true
并且至少要设置一个 collision_layer 位。
int create_shape_owner(owner: Object) 🔗
为给定对象创建一个新的形状所有者。返回 owner_id
的新所有者,供将来引用。
bool get_collision_layer_value(layer_number: int) const 🔗
返回 collision_layer 中是否启用了指定的层,给定的 layer_number
应在 1 和 32 之间。
bool get_collision_mask_value(layer_number: int) const 🔗
返回 collision_mask 中是否启用了指定的层,给定的 layer_number
应在 1 和 32 之间。
返回对象的 RID。
float get_shape_owner_one_way_collision_margin(owner_id: int) const 🔗
返回由给定 owner_id
标识的形状所有者的 one_way_collision_margin
。
PackedInt32Array get_shape_owners() 🔗
返回一个 owner_id
标识符的 Array。你可以在其他使用 owner_id
作为参数的方法中使用这些 ID。
bool is_shape_owner_disabled(owner_id: int) const 🔗
如果为 true
,则禁用形状所有者及其形状。
bool is_shape_owner_one_way_collision_enabled(owner_id: int) const 🔗
返回 true
,如果源于这个 CollisionObject2D 的形状所有者的碰撞不会被报告给 CollisionObject2D。
void remove_shape_owner(owner_id: int) 🔗
移除给定形状的所有者。
void set_collision_layer_value(layer_number: int, value: bool) 🔗
根据 value
,启用或禁用 collision_layer 中指定的层,给定的 layer_number
应在 1 和 32 之间。
void set_collision_mask_value(layer_number: int, value: bool) 🔗
根据 value
,启用或禁用 collision_mask 中指定的层,给定的 layer_number
应在 1 和 32 之间。
int shape_find_owner(shape_index: int) const 🔗
返回指定形状的 owner_id
。
void shape_owner_add_shape(owner_id: int, shape: Shape2D) 🔗
给形状所有者添加一个 Shape2D。
void shape_owner_clear_shapes(owner_id: int) 🔗
移除形状所有者的所有形状。
Object shape_owner_get_owner(owner_id: int) const 🔗
返回给定形状所有者的父对象。
Shape2D shape_owner_get_shape(owner_id: int, shape_id: int) const 🔗
从给定形状所有者返回具有给定 ID 的 Shape2D。
int shape_owner_get_shape_count(owner_id: int) const 🔗
返回给定形状所有者包含的形状数量。
int shape_owner_get_shape_index(owner_id: int, shape_id: int) const 🔗
从给定形状所有者返回具有给定 ID 的 Shape2D 的子索引。
Transform2D shape_owner_get_transform(owner_id: int) const 🔗
返回形状所有者的 Transform2D。
void shape_owner_remove_shape(owner_id: int, shape_id: int) 🔗
从给定的形状所有者中移除一个形状。
void shape_owner_set_disabled(owner_id: int, disabled: bool) 🔗
如果为 true
,则禁用给定的形状所有者。
void shape_owner_set_one_way_collision(owner_id: int, enable: bool) 🔗
如果 enable
为 true
,则源自该 CollisionObject2D 的形状所有者的碰撞将不会被报告为与 CollisionObject2D 发生碰撞。
void shape_owner_set_one_way_collision_margin(owner_id: int, margin: float) 🔗
将由给定 owner_id
标识的形状所有者的 one_way_collision_margin
设置为 margin
像素。
void shape_owner_set_transform(owner_id: int, transform: Transform2D) 🔗
设置给定形状所有者的 Transform2D。