【问题标题】:Moving object by single touch - Libgdx通过单点触摸移动对象 - Libgdx
【发布时间】:2016-12-08 06:44:15
【问题描述】:

这可能是一个非常基本的问题,但作为一个新手,我对此感到困惑。

在我的 libGDX 项目中,我想移动播放器。 最初玩家在左侧。第一次点击时,玩家应该移动到对面并占据那里的位置。对于下一次点击,它应该向左移动。并且会像这样继续。

我实现了这个逻辑。现在的问题是我的玩家根本没有移动,只是在点击时占据了相反的位置。我使用了一个速度值,但它对代码没有任何影响。

我想让它沿途移动,而不仅仅是占据位置。 请帮忙。

 public  float ninjaX = Constants.W_WIDTH;
public  float ninjaY =Constants.WORLD_HEIGHT/2+Constants.WORLD_HEIGHT/4;
public  float ninjaVelocity =100f;
public boolean isLeftBool=true;

public void ninjaMove() {
    if (isLeftBool) {


            ninjaX = ninjaX+ ninjaVelocity;
            setPosition(Constants.WORLD_WIDTH - (Constants.W_WIDTH+Constants.PLAYER_HEIGHT/2), ninjaY);

        isLeftBool = false;

    }
    else 
    {
        ninjaX=ninjaX-ninjaVelocity;
        setPosition(ninjaX,ninjaY);
        isLeftBool = true;
    }

}

在渲染中更新播放器:

if (MyInputProcessor.isTap) {
        MyInputProcessor.isTap = false;
        ninja.ninjaMove();

    }

【问题讨论】:

    标签: libgdx


    【解决方案1】:

    你的玩家坐标变化应该取决于增量时间:

    x1 = x0 + v * Δt

    x1 - 是新坐标

    x0 - 是当前坐标

    v - 速度

    Δt - x0x1

    之间的时间跨度

    LibGDXprovides获取当前帧和最后一帧时间跨度的方法:

    Gdx.graphics.getDeltaTime();

    因此,相应地更改您的代码应该使您的播放器移动顺畅(取决于速度):

    ninjaX = ninjaX + ninjaVelocity * Gdx.graphics.getDeltaTime();
    

    else 块中的减法也是如此。

    您可能还想设置 x 坐标 (ninjaX) 以及 y(目前您没有在 setPosition 方法中传递它):

    setPosition(ninjaX, ninjaY);
    

    *我在这里猜测是因为我不知道该方法的作用

    【讨论】:

      【解决方案2】:

      这只是您如何解决此问题的一个示例。 您没有解释 setPosition() 的作用以及调用它的原因,所以我将忽略它。

      在你的渲染()中:

      public void render(float delta){
          ....
          ninja.update(delta);
      }
      

      在你的 Ninja.class 中

      private final Vector2 leftPos = new Vector(20, 60);
      private final Vector2 rightPos = new Vector(80, 60);
      private Rectangle bound = new Rectangle(80,60,32,32);
      private Vector2 currentPos;
      private float moveSpeed = 100f;
      
      public Ninja(){
          currentPos = leftPos;
      }
      
      public void update(float delta){
         if(bound.x > currentPos.x)bound.x += moveSpeed * delta;
         else bound.x -= moveSpeed * delta;
      }
      
      public void move(){
          if(currentPos == leftPos)currentPos = rightPos;
          else currentPos = leftPos;
      }
      

      然后在 touchDown() 中输入处理器调用 ninja.move()

      这些都没有经过测试。

      您需要将 moveSpeed 与 delta time 相乘的原因是为了使运动独立于 fps。这样,无论游戏运行多少 fps,忍者都会在同一时间移动相同的距离。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-21
        • 2011-10-02
        • 1970-01-01
        相关资源
        最近更新 更多