戈多4跳跃不行,看起来更像是传送而不是跳跃

问题描述 投票:0回答:1

我开始编写一个平台游戏作为学习戈多的一种方式。 我想从让玩家移动开始,首先向左,然后向右,然后跳跃。

在遵循 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

我尝试自己解决问题,但没有成功。

game-development game-engine godot godot4
1个回答
0
投票

您错过了该行中的 +

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
© www.soinside.com 2019 - 2024. All rights reserved.