我只是想用手指拖动精灵。我这样做是通过检测触摸屏幕的手指移动的距离,然后将精灵移动相同的量。
这是一个openGL ES 2.0应用程序,所以我的渲染和逻辑更新发生在我的GL渲染线程上,显然在UI线程上捕获了触摸事件。
所以,我的设置是这样的:
用户界限线程
case MotionEvent.ACTION_MOVE: {
movedByX = event.getX()-oldXPosition;
movedByY = event.getY()-oldYPosition;
oldXPosition = event.getX();
oldYPosition = event.getY();
break;
}
GL渲染线程
渲染
@Override
public void render() {
drawSprite(testSprite); //Draws using the sprites' internal x and y coordinates
}
逻辑更新
@Override
public void updateLogic() {
testSprite.x+=movedByX; //Update the sprite's X position
testSprite.y+=movedByY; //Update the sprite's Y position
}
问题
如果有人将精灵拖动屏幕一段时间,然后停止。手指相对于精灵的静止点与手指最初下降时的不相同。举个例子,像一个圆圈精灵。 蓝色圆圈是精灵,红点代表手指/指针。
正如你所看到的,它并没有按预期工作,我不知道为什么。
我之前遇到过一个类似的问题,我通过最初在ACTION_MOVE(onTouchEvent / UI线程)中抓取X和Y来解决问题,就像我上面一样,但是在我的updateLogic方法中,我做了一个副本在将它应用到我的精灵位置之前,计算出'moveByY'的数量。
这样做有效地解决了手指'徘徊'的问题 - 但是 - 它使精灵的运动非常不稳定,因此我不能使用这个解决方案。
我认为这种不稳定可能是因为渲染线程有时会在没有UI线程运行的情况下运行两次,因此,即使手指已移动,逻辑仍然使用它具有的版本,因为onTouch无法捕获到实际上最新的手指位置。但我不是百分百肯定。
如果我只是在我的UI线程中更新我的精灵位置(再次,在ACTION_MOVE中) - 再次,我的动作非常不稳定,但指针位置确实保持正确。)
所以,我需要保持从问题顶部概述的方法得到的平滑运动,但我需要知道为什么moveBy量导致精灵从手指中移动。
其他笔记
我需要使用手指的旧位置和当前位置之间的差异来移动精灵,而不是简单地在手指的当前位置绘制精灵,因为这最终将成为“可滚动”菜单系统的一部分。
我的所有变量都被声明为'private float volatile',并且我的onTouchEvent和updateLogic方法是同步的。
答案 0 :(得分:0)
我不知道它是否是一个错字
@Override
public void updateLogic() {
testSprite.x+=movedByX; //Update the sprite's X position
testSprite.x+=movedByY; //Update the sprite's Y position
}
但是你设置了testsprite.x两次