使用 KinematicBody2D 作为 RigidBody2D
Use KinematicBody2D as RigidBody2D
你好,我是 Godot 的新手(我是法国人,这就是为什么我的英语不完美)
我正在尝试创建一个游戏(自上而下),其原理与相扑战斗相同,在圆圈外干掉你的对手。我遇到的问题是,如果我使用 KinematicBody2D,角色不会互相推动,这是游戏的基础,然后我看到 RigidBody2D 是可能的,但我在互联网上找不到任何方法来制作它像这样移动:https://docs.godotengine.org/fr/stable/tutorials/2d/2d_movement.html#rotation-movement。然后我搜索了是否可以用另一个 KinematicBody2D 推动一个 KinematicBody2D(以便它可以被推动),但我也找不到任何方法。
所以我被困在这里了,我的问题是这是否可能,尤其是我该怎么做?
感谢阅读,
诺弗莱尔
我认为这里的问题是您没有使用碰撞。函数 move_and_slide
或 move_and_collide
会使一个 Kinematic Body 移动,并撞击其他物体(包括 Kinematic Body)。
但是,一旦您使用这两个函数中的任何一个,您就会意识到它们并没有按照您在问题中需要的方式相互推动。
move_and_collide
:移动的物体会移动,如果有碰撞器(任何障碍物),它会在碰撞后立即停止并且return一个KinematicCollision2D
物体。
move_and_slide
:相比move_and_collide
采取更进一步的动作,移动的物体会滑过对撞机,把它当作墙或地板。对平台游戏很有用。
在您的用例中,您别无选择,只能自己控制碰撞。您可以在此处获取有关 KinematicCollision2D 的更多信息:(en, fr)。这可能是你的做法:
var collision = player.move_and_collide(direction_vector)
if (!collision):
# No collision occurred
return
else:
# Collided with a wall or player
if (collision.collider == wall)
# if you keep track of wall object as a variable to identify it
# you can have the sumo just stop moving and not process anymore
return
else:
var opponent = collision.collider
# write game logic to move opponent and yourself
return
你好,我是 Godot 的新手(我是法国人,这就是为什么我的英语不完美)
我正在尝试创建一个游戏(自上而下),其原理与相扑战斗相同,在圆圈外干掉你的对手。我遇到的问题是,如果我使用 KinematicBody2D,角色不会互相推动,这是游戏的基础,然后我看到 RigidBody2D 是可能的,但我在互联网上找不到任何方法来制作它像这样移动:https://docs.godotengine.org/fr/stable/tutorials/2d/2d_movement.html#rotation-movement。然后我搜索了是否可以用另一个 KinematicBody2D 推动一个 KinematicBody2D(以便它可以被推动),但我也找不到任何方法。
所以我被困在这里了,我的问题是这是否可能,尤其是我该怎么做?
感谢阅读, 诺弗莱尔
我认为这里的问题是您没有使用碰撞。函数 move_and_slide
或 move_and_collide
会使一个 Kinematic Body 移动,并撞击其他物体(包括 Kinematic Body)。
但是,一旦您使用这两个函数中的任何一个,您就会意识到它们并没有按照您在问题中需要的方式相互推动。
move_and_collide
:移动的物体会移动,如果有碰撞器(任何障碍物),它会在碰撞后立即停止并且return一个KinematicCollision2D
物体。move_and_slide
:相比move_and_collide
采取更进一步的动作,移动的物体会滑过对撞机,把它当作墙或地板。对平台游戏很有用。
在您的用例中,您别无选择,只能自己控制碰撞。您可以在此处获取有关 KinematicCollision2D 的更多信息:(en, fr)。这可能是你的做法:
var collision = player.move_and_collide(direction_vector)
if (!collision):
# No collision occurred
return
else:
# Collided with a wall or player
if (collision.collider == wall)
# if you keep track of wall object as a variable to identify it
# you can have the sumo just stop moving and not process anymore
return
else:
var opponent = collision.collider
# write game logic to move opponent and yourself
return