Godot debug window 不触发 area2d 信号
Godot debug window not triggering area2d signals
Video of what's happening exactly
规格是:
- 正在录制的显示器 2560x1080@60hz
- 显示 window 离开屏幕 3840x2160@24hz(也用 60hz 测试)
- Windows 10
- GPU 英伟达 970 GTX
这周刚开始学习 godot 并且因为这种奇怪的行为而浪费了几个小时。
Godot 细节:
- 不修改形状和主体的比例(不要混淆物理)
- 开始尝试创建一个扩展 KinematicBody2D 的实体 class,以在我的游戏中创建敌人实例。现在只是使用虚拟块来测试碰撞是否确实有效(由于视频中发生的事情而在此处停止)
- 具有一个正方形纹理的大虚拟正方形称为实体,具有巨大 Y 尺寸的碰撞只是为了测试一下。
- 我要触发信号的area2d就是人物前面的小矩形
是否有什么我应该知道的导致信号仅在调试 window 在另一个显示器上时触发?我是否应该将调试 window 移动到另一个显示器并相信游戏会正常运行?
代码片段
在我的动画控制器中创建 Area2D
func _create_shape_with_collision(s : Shape2D, parentNode : Node) -> Node:
var ret = Area2D.new()
ret.connect('body_entered', self, '_check_body_entered')
var c = CollisionShape2D.new()
c.shape = s
parentNode.add_child(ret)
c.disabled = true
c.name = 'collision_shape'
ret.add_child(c)
return ret
信号函数
func _check_body_entered(body : Node):
print(body.name)
PS:尝试在 Godot 的界面中输入一些内容以帮助自动完成,但我创建的 classes 无法正常工作。
PS2:在 godot 的 reddit 页面上发布了同样的消息,希望能有更好的知名度
确保 Area2D 节点中有匹配的碰撞层和遮罩。
Shape2D 是一种资源,这意味着如果您不创建 .new() ,那么所有 CollisionShape2D 都使用相同的形状实例。如果任何人明确地设置它 free 它对每个人都消失了(所以如果你不小心分配了一个空形状,请尝试打印)。当 CollisionShape2D 准备就绪时,在分配后调整大小没有发生一些奇怪的事情。
但你也有 c.disabled = true
可能不应该在那里。
因为@Theraot 为在 Godot 的 Github 页面上写一个问题铺平了道路,我能够确定上述 bug 的原因,同时创建一个最小的项目。
其实跟代码一点关系都没有,而是跟项目设置有关。物理 FPS 设置为 60,而我的辅助屏幕能够捕获事件,因为默认情况下 VSYNC 也处于打开状态(在刷新率下设置 FPS 上限,辅助屏幕为 24hz)。
将物理 FPS 增加到 120(此时为 empyrical)使信号在所有显示器上都有效。
将很乐意接受更好的答案,解释更改此类数字的影响(对设备的压力等),如果这是一种不好的做法,或者是否有另一种方法可以为 Area2Ds 或 PhysicsBody2Ds 配置单个更快的刻度.由于我目前缺少knowledge/research,无法写出这样的答案。试图在这个时候写它是一种诡辩。
由于我只是在编写游戏设计文档时编写一些基本的游戏元素,所以到目前为止对我来说还不错。
编辑:
在用户@Theraot 的洞察之后,我忽略了 _process 和 _physics_process 的不同之处;对于我的用例,我所做的大部分工作应该在 _physics_process 内,因此我可以将引擎的物理 FPS 恢复为默认值。
Video of what's happening exactly
规格是:
- 正在录制的显示器 2560x1080@60hz
- 显示 window 离开屏幕 3840x2160@24hz(也用 60hz 测试)
- Windows 10
- GPU 英伟达 970 GTX
这周刚开始学习 godot 并且因为这种奇怪的行为而浪费了几个小时。
Godot 细节:
- 不修改形状和主体的比例(不要混淆物理)
- 开始尝试创建一个扩展 KinematicBody2D 的实体 class,以在我的游戏中创建敌人实例。现在只是使用虚拟块来测试碰撞是否确实有效(由于视频中发生的事情而在此处停止)
- 具有一个正方形纹理的大虚拟正方形称为实体,具有巨大 Y 尺寸的碰撞只是为了测试一下。
- 我要触发信号的area2d就是人物前面的小矩形
是否有什么我应该知道的导致信号仅在调试 window 在另一个显示器上时触发?我是否应该将调试 window 移动到另一个显示器并相信游戏会正常运行?
代码片段
在我的动画控制器中创建 Area2D
func _create_shape_with_collision(s : Shape2D, parentNode : Node) -> Node:
var ret = Area2D.new()
ret.connect('body_entered', self, '_check_body_entered')
var c = CollisionShape2D.new()
c.shape = s
parentNode.add_child(ret)
c.disabled = true
c.name = 'collision_shape'
ret.add_child(c)
return ret
信号函数
func _check_body_entered(body : Node):
print(body.name)
PS:尝试在 Godot 的界面中输入一些内容以帮助自动完成,但我创建的 classes 无法正常工作。
PS2:在 godot 的 reddit 页面上发布了同样的消息,希望能有更好的知名度
确保 Area2D 节点中有匹配的碰撞层和遮罩。
Shape2D 是一种资源,这意味着如果您不创建 .new() ,那么所有 CollisionShape2D 都使用相同的形状实例。如果任何人明确地设置它 free 它对每个人都消失了(所以如果你不小心分配了一个空形状,请尝试打印)。当 CollisionShape2D 准备就绪时,在分配后调整大小没有发生一些奇怪的事情。
但你也有 c.disabled = true
可能不应该在那里。
因为@Theraot 为在 Godot 的 Github 页面上写一个问题铺平了道路,我能够确定上述 bug 的原因,同时创建一个最小的项目。
其实跟代码一点关系都没有,而是跟项目设置有关。物理 FPS 设置为 60,而我的辅助屏幕能够捕获事件,因为默认情况下 VSYNC 也处于打开状态(在刷新率下设置 FPS 上限,辅助屏幕为 24hz)。
将物理 FPS 增加到 120(此时为 empyrical)使信号在所有显示器上都有效。
将很乐意接受更好的答案,解释更改此类数字的影响(对设备的压力等),如果这是一种不好的做法,或者是否有另一种方法可以为 Area2Ds 或 PhysicsBody2Ds 配置单个更快的刻度.由于我目前缺少knowledge/research,无法写出这样的答案。试图在这个时候写它是一种诡辩。
由于我只是在编写游戏设计文档时编写一些基本的游戏元素,所以到目前为止对我来说还不错。
编辑:
在用户@Theraot 的洞察之后,我忽略了 _process 和 _physics_process 的不同之处;对于我的用例,我所做的大部分工作应该在 _physics_process 内,因此我可以将引擎的物理 FPS 恢复为默认值。