首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >戈多-游戏冻结时,Area2D监控打开

戈多-游戏冻结时,Area2D监控打开
EN

Stack Overflow用户
提问于 2022-01-17 20:38:58
回答 1查看 160关注 0票数 1

所以当我的玩家从地图上掉下来的时候,我想要这个级别重新加载。我使用area2d和collisionshape2d创建了一个区域,当播放器与该区域发生冲突时,该区域将调用一个函数。然而,当游戏运行这个代码包括,玩家将通过几帧动画,然后游戏完全冻结之前,我甚至可以移动玩家。

代码语言:javascript
复制
func _on_Area2D_body_entered(body):
   get_tree().reload_current_scene()

如果我删除此代码,或将监视设置为off,并重新运行该游戏,它将不会冻结。

下面是我的水平设计的截图。

水平设计

任何帮助都是非常感激的:) --这是一个bug,还是我在做一些蠢事?

当我在get_tree().reload_current_scene()行上设置断点时,下面的报告显示

调试器

这是否意味着玩家正在与瓷砖相撞--如果是这样的话,我看不出程序是如何在玩家接触地面之前冻结的。

EN

回答 1

Stack Overflow用户

发布于 2022-01-17 23:43:36

正如我在评论中所说,这一行:

代码语言:javascript
复制
get_tree().reload_current_scene()

返回一个值。

现在,您已经说过0是“不断输出的”。在这种情况下,0的意思是OK,换句话说:它能够重新加载场景。问题是“持续”部分。这意味着场景重新加载,然后这个代码被触发,然后重新加载,然后这个代码再次被触发,依此类推。

现在,很明显,Area2D正在与TileMap相撞。这事儿可以理解。如果在加载场景时是Area2D和瓷砖之间的碰撞,您将得到所观察到的行为。而Area2DTileMap在场景中的定位方式支持了这一想法。

以及修复它的事。我将给出三种解决方案,其中任何一种都会有效,并说明它们的缺点和注意事项:

  • 不要将Area2D定位在与不可通行的瓷砖相交的位置。通过将Area2D进一步向下移动,或者移除任何重叠的块,这很容易做到。 这种方法的缺点是它是脆弱的。您可能会忘记在未来,并移动Area2D或添加瓷砖或其他东西,使问题返回。而且,它可能不能很好地与您的预期场景设计。
  • 以这样的方式更改collision_maskcollision_layer,使tiles和Area2D不会碰撞。只要掩码中的比特不与另一层的比特重叠,反之亦然,戈多甚至不会检查它们之间的碰撞。 这种方法的主要缺点是层数有限。 还有一个事实,那就是简单地把事物放置在不发生碰撞的方式是不那么直观的。 为了使工作更容易,将层分配给不同类型的事物(…)。转到您的项目设置,在通用选项卡的图层名称和2D物理,并给他们命名(例如“环境”,“敌人”,“敌人子弹”,“玩家”,“玩家子弹”,“项目”,“其他”)。 然后,您可以在collision_layer上为每个对象分配它们是什么,并在collision_mask上设置它们必须与之冲突的所有东西。请注意戈多会检查两种方式。 在本例中,您将将player字符物理对象( collision_layer )的KinematicBody2D设置为"player“(或类似的),并将Area2Dcollision_mask设置为相同,因此它们会发生冲突。将collision_layer of TileMap设置为不在collision_mask of Area2D中的其他东西(例如“环境”),这样Area2DTileMap就不会发生冲突。并将播放机字符的collision_mask设置为包含您设置为TileMap的层的内容,因此播放机字符也会与之发生冲突。我希望这是有意义的。
  • 当然,您也可以在Area2D上进行过滤,只需一点代码。它可以是检查类、节点组或物理体的名称。例如,您可以在方法的开头插入类似于以下内容的内容:if body.name != "player": return。因此,除非它是正确的物理体,否则它会在到达reload_current_scene之前退出该方法。 这种方法的缺点是仍然在检查和注册冲突,因此使用collision_maskcollision_layer的性能较差。但它会工作,它将表现良好的一个小到中型游戏。

对于更复杂的情况,您可以使用这些方法的组合(因为,正如我所说的,层的数量有限,因此需要在其之上添加筛选)。我将更详细地解释如何在另一个答案中设置物理对象,包括这里提到的技术。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70747260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档