英文:
Collision walls in Godot
问题
我正在使用Godot Engine创建游戏,但我无法弄清楚如何创建一堵墙来防止玩家走出屏幕。
玩家可以走出屏幕窗口。如何防止这种情况发生?
我尝试使用CollisionShape2D节点,但我不认为我知道如何正确使用它,使其按照我想要的方式工作。
英文:
I'm creating a game using Godot Engine and I can't figure out how to create a wall to prevent a player from walking out of the screen.
The player is able to walk out of the screen window. How do I prevent it from happening?
I tried to use the CollisionShape2D node but I don't think I know how to use it properly in a way that it works like I want it to.
答案1
得分: 0
CollisionShape2D
和 CollisionPolygon2D
本身不执行任何操作。它们的目的是为父级 CollisionObject2D
提供形状。
有两种类型的 CollisionObject2D
:Area2D
和 PhysicsBody2D
。
Area2D
会检测其他物体或区域,但不会阻止它们移动,这通常不是您想要的。
有三种类型的 PhysicsBody2D
:
CharacterBody2D
:用于通过脚本移动,通常用于制作角色控制器。RigidBody2D
:由物理引擎移动,通常用于创建可以被其他物体推动的物体。StaticBody2D
:要么不移动(或具有预定义的运动)。这是您想要的类型。
因此,您可以设置一个带有子级 CollisionShape2D
或 CollisionPolygon2D
的 StaticBody2D
。
此外,我还要指出,物理体与物理体相互作用。例如,如果您将角色创建为 Sprite2D
,因为 Sprite2D
只关心图形而不具备碰撞功能,它不会被 StaticBody2D
阻止。
因此,通常将角色创建为可以发生碰撞的物体(通常是 CharacterBody2D
,有时是 RigidBody2D
),当然,它会有一个子级 CollisionShape2D
或 CollisionPolygon2D
,还可以将 Sprite2D
或其他所需内容作为子级。
通过将 Sprite2D
和其他 Node2D
作为物理体的子级,它们将随物理体一起移动。
如果您尚未决定使用 CharacterBody2D
还是 RigidBody2D
,我会在其他地方更详细地介绍要使用哪种类型的节点。 一个很好的概括是:如果其他东西可以推动它,请使用 RigidBody2D
。通过访问链接,您可以了解在特定情况下应该使用哪种类型的细微差别和建议。
对于 CollisionShape2D
,要将其 shape
属性设置为 Shape2D
。
关于创建游戏边界,建议使用 WorldBoundaryShape2D
来创建每个边界。但是,足够厚的 RectangleShape2D
也可以工作。
或者,虽然不建议,您可以使用覆盖游戏区域的 CollisionPolygon2D
,并将其 build_mode
设置为 BUILD_SEGMENTS
,这将导致一个空心多边形,因此其他物体可以在其中。
英文:
Note: What I explain here also holds for the 3D counterpart of these nodes.
CollisionShape2D
and CollisionPolygon2D
do nothing on their own. Their purpose is to provide a shape for a parent CollisionObject2D
.
There are two kinds of CollisionObject2D
s: Area2D
and PhysicsBody2D
.
The Area2D
will detect other bodies or areas, but won't stop them from moving, which is not what you want.
There are three kinds of PhysicsBody2D
:
CharacterBody2D
: which is intended to be moved via script, usually to make character controllers.RigidBody2D
: which is moved by the physics engine, usually to make bodies that can be pushed around by other bodies.StaticBody2D
: which either do not move (or have a predefined motion). This is the one you want.
Thus, you would setup a StaticBody2D
with a child CollisionShape2D
or CollisionPolygon2D
.
Now, I'm also going to point out that physic bodies interact with physic bodies. If you, for example, have created your character as an Sprite2D
, since the Sprite2D
only cares about graphics and does not have collisions it will not be stopped by the StaticBody2D
.
So you usually make your character as a body that can collide (usually a CharacterBody2D
, sometimes a RigidBody2D
), and it would, of course, have a child CollisionShape2D
or CollisionPolygon2D
, and also as child it can have your Sprite2D
or whatever else you need.
By making the Sprite2D
and other Node2D
s children of the physics body, they will move with it.
If you haven't decided between CharacterBody2D
and RigidBody2D
, I go into more length on which kind of node to use for what elsewhere. A very good abstract is the following: If something else can push it, use a RigidBody2D
. following the link you get the nuance and what to use for specific cases.
For the CollisionShape2D
to set its shape
property to a Shape2D
.
About making the boundary for the game, the recommendation is to use WorldBoundaryShape2D
for each edge. However, thick enough RectangleShape2D
would also work.
Alternatively, although not recommended, you could use a CollisionPolygon2D
covering the play area, and set its build_mode
to BUILD_SEGMENTS
, which results in a hollow polygon, so other bodies can be inside of it.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论