SDL如何在按键时设置精灵的动画
SDL How to animate a Sprite when key is pressed
我要开门见山:我有一个精灵表,它有8个移动精灵(https://i.stack.imgur.com/0iFd9.png不能发布图片:\),所以它会产生我走路的错觉)我的问题是,当我按住一个键时,我希望精灵有点动画行走。例如,当我按下向上箭头时,前两个精灵会循环播放,直到我松开键。到目前为止,我所能做的就是每个方向只显示一个精灵,所以这有点不切实际。代码:
#include <SDL/SDL.h>
int main(int argc, char* argv[])
{
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Surface* screen, *image;
screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
bool running = true;
const int FPS = 30;
Uint32 start;
bool direction[4] = {0, 0, 0, 0};
SDL_Rect pos;
pos.x = 0;
pos.y = 0;
SDL_Rect sprite;
sprite.x = 160;
sprite.y = 0;
sprite.w = 32;
sprite.h = 32;;
Uint32 color = SDL_MapRGB(screen -> format, 0xff, 0xff, 0xff);
image = SDL_DisplayFormat(SDL_LoadBMP("sprite.bmp"));
SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(screen -> format, 255, 0, 255));
while (running == true)
{
start = SDL_GetTicks();
SDL_Event event;
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_QUIT:
running = false;
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_UP:
direction[0] = 1;
sprite.x = 0;
break;
case SDLK_LEFT:
direction[1] = 1;
sprite.x = 224;
break;
case SDLK_DOWN:
direction[2] = 1;
sprite.x = 160;
break;
case SDLK_RIGHT:
direction[3] = 1;
sprite.x = 96;
break;
}
break;
case SDL_KEYUP:
switch(event.key.keysym.sym)
{
case SDLK_UP:
direction[0] = 0;
sprite.x = 32;
break;
case SDLK_LEFT:
direction[1] = 0;
break;
case SDLK_DOWN:
direction[2] = 0;
break;
case SDLK_RIGHT:
direction[3] = 0;
break;
}
break;
}
}
if(direction[0])
pos.y-- ;
if(direction[1])
pos.x--;
if(direction[2])
pos.y++;
if(direction[3])
pos.x++;
SDL_FillRect(screen, &screen -> clip_rect, color);
SDL_BlitSurface(image, &sprite, screen, &pos);
SDL_Flip(screen);
if(1000 / FPS > SDL_GetTicks() - start)
SDL_Delay(1000 / FPS - (SDL_GetTicks() - start));
}
SDL_FreeSurface(image);
SDL_Quit();
return 0;
}
免责声明:这不是实现您想要的目标的唯一或最佳方式。这只是一种可能的解决方案
您需要实现一个基本的定时器/计数器来在两个适当的图像之间切换。
对于这个例子,我将把你的精灵偏移存储在2D阵列int sprite_x[4][2];
中——这将代表四个方向和每个方向的两个图像偏移。然后按键,而不是使用布尔数组,只需要一个整数索引int sprite_index;
来索引精灵偏移。然后你所需要做的就是有另一个称为int current_key;
的整数值,你可以在0和1之间切换。
// Used for indexing the 2D array
enum
{
WALK_LEFT,
WALK_RIGHT,
WALK_UP,
WALK_DOWN
WALK_MAX
};
// How many sprites per animation
const int NUM_KEYFRAMES = 2;
// 2D array to hold the x value offsets for sprites
int sprite_x[WALK_MAX][NUM_KEYFRAMES];
int sprite_index = WALK_LEFT; // Current animation
int current_key = 0; // Current keyframe for the animation
// Set up all the x value offsets in the array
sprite_x[WALK_LEFT][0] = 0;
sprite_x[WALK_LEFT][1] = 32;
sprite_x[WALK_RIGHT][0] = 64;
sprite_x[WALK_RIGHT][1] = 96;
.
.
.
然后,您只需相应地更新精灵x值sprite.x = sprite_x[sprite_index][current_key];
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 有没有办法在链接时设置精灵需要字段?
- 在 Cocos2dx 3.0 中的精灵上设置 TexParams
- 我是否需要为每个要检测到的每个精灵设置AddEventListenerWithSceneGrapriority
- [Cocos2dx]如何为自定义精灵设置图像
- cocos2dx精灵设置位置错误
- Cocos2d-x:当设置PhysicsWorld时,一些精灵会变得不可见
- SDL如何在按键时设置精灵的动画
- 将轻扫事件设置为精灵
- DarkGDK,在精灵刷出时间之间设置一个间隔
- 我如何设置一个if语句来动画一个精灵