基于图块的运动和动画

Tile-based Movement and Animation

我目前正在制作演示,只是为了掌握如何制作游戏。以后可能会变成什么东西,但是现在,只是为了学习。

我猜我的演示是受《塞尔达传说》的影响。它具有 TLoZ 所具有的那种自上而下的外观。

我的 sprite 是一个 32x32 像素的图像,演示以 60fps 运行,我已经计算出我希望我的 sprite 使用 PyxelEdit 设置动画的速度。当我的角色行走时,每个动画帧每 170 毫秒显示一次。他每帧移动 4 个像素,所以他正在以我希望的速度移动和设置动画。

我遇到的问题是我希望我的角色在我的键被释放时完成动画循环,但他不会。当我释放一个移动键时,他有时会停在错误的动画帧上,比如当我想让他静止时说他的左脚或右脚在前。我只是不知道该怎么做。我试过在 Event::KeyReleased 事件发生时检查动画计数并增加动画计数直到它达到某个数字,以便它停止说数字 1 所以他站着不动,它只是行不通。

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

如果我没理解错的话,你需要这样的东西:

// 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 代码,但应该可以理解总体思路

你可以使用 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 完成了这个。