我一直在开发一个游戏2周。我在设备屏幕的中央顶部有一个球。我使用滑动来沿X坐标移动它。这种情况我有三个案例。
案例1:(TouchEvent.ACTION_DOWN) 球不会移动任何位置。
案例2:(TouchEvent.ACTION_MOVE)这个案例对我很重要。如果我将手指向右侧滑动,则球向右移动,如果向左侧移动.....
案例3 :( TouchEvent.ACTION_UP)球有动态后,球会因重力而下落。无论如何。
通常在以上三种情况下,当我在屏幕上滑动手指时,球会立即用我的手指来到相同的x位置。让我用一个例子来解释这个行为。
我的camera_width是720.球站在360.我触及480 x位置。如果我只是向右滑动2个单位,我的手指当前位置将是482.问题是球跳到482.我不想要它。
我的移动差异是2个单位。我希望它跳到362.这里'我的代码:
if ( mPhysicsWorld != null && currentBody != null)
{
switch ( pSceneTouchEvent.getAction() )
{
case TouchEvent.ACTION_DOWN:
isFirstTouch = true;
oldLocationX = pSceneTouchEvent.getX();
newLocationX = pSceneTouchEvent.getX();
break;
case TouchEvent.ACTION_MOVE:
if ( oldLocationX + 30 > pSceneTouchEvent.getX() && pSceneTouchEvent.getX() > oldLocationX - 30 )
{
if ( !isFirstTouch )
{
if ( newLocationX != pSceneTouchEvent.getX() )
{
oldLocationX = newLocationX;
paddleX = pSceneTouchEvent.getX() + (pSceneTouchEvent.getX() - newLocationX);
paddleX = Math.max( paddleX, currentSprite.getWidthScaled() / 2 );
paddleX = Math.min( paddleX, CAMERA_WIDTH - currentSprite.getWidthScaled() / 2 );
currentBody.setTransform( paddleX / 32, currentBody.getPosition().y, 0 );
newLocationX = pSceneTouchEvent.getX();
}
}
}
else
{
isFirstTouch = false;
if ( newLocationX != pSceneTouchEvent.getX() )
{
oldLocationX = newLocationX;
paddleX = pSceneTouchEvent.getX() + (pSceneTouchEvent.getX() - newLocationX);
paddleX = Math.max( paddleX, currentSprite.getWidthScaled() / 2 );
paddleX = Math.min( paddleX, CAMERA_WIDTH - currentSprite.getWidthScaled() / 2 );
currentBody.setTransform( paddleX / 32, currentBody.getPosition().y, 0 );
newLocationX = pSceneTouchEvent.getX();
}
}
Log.d( "move", "oldPositionX: " + oldLocationX + " ");
break;
case TouchEvent.ACTION_UP:
currentBody.setType( BodyDef.BodyType.DynamicBody );
addFaceInFuture( currentBody );
break;
}
答案 0 :(得分:0)
尝试替换
paddleX = pSceneTouchEvent.getX() + (pSceneTouchEvent.getX() - newLocationX);
与
paddleX = currentBody.getPosition().x + (pSceneTouchEvent.getX() - newLocationX);
另一种方法是在事件(evtStartX)和身体(bodyStartX)的ACTION_DOWN中保存x位置
在ACTION_MOVE,你只需要计算当前x位置和evtStartX之间的差异。然后将结果添加到bodyStartX
case TouchEvent.ACTION_DOWN:
evtStartX = pSceneTouchEvent.getX();
bodyStartX = currentBody.getPosition().x
break;
case TouchEvent.ACTION_MOVE:
xDif = pSceneTouchEvent.getX() - evtStartX;
xDif = xDif/32;
body.setPositon(bodyStartX + xDif, body.getPosition().y);
break;
答案 1 :(得分:0)
我为我的问题改进了代码。我在下面给你解决方案。
@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent)
{
int eid = pSceneTouchEvent.getAction();
float leftBorderPosition = currentSprite.getWidthScaled() / 2;
float rightBorderPosition = CAMERA_WIDTH - currentSprite.getWidthScaled() / 2;
if ( mPhysicsWorld != null && currentBody != null)
{
switch ( eid )
{
case TouchEvent.ACTION_DOWN:
oldLocationX = pSceneTouchEvent.getMotionEvent().getX() / 32;
break;
case TouchEvent.ACTION_MOVE:
newLocationX = pSceneTouchEvent.getMotionEvent().getX() / 32;
if ( pSceneTouchEvent.getMotionEvent().getHistorySize() > 0 )
{
oldLocationX = pSceneTouchEvent.getMotionEvent().getHistoricalX(0) / 32;
}
paddleX = (currentBody.getPosition().x + (newLocationX - oldLocationX));
paddleX = Math.max( paddleX, (leftBorderPosition / 32) );
paddleX = Math.min( paddleX, (rightBorderPosition / 32) );
currentBody.setTransform( paddleX, currentBody.getPosition().y, 0 );
break;
case TouchEvent.ACTION_UP:
engineLock.lock();
currentBody.setType( BodyDef.BodyType.DynamicBody );
engineLock.unlock();
if ( currentBody.getUserData().equals( "bomb" ) )
{
/**
*
* Bomba su anda aktif ve butun update'ler unregister olsun.
*
*/
bombBody = currentBody;
bombSprite = currentSprite;
mEngine.unregisterUpdateHandler( allBodyIsStoppedIUpdatehandler );
mEngine.unregisterUpdateHandler( isBallsReachedLimit );
addBallInFuture( null );
}
else
{
addBallInFuture( currentBody );
}
break;
}
}
return false;
}
TouchEvent.ACTION_DOWN和TouchEvent.ACTION_MOVE案例包括解决方案。重要的是,当我们滑动时,我们必须在触摸位置和前位置之间获得不同。