我在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上却没有:/。我希望有人能解决这个问题,或者发现我的错。
答案 0 :(得分:0)
我强烈建议不要直接轮询接触点,不得不处理justTouched()
以及所有这些事情,而是使用InputProcessor
或GestureListener
代替。
这为您提供了基于事件的输入,这些输入更灵活,更易于实现。
选项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会更方便,因为这个已包含到最后位置的增量,为您提供计算每帧增量角所需的一切。
我希望有所帮助......它应该明确地简化您的逻辑并使您的代码更具可读性和可维护性:)