Android使用滑动更改对象位置(AndEngine)

时间:2015-08-10 16:35:13

标签: android andengine swipe

我一直在开发一个游戏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;
        }

2 个答案:

答案 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案例包括解决方案。重要的是,当我们滑动时,我们必须在触摸位置和前位置之间获得不同。