我试图改善人物的动作,但我没有发现他们口吃的真正原因。我使用包含SequenceAction
和MoveToAction
的RunnableAction
来移动它们,该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
之后调用SequenceAction
的clearActions()
。如果您的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);