能将图形水平翻转的函数

做2D游戏时应该用得到,将图形水平翻转,尤其是人物素材,可将本来朝向右边的翻转成朝向左边的。

#include <string.h>
int flip_horizontal(
int img_width,
int img_hight,
unsigned char *in_red,//传入的红色
unsigned char *in_green,//传入的绿色
unsigned char *in_blue,//传入的蓝色
unsigned char *in_alpha//传入的透明度
)
//水平翻转图像
{
	int x,y,pos,temp;
	unsigned char *out_red;//传出的红色
	unsigned char *out_green;//传出的绿色
	unsigned char *out_blue;//传出的蓝色
	unsigned char *out_alpha;//传出的透明度

	out_red = (unsigned char*)malloc(img_width*img_hight);//申请内存
	out_green = (unsigned char*)malloc(img_width*img_hight);
	out_blue = (unsigned char*)malloc(img_width*img_hight);
	out_alpha = (unsigned char*)malloc(img_width*img_hight);
	
	temp = 0;
	
	for (y=0;y<img_hight;y++) {//y的初始值为0,小于图片的高度,y自增
	//y表示的是图片第几行
		pos = y*img_width + img_width-1;
		for (x=0;x<img_width;x++) {
			out_red[pos] = in_red[temp];
			out_green[pos] = in_green[temp];
			out_blue[pos] = in_blue[temp];
			out_alpha[pos] = in_alpha[temp];
			++temp;
			--pos;
			//假设img_width = 10,当y=0时,那么,out_red[9] = in_red[0],以此类推
			//当y=1时,out_red[19] = in_red[10],以此类推
			//把图片的每一行水平翻转
		}
	}
	memcpy(in_red,out_red,img_width*img_hight);//拷贝
	memcpy(in_green,out_green,img_width*img_hight);
	memcpy(in_blue,out_blue,img_width*img_hight);
	memcpy(in_alpha,out_alpha,img_width*img_hight);
	free(out_red);
	free(out_blue);//释放内存
	free(out_green);
	free(out_alpha);
	return 0;
}

上面的是最初写的代码,现在想了一下,没必要申请内存存储翻转后的图形数组,直接左右交换就可以了,类似下面的代码:

int main()
{
    int x,y,pos, left, temp,count;  
    int width = 10, height = 1;  
    unsigned char buff;  
    char str[] = {'0','1', '2', '3', '4', '5', '6', '7', '8', '9',0};
	temp = width/2;
	puts(str);
	for (y = 0; y < height; ++y) 
	{   /* 水平翻转其实也就是交换两边的数据 */  
		pos = y * width;
		left = pos;
		for (x = 0; x <= temp; ++x) 
		{
			count = left + width - x - 1;
			buff = str[pos]; 
			str[pos] = str[count];  
            str[count] = buff;
            ++pos;
		}
    }
	puts(str);
    return 0;  
}

 

你可能感兴趣的:(游戏,存储,图形)