一个2D动画的制作思路:
1、动画在本质上都是图片,和影片一样都是通过不断刷新屏幕来产生动态的效果(人眼的滞留效应)
所以我们需要准备几张反应其人物一个动作的过程图
如下:
这是一个集合图,对于分成一张张的也是一样的
最后效果:
2、你需要将它切分成8个不同的图片并产生他们自己的纹理
SDL_Rect rect, walks[8];//用来存储8个区域
img = IMG_Load("walk.png");
if (img == NULL)
{
printf("error\n");
system("pause");
return 0;
}
texture = SDL_CreateTextureFromSurface(rend, img);
rect.x = 0;
rect.y = 0;
rect.h = img->h;
rect.w = img->w / 8;
for (i = 0; i<8; i++)
{
walks[i].w = img->w / 8;
walks[i].h = img->h;
walks[i].x = i*walks[i].w;
walks[i].y = 0;
}
3、接下来只需要加载一个事件主循环,不断播放这8个区域的纹理
你可以自己调整屏幕刷新频率来实现速度的变化(SDL_Delay)
值得注意的是不断循环的操作有个小技巧:使用取余的操作
i = (i + 1) % 8;
这样就实现了i从0-7的循环
4、整体代码如下:
#define SDL_MAIN_HANDLED
#include <stdio.h>
#include <SDL.h>
#include <SDL_image.h>
#include<conio.h>
#include<iostream>
#define W 800
#define H 600
#define SPEED 90
void draw(SDL_Renderer, SDL_Texture);
int main(int argc, char *argv[]) {
int i, j;
bool done = false;
SDL_Event event;
SDL_Window *win = NULL;
SDL_Surface *surface = NULL;
SDL_Surface *img = NULL;
SDL_Renderer *rend = NULL;
SDL_Texture *texture = NULL;
SDL_Rect rect, walks[8];
SDL_Init(SDL_INIT_VIDEO);
win = SDL_CreateWindow("DNF", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
W, H, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
surface = SDL_GetWindowSurface(win);
rend = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED| SDL_RENDERER_PRESENTVSYNC);
img = IMG_Load("walk.png");
if (img == NULL)
{
printf("error\n");
system("pause");
return 0;
}
texture = SDL_CreateTextureFromSurface(rend, img);
rect.x = 0;
rect.y = 0;
rect.h = img->h;
rect.w = img->w / 8;
for (i = 0; i<8; i++) {
walks[i].w = img->w / 8;
walks[i].h = img->h;
walks[i].x = i*walks[i].w;
walks[i].y = 0;
}
i = 0;
while (!done) {
//_getch();
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
done = true;
}//exit
}//pollevent
SDL_RenderClear(rend);
SDL_RenderCopy(rend, texture, &walks[i], &rect);
i = (i + 1) % 8;
rect.x = (rect.x + 5) % (rect.w * 8);
SDL_RenderPresent(rend);
SDL_Delay(SPEED);
}//done
SDL_DestroyWindow(win);
SDL_Quit();
system("pause");
return 0;
}
void draw(SDL_Renderer *rend, SDL_Texture *texture) {
SDL_RenderClear(rend);
SDL_RenderCopy(rend, texture, NULL, NULL);
SDL_RenderPresent(rend);
}