做2D游戲時應該用得到,將圖形水平翻轉,尤其是人物素材,可將本來朝向右邊的翻轉成朝向左邊的。
[cpp]
- #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;
- }
上面的是最初寫的代碼,現在想了一下,沒必要申請內存存儲翻轉後的圖形數組,於是,改成了這個:
[cpp]
- #include "game_data.h"
- int flip_horizontal(Action_Graph *src)
- /* 將圖像進行水平翻轉 */
- {
- int value = 0,x,y,pos,temp,count;
- int width = src->width,hight = src->height;
- unsigned char buff;
- if(src->malloc != IS_TRUE) {
- value = -1;
- }
- else{
- temp = (int)width/2;
- for (y=0;y<hight;y++) {
- /* 水平翻轉其實也就是交換兩邊的數據 */
- pos = y*img_width;
- for (x=0;x<temp;x++) {
- count = img_width - x - 1;
- buff = src->rgba[0][pos+x];
- src->rgba[0][pos+x] = src->rgba[0][count];
- src->rgba[0][count] = buff;
-
- buff = src->rgba[1][pos+x];
- src->rgba[1][pos+x] = src->rgba[1][count];
- src->rgba[1][count] = buff;
-
- buff = src->rgba[2][pos+x];
- src->rgba[2][pos+x] = src->rgba[2][count];
- src->rgba[2][count] = buff;
-
- buff = src->rgba[3][pos+x];
- src->rgba[3][pos+x] = src->rgba[3][count];
- src->rgba[3][count] = buff;
-
- /* “命中”點陣圖的翻轉 */
- if(src->hit_flag == IS_TRUE){
- buff = src->hit[pos+x];
- src->hit[pos+x] = src->hit[count];
- src->hit[count] = buff;
- }
- /* “攻擊”點陣圖的翻轉 */
- if(src->atk_flag == IS_TRUE){
- buff = src->atk[pos+x];
- src->atk[pos+x] = src->atk[count];
- src->atk[count] = buff;
- }
- }
- }
- }
- return value;
- }
由於現在寫的游戲,需要處理攻擊和被攻擊,我就為每一幀的圖形添加了攻擊和被攻擊的點陣圖,方便處理。