基于平铺的运动和动画

时间:2015-06-03 11:47:04

标签: c++ animation sprite sfml

我目前正在制作一个演示,只是为了掌握如何制作游戏。它可能会在未来变成某种东西,但就目前而言,它仅仅是为了学习。

我想,我的演示受到塞尔达传说的影响。它具有TLoZ具有的自上而下的外观。

我的精灵是一个32x32像素的图像,演示以60fps运行,我已经计算出我希望我的精灵使用PyxelEdit动画的速度有多快。当我的角色走路时,每170毫秒显示一个动画帧。他每帧移动4个像素,所以他正以我想要的速度移动和制作动画。

我遇到的问题是,当我的钥匙被释放时,我希望我的角色完成动画循环并且他不会。当我释放一个移动键时,他有时会停在错误的动画帧上,就像说我的左脚或右脚是向前的,当我希望他静止时。我只是不确定该怎么做。我已经尝试在Event :: KeyReleased事件发生时检查动画计数并增加动画计数直到它达到一定数量,以便它停在说数字1以便他静止不动,它只是没有& #39; t work。

我不认为这需要查看我的代码,只需要大致了解如何确保在释放运动键时动画,直到他在第1帧并移动他每次都有一定数量的像素,直到他停下来。

2 个答案:

答案 0 :(得分:0)

如果我理解正确,你需要这样的东西:

// The game loop
while (game_running)
{
    // ...
    // Your code
    // ...

    // Advance the animation while moving, or if not, cycle through
    // the animation frames until frame 1 is reached
    if (keyPressed(somekey) || currentAnimationFrame != 1)
    {
        advanceAnimationFrame();
    }

    // ...
    // Your code
    // ...
}

当然,这不是SFML代码,但应该通过

获得一般性的想法

答案 1 :(得分:0)

你可以使用FSM这样的东西。

// Visual states of the character.
enum class State { WALKING, STANDING, ATTACK, };
State character_state = State::STANDING;

// Change on input (or other things like impact.)
if(input.up() || input.down() || input.left() || input.right)
   character_state = State::WALKING;
else
   character_state = State::STANDING;

// Render based on the current state.
switch(character_state)
{
   case(State::WALKING):
      render(cycle_walk_animation(frame_time));
      break;
   case(State::STANDING):
      render(standing_still_frame());
      break;
}

我用2D和3D完成了这项工作。