gpt4 book ai didi

c++ - SDL 如何在按下键时为 Sprite 设置动画

转载 作者:行者123 更新时间:2023-11-28 06:55:03 25 4
gpt4 key购买 nike

我要开门见山了:我有一个有 8 个运动 Sprite 的 Sprite 表(http://i.imgur.com/hLpo2Qn.png 不能发布图像:\),所以它创造了我走路的错觉)我的问题是,当我按住一个键时,我希望 Sprite 有点像动画行走。例如,当我按下向上箭头时,前两个 Sprite 会循环播放,直到我松开按键。到目前为止,我所能做的就是在每个方向上只显示一个 Sprite ,所以它会产生一种不切实际的效果。代码:

#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;

最佳答案

免责声明:这不是实现您想要的唯一或最佳方法。这只是一种可能的解决方案

您需要实现一个基本的计时器/计数器以在两个适当的图像之间切换。

对于这个例子,我会将您的 Sprite 偏移量存储在二维数组 int sprite_x[4][2]; - 这将代表四个方向和每个方向的两个图像偏移量。然后在按键上而不是使用 bool 数组只有一个整数索引 int sprite_index; 用于索引 sprite 偏移量。然后你需要做的就是有另一个整数值,类似于 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;
.
.
.

然后您只需相应地更新 Sprite x 值 sprite.x = sprite_x[sprite_index][current_key];

关于c++ - SDL 如何在按下键时为 Sprite 设置动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23291182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com