用户输入在Android上与桌面上的工作方式不同

时间:2017-01-08 15:40:54

标签: android libgdx rotation

我在Libgdx做一个简单的游戏。问题是代码在桌面上运行良好,但在Android(Galaxy S6)上运行不正常。 在游戏中,您用手指围绕设备的中心旋转(宽度/ 2,高度/ 2)。识别您触摸的点,并计算此接触点和中心之间的角度并保存在speicher1中(它始终在0到360之间):

touchpoint.set(Gdx.input.getX(),Gdx.input.getY());
speicher1 = (float)((Math.atan2 (touchpoint.x - width/2, -(touchpoint.y - height/2))*180.0d/Math.PI))+180; //Touchpunkt Gradzahl zur Mitte

使用此计算天使,您可以旋转一个显示在屏幕上的圆圈。所有这些都适用于(桌面,Android)。现在,当您将手指放在180°时,圆圈立即旋转到此点。但那不是我想要的。只有当你移动手指时它才会旋转。因此,当您开始触摸任何地方时,圆圈不应该旋转,只有当您开始拖动时。希望我能清楚地告诉你:D。 我为此做了一个解决方案:

    touchpoint.set(Gdx.input.getX(),Gdx.input.getY());
    speicher1 = (float)((Math.atan2 (touchpoint.x - width/2, -(touchpoint.y - height/2))*180.0d/Math.PI))+180; //Toucpunkt Gradzahl zur Mitte

    if (Gdx.input.justTouched()) {
        speicher2 = 360-(speicher1 - kcc.getCcdegreee());
    }
    speicher1 = speicher1 + speicher2;
    while (speicher1 >= 360) {
        speicher1 -= 360;
    }
    kcc.setCcdegreee(speicher1);

[kcc是我的班级,圆圈的每个信息都保存在(纹理,大小,位置,角度(Ccdegree))]

我用justTouched方法解决了这个问题,并将此点作为'起点'。现在出现了问题,它在桌面上运行良好但在Android上运行不正常吗?!

整个代码:

public void render(SpriteBatch sb, SpriteBatch textsb) {
    //Wenn getouched(gedreht wurde)
    if (Gdx.input.isTouched()) {
        handleInput();
    }

    sb.begin();
    //COLORCIRCLE
    sb.draw(kcc.getCc(),kcc.getCcposition().x,kcc.getCcposition().y,kcc.getCcwidth()/2,kcc.getCcwidth()/2,kcc.getCcwidth(),kcc.getCcheight(),1,1,-kcc.getCcdegreee(),true);
    sb.end();
}

[渲染方法,我会发现是否触摸了显示并在屏幕上绘制了带有计算天使的圆圈]

处理输入法:

protected void handleInput() {
    touchpoint.set(Gdx.input.getX(),Gdx.input.getY());
    speicher1 = (float)((Math.atan2 (touchpoint.x - width/2, -(touchpoint.y - height/2))*180.0d/Math.PI))+180; //Toucpunkt Gradzahl zur Mitte
    if (Gdx.input.justTouched()) {
        speicher2 = 360-(speicher1 - kcc.getCcdegreee());
    }
    speicher1 = speicher1 + speicher2;
    while (speicher1 >= 360) {
        speicher1 -= 360;
    }
    kcc.setCcdegreee(speicher1);
}

正如我所说,整个事情在桌面上完美运行,但在Android上却没有:/。我希望有人能解决这个问题,或者发现我的错。

1 个答案:

答案 0 :(得分:0)

我强烈建议不要直接轮询接触点,不得不处理justTouched()以及所有这些事情,而是使用InputProcessorGestureListener代替。

这为您提供了基于事件的输入,这些输入更灵活,更易于实现。

选项1:InputProcessor

实现此界面时,实际上只需要使用

public boolean touchDown (int x, int y, int pointer, int button) {
      return false;
   }

   public boolean touchUp (int x, int y, int pointer, int button) {
      return false;
   }

   public boolean touchDragged (int x, int y, int pointer) {
      return false;
   }

方法。 在touchDown,你只需要存储触地事件的位置。在onDragged()中,您将计算旋转的角度。由于onDragged()通常在正常拖动(每个帧)时经常被调用,因此最终会有很多非常小的渐开角度,您可以使用它来旋转窗口中心的圆圈。

选项2:GestureListener

使用GestureListener会更方便,因为这个已包含到最后位置的增量,为您提供计算每帧增量角所需的一切。

https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/input/GestureDetector.GestureListener.html#pan-float-float-float-float-

我希望有所帮助......它应该明确地简化您的逻辑并使您的代码更具可读性和可维护性:)