SDL2教程 (五): 第一个角色动画

一个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);
}




猜你喜欢

转载自blog.csdn.net/qq_40953281/article/details/80390118