我试图改善人物的动作,但我没有发现他们口吃的真正原因。我使用包含SequenceActionMoveToActionRunnableAction来移动它们,该moveDone确实会重置标志,以便可以开始新的移动。

游戏本身是基于网格的,因此如果完成移动,则顺控程序将根据方向开始移动到下一个网格。所以这是它的样子:

请注意,这在图中的行为之内

....//some more here
if (checkNextMove(Status.LEFT)) //check if the position is valid
{
    status = Status.LEFT; //change enum status
    move(Status.LEFT); // calls the move
    screen.map.mapArray[(int) mapPos.x][(int) mapPos.y] = Config.EMPTYPOSITION;
    screen.map.mapArray[(int) (mapPos.x - 1)][(int) mapPos.y] = Config.CHARSTATE;
    mapPos.x--;
    moveDone = false;
}
//... same for the up down right and so on.
//at the end of this checking the updating of the actor:
// methode from the absctract to change sprites
updateSprite(delta);
super.act(delta); // so the actions work
//end of act


这是移动方法,确实添加了动作

protected void move(Status direction)
{
    // delete all old actions if there are some left.
    clearActions();
    moveAction.setDuration(speed);
    //restart all actions to they can used again
    sequence.restart();
    switch (direction)
    {
    case LEFT:
        moveAction.setPosition(getX() - Config.TILE_SIZE, getY());
        addAction(sequence);
        break;
    case RIGHT:
        moveAction.setPosition(getX() + Config.TILE_SIZE, getY());
        addAction(sequence);
        break;
    case UP:
        moveAction.setPosition(getX(), getY() + Config.TILE_SIZE);
        addAction(sequence);
        break;
    case DOWN:
        moveAction.setPosition(getX(), getY() - Config.TILE_SIZE);
        addAction(sequence);
        break;
    default:
        break;
    }
}


这些数字并没有真正保持平稳。


有人看到错误,还是有可能让他们像这样肮脏地运动吗?
如果开始新的动作,它总是会停顿一点。所以我认为这可能行不通。是否有其他方法可以将它们准确地从一个网格移动到另一个网格? (我自己尝试过运动速度*增量时间,但这无法完全正常工作,因此我苦苦挣扎并使用了Actionmodel)
例如,似乎在不移动的一个框架上造成了麻烦。


这是口吃的mp4视频:
stuttering.mp4

只需提一下,相机的运动就可以了。像烟熏般,但是身材却像我看到的那样结结巴巴

最佳答案

如果每次移动都使用moveAction,则应调用moveAction.restart()重置其中的计数器:

// delete all old actions if there are some left.
clearActions();
sequence.reset(); // clear sequence
// add movementspeed. Note it can change!
moveAction.restart();
moveAction.setDuration(speed);


更新:

现在发生问题,因为您在restart之后调用SequenceActionclearActions()。如果您的clearActions()删除了SequenceAction中的所有操作,则restart将被称为空的SequenceAction。因此,改为执行以下操作:

//restart all actions to they can used again
sequence.restart();
// delete all old actions if there are some left.
clearActions();
moveAction.setDuration(speed);

10-08 18:17