我正在制作一个从左到右的2d风格的游戏(就像空洞的夜晚一样徒劳无功,所以你可以得到控制的要点),我在主玩家的运动身体里有下面的代码。这段代码的跳转(“向上”)部分不起作用。按压似乎什么也做不了,尽管“工作”是打印出来的。重力部分(velocity.y += 1000)是这样的。我试着把它放入一个into循环中,但是,即使是打印也不起作用。
extends KinematicBody2D
export (int) var speed = 200
var velocity = Vector2()
func get_input():
velocity = Vector2()
if Input.is_action_pressed("right"):
velocity.x += 1
if Input.is_action_pressed("left"):
velocity.x -= 1
if Input.is_action_just_pressed("up"):
#this bit doesnt work.
velocity.y -= 1000
#this is printed though
print("Worked")
velocity = velocity.normalized() * speed
func _physics_process(delta):
get_input()
velocity.y += 1000
velocity = move_and_slide(velocity)发布于 2022-06-19 07:45:22
让met拿走一些东西:velocity.y += 1000是与帧速率有关的。实际上,它是每帧每秒一千像素的加速。您可能想做这样的事情:velocity.y += gravity * delta。其中gravity是以像素为单位的每秒平方。
类似地,这些是加速:velocity.x += 1,velocity.x -= 1。它们以每秒一个像素的速度增加和降低水平速度。但是,您正在通过speed对速度和缩放进行规范化。你能减速和改变方向吗?
关于这个问题,我看到的是:
首先,擦除速度(这也意味着任何向下的加速度都消失了):
velocity = Vector2()然后,如果播放机刚刚按下"up",则这一行将运行:
velocity.y -= 1000这将导致velocity.y具有值-1000 (因为它在前面被擦除为零)。
然后将其标准化:
velocity = velocity.normalized() * speed如果我们假定没有横向速度,那么现在velocity.y是-speed (默认情况下)。
稍后,这一行将运行相同的帧:
velocity.y += 1000这将导致velocity.y具有1000 - speed的值。这个符号取决于speed是否大于1000。
假设它不是(因为它不是默认的),您只是在重力方向上得到一个速度,而不管玩家按"up"。
要解决这个问题,我们需要:
当没有jumping.
事实上,对于水平运动,我会做一些类似的事情。
export var speed := 200.0
export var jump_speed := -1000.0
export var gravity := 1000.0
var velocity := Vector2.ZERO
func _physics_process(delta) -> void:
velocity.x = Input.get_axis("left", "right") * speed
if Input.is_action_just_pressed("up"):
velocity.y = jump_speed
else:
velocity.y += gravity * delta
velocity = move_and_slide(velocity)我已经摆脱了get_input,因为它更像compute_velocity,但是我们在_physics_process中搅乱了重力的速度。事实上,我们需要delta来正确地做到这一点。
当然,这不是水平加速度。你想要水平加速度吗?所以这会使speed变成最大的speed,对吗?好的:
export var speed := 200.0
export var jump_speed := -1000.0
export var acceleration := 100.0
export var gravity := 1000.0
var velocity := Vector2.ZERO
func _physics_process(delta) -> void:
var inpux_x := Input.get_axis("left", "right")
velocity.x = clamp(
velocity.x + input_x * acceleration * delta,
-speed,
speed
)
if Input.is_action_just_pressed("up"):
velocity.y = jump_speed
else:
velocity.y += gravity * delta
velocity = move_and_slide(velocity)顺便说一句,不,在_physics_process中输入是没有错的。事实上,这是有意的。
我还注意到没有对您的代码进行地面检查。我不想再多说了,因为这不是问题。
https://stackoverflow.com/questions/72674616
复制相似问题