【问题标题】:Tile-based Movement and Animation基于图块的运动和动画
【发布时间】:2015-06-03 11:47:03
【问题描述】:

我目前正在制作一个演示,只是为了掌握如何制作游戏。将来可能会变成一些东西,但现在只是为了学习。

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

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

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

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

【问题讨论】:

    标签: c++ animation sprite sfml


    【解决方案1】:

    你可以使用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 做到了这一点。

    【讨论】:

    • 我想我已经掌握了它的一般要点。我认为我无法创建像您这样的系统,但我想我现在对它有了更好的理解。我基本上应该跟踪角色的当前状态并在他移动时继续循环动画,但是当一个键被释放时,将他设置为站立并循环动画直到它到达第 1 帧。
    • 你可以的。这种模式称为Model View Controller - MVC.,其中model 跟踪状态,controller 更改状态,view 只是状态的视觉表示。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 2014-06-12
      • 1970-01-01
      • 2012-03-23
      • 2017-05-26
      • 1970-01-01
      • 2017-06-21
      相关资源
      最近更新 更多