我将提供一种完全不同的方法:重力覆盖。
大多数教程都会对玩家角色的重力进行硬编码。事实上,你正在这样做。好吧,正如邪恶博士所说:“不”怎么样?
您可以从项目设置中获得全局引力。你可以这样得到:
var g_scale:float = ProjectSettings.get("physics/2d/default_gravity")
var g:Vector2 = ProjectSettings.get("physics/2d/default_gravity_vector") * g_scale
也许你不想要。但是,您可能会发现将所需的重力表示为该重力的倍数很有用。
var g_scale:float = ProjectSettings.get("physics/2d/default_gravity")
var g:Vector2 = ProjectSettings.get("physics/2d/default_gravity_vector") * g_scale
gravity = g * g_factor
为什么?因为我们要使用Area2D
修改重力,然后您可以对获得的重力应用相同的乘数。
因此,正如您可能知道的那样,Area2D
具有“物理覆盖”属性,允许您修改重力。
这引出了这个问题?如何查询运动体所处的重力?嗯,像这样:
var gravity = Physics2DServer.body_get_direct_state(get_rid()).total_gravity
是的,你可以应用一个因素:
gravity = Physics2DServer.body_get_direct_state(get_rid()).total_gravity * g_factor
现在您可以使用此重力进行运动。你做了一个Area2D
用水平分量覆盖默认重力。玩家角色根据修改后的重力下落,这也意味着它会侧向移动。哒哒! “风”。
请注意,这意味着放弃重力沿着y
轴。你可以这样做:direction += gravity * delta
.
好吧,好吧,好吧,让我们说你不想这样做。您可以做的是公开速度或加速度属性Area2D
可以设置进入的实体。
例如:
var area_effect_velocity:Vector2
然后Area2D
做这个:
func _body_entered(body):
if("area_effect_velocity" in body):
bodies_within.append(body)
body.area_effect_velocity = Vector2(-50.0, 0.0)
func _body_exited(body):
if(body in bodies_within):
bodies_within.erase(body)
body.area_effect_velocity = Vector2.ZERO
然后您可以将其添加到您的动议中。例如:
direction += area_effect_velocity
关于重叠的附录Area2D
:
通过重力覆盖方法,您可以将空间覆盖设置为“组合”,Godot 会为您解决这个问题。
使用另一种方法,您可以通过偏移量来处理它:
var effect_velocity := Vector2(-50.0, 0.0)
func _body_entered(body):
if("area_effect_velocity" in body):
bodies_within.append(body)
body.area_effect_velocity += effect_velocity
func _body_exited(body):
if(body in bodies_within):
bodies_within.erase(body)
body.area_effect_velocity -= effect_velocity
这将避免额外的检查。