基于图块的运动和动画
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 完成了这个。
我目前正在制作演示,只是为了掌握如何制作游戏。以后可能会变成什么东西,但是现在,只是为了学习。
我猜我的演示是受《塞尔达传说》的影响。它具有 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 完成了这个。