我开始编写一个平台游戏作为学习戈多的一种方式。 我想从让玩家移动开始,首先向左,然后向右,然后跳跃。
在遵循 YT 如何进行良好跳跃的教程后:https://youtu.be/IOe1aGY6hXA 我遇到了我的玩家并没有真正跳到最高位置的问题。看起来他只是瞬移到了最高的位置。我没有发现错误,但我认为这与我在玩家跳跃时向其施加重力的方式有关。
代码:
extends CharacterBody2D
@export var speed = 444.44
@export var jump_height:float
@export var jump_time_to_peak:float
@export var jump_time_to_descent:float
@onready var jump_velocity:float = ((2.0*jump_height)/jump_time_to_peak)*-1.0
@onready var jump_gravity:float = ((-2.0*jump_height)/(jump_time_to_peak*jump_time_to_peak))*-1.0
@onready var fall_gravity:float = ((-2.0*jump_height)/(jump_time_to_descent*jump_time_to_descent))*-1.0
func _physics_process(delta):
#Code for left and right movement
#var input_vector=Vector2.ZERO
#input_vector.x = Input.get_action_strength("right") - Input.get_action_strength("left")
#velocity = input_vector*speed
#if velocity !=Vector2.ZERO:
$beta_character.play_walk()
#else:
$beta_character.play_idle()
if velocity <Vector2.ZERO:
$beta_character/Sprite2D.flip_h = true
else:
$beta_character/Sprite2D.flip_h = false
velocity.y =get_gravity()*delta
if Input.is_action_just_pressed("jump") and is_on_floor():
jump()
move_and_slide()
func get_gravity() -> float:
return jump_gravity if velocity.y < 0.0 else fall_gravity
func jump():
velocity.y = jump_velocity
我尝试自己解决问题,但没有成功。
您错过了该行中的 +
velocity.y =get_gravity()*delta
一跳后会硬重置你的跳跃。为了与教程保持一致,应该是
velocity.y += get_gravity()*delta
因此你的跳跃冲动会慢慢被重力捕获,从而使角色下降。
只有当您更改此处注释掉的部分代码时,这才有效(假设您想将其放回原处)。 每次都将velocity.y重置为零,但事实不应该是这样。这不仅会导致非常缓慢的下落,而且 get_gravity() 将始终返回fall_gravity。
velocity = input_vector*speed # since input_vector.y is 0 , velocity.y will be one
这条线应该只改变velocity.x,因为你试图检测左、右运动。所以它应该看起来像这样:
velocity.x = input_vector.x*speed
因此,要使跳转正常工作,您的代码将如下所示:(在左右代码中注释)
extends CharacterBody2D
@export var speed = 444.44
@export var jump_height:float
@export var jump_time_to_peak:float
@export var jump_time_to_descent:float
@onready var jump_velocity:float = ((2.0*jump_height)/jump_time_to_peak)*-1.0
@onready var jump_gravity:float = ((-2.0*jump_height)/(jump_time_to_peak*jump_time_to_peak))*-1.0
@onready var fall_gravity:float = ((-2.0*jump_height)/(jump_time_to_descent*jump_time_to_descent))*-1.0
func _physics_process(delta):
#Code for left and right movement
var input_vector=Vector2.ZERO
input_vector.x = Input.get_action_strength("right") - Input.get_action_strength("left")
velocity.x = input_vector.x*speed
if velocity != Vector2.ZERO: #may want to change this too, since there will be unwanted behaviour in air
$beta_character.play_walk()
else:
$beta_character.play_idle()
if velocity.x < 0: #only x should determine if the sprite looks left or right
$beta_character/Sprite2D.flip_h = true
else:
$beta_character/Sprite2D.flip_h = false
velocity.y +=get_gravity()*delta
if Input.is_action_just_pressed("jump") and is_on_floor():
jump()
move_and_slide()
func get_gravity() -> float:
return jump_gravity if velocity.y < 0.0 else fall_gravity
func jump():
velocity.y = jump_velocity