首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跳转不工作的戈多GDScript代码

跳转不工作的戈多GDScript代码
EN

Stack Overflow用户
提问于 2022-06-19 06:06:20
回答 1查看 135关注 0票数 0

我正在制作一个从左到右的2d风格的游戏(就像空洞的夜晚一样徒劳无功,所以你可以得到控制的要点),我在主玩家的运动身体里有下面的代码。这段代码的跳转(“向上”)部分不起作用。按压似乎什么也做不了,尽管“工作”是打印出来的。重力部分(velocity.y += 1000)是这样的。我试着把它放入一个into循环中,但是,即使是打印也不起作用。

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2022-06-19 07:45:22

让met拿走一些东西:velocity.y += 1000是与帧速率有关的。实际上,它是每帧每秒一千像素的加速。您可能想做这样的事情:velocity.y += gravity * delta。其中gravity是以像素为单位的每秒平方。

类似地,这些是加速:velocity.x += 1velocity.x -= 1。它们以每秒一个像素的速度增加和降低水平速度。但是,您正在通过speed对速度和缩放进行规范化。你能减速和改变方向吗?

关于这个问题,我看到的是:

首先,擦除速度(这也意味着任何向下的加速度都消失了):

代码语言:javascript
复制
velocity = Vector2()

然后,如果播放机刚刚按下"up",则这一行将运行:

代码语言:javascript
复制
velocity.y -= 1000

这将导致velocity.y具有值-1000 (因为它在前面被擦除为零)。

然后将其标准化:

代码语言:javascript
复制
velocity = velocity.normalized() * speed

如果我们假定没有横向速度,那么现在velocity.y-speed (默认情况下)。

稍后,这一行将运行相同的帧:

代码语言:javascript
复制
velocity.y += 1000

这将导致velocity.y具有1000 - speed的值。这个符号取决于speed是否大于1000

假设它不是(因为它不是默认的),您只是在重力方向上得到一个速度,而不管玩家按"up"

要解决这个问题,我们需要:

当没有jumping.

  • Override时,
  • 只在跳跃时施加重力垂直速度。

事实上,对于水平运动,我会做一些类似的事情。

代码语言:javascript
复制
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,对吗?好的:

代码语言:javascript
复制
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中输入是没有错的。事实上,这是有意的。

我还注意到没有对您的代码进行地面检查。我不想再多说了,因为这不是问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72674616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档