如何在com.badlogic.Gdx的Screen接口的虚拟`render(delta:Float)`方法中更改`Vector2`的值

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

目前,当使用该方法中的

Vector2
运算符修改
*=
的实例值时, 对于调用函数时的第一次迭代,它正确地将值更改为我想要的值。换句话说,它变得消极。因为我愿意
*=-1f

但是,下一帧(或被调用函数的下一次迭代),它再次变为正值。

如果我尝试使用

=
运算符设置该值,该值将保持不变。 例如,我想将对象加速到屏幕左侧。因为在 libgdx 中,屏幕中心位置值的 x 坐标为 0.0f,y 坐标为 0.0f。 假设我想向左移动,但是最大速度保持在 -10.0f 左右,这是不正确的。它应该变得越来越负,以便物体仍然加速。

如果使用

*=
运算符实现,则一帧它变为负值,但另一帧它变为正值。我最好想使用这个实现来做到这一点,但我不理解渲染方法。当我在
Vector2
方法中更改它时,为什么它会将
render(delta:Float)
值设置回其原始值。

我认为我当前的代码实现足以通过将加速度矢量和速度矢量与绘制下一帧所需的时间相结合来将对象向左移动。

这是代码:

class FirstScreen : Screen {
    val camera: OrthographicCamera by lazy { OrthographicCamera(1400f, 700f) }
    val pen: ShapeRenderer by lazy { ShapeRenderer() }
    var pos:Vector2= Vector2(0f,0f)
    var acc:Vector2= Vector2(5f,5f)
    var vel:Vector2= Vector2(10f,10f)

    override fun show() {
        // Prepare your screen here.
    }

    override fun render(delta: Float) {
        ScreenUtils.clear(0.168627f, 0.356863f, 0.1334f, 1.0f)
        camera.update()
        pen.projectionMatrix = camera.combined
        pen.begin(ShapeRenderer.ShapeType.Filled)
        pen.color = Color(1.0f, 0.125f, 0.125f, 1.0f)
        pen.circle(pos.x,pos.y, 25f, 32)
        pen.end()

        if(Gdx.input.isKeyPressed(Input.Keys.LEFT)){
            //using '=' operator 
            acc.x=-5f
            acc.y=-5f
            vel.x=-10f
            vel.y=-10f
   
            
            //using '*=' operator
            /*acc.x*=-1f
            vel.x*=-1f*/
            
            //this code should be sufficient to move the object to the left even when x=0 
            //or at midpoint of Screen width

            vel.x+=acc.x*delta
            pos.x+=vel.x*delta
            println("Acc X: ${acc.x}")
            println("Vel X: ${vel.x}")
            println("Pos X: ${pos.x}")
        }
    }

我做了什么

尝试用谷歌搜索“如何在 libgdx 的渲染方法中更改 Vector2 值”的问题。但似乎没有人有同样的问题,所以还没有解决方案。

期望: 希望有更多经验的人可以就如何调试此问题提供一两个提示。

kotlin libgdx timedelta vector2
1个回答
0
投票
if(Gdx.input.isKeyPressed(Input.Keys.LEFT)){
        acc.x=-5f
        acc.y=-5f

        vel.x+=acc.x*delta
        if(vel.x>0.0f) {
            vel.x *= -1f
        }
        pos.x+=vel.x*delta
        
        println("Acc X: ${acc.x}")
        println("Vel X: ${vel.x}")
        println("Pos X: ${pos.x}")
    }

经过反复尝试,终于能够再次使用了。因为之前我没有检查速度向量是否为负值,因为它可能会变成负值。

其次,速度矢量不能指定为某个值,因为这会使速度具有恒定值。

还有一件事,当位置为负值时,我们需要通过乘以-1来翻转其值。

但只有在加速度相对于时间积分后才改变这些值。 (用于速度矢量操作)。

© www.soinside.com 2019 - 2024. All rights reserved.