SDL2 事件

什麼是事件呢?事件可能是由使用者操作產生的,比如使用者按下一個鍵,鬆開一個鍵,或點擊了鼠標等,也可能是硬件產生的比如時鐘脈衝等。任何一個窗口程序都使用一個事件隊列來保存這些事件,隊列的一個特性便是先進先出,先進入隊列的事件會被優先處理。如下圖所示,事件在隊尾入隊,隊頭出隊,先發生的事件先入隊,出隊的時候也會先出隊。

事件入隊是由系統處理的,我們不用關心,我們關心的是什麼事件發生了,如何處理?那麼首先要看SDL裏有哪些事件呢

SDL事件可分爲四種

  1. 鍵盤事件 包括按下鍵、鬆開鍵兩類事件,也就是說當你在鍵盤上按下一個鍵時發生了一個按鍵事件,當你鬆開這個鍵時又會發生鬆開鍵事件。

  2. 鼠標事件 包括鼠標移動事件、按下鼠標鍵、鬆開鼠標鍵,和鍵盤一樣,當你移動鼠標時發生鼠標移動事件,按下一個鼠標鍵,比如說左鍵時,發生按下鼠標鍵事件,鬆開鼠標鍵時會發生鬆開鼠標鍵事件。

  3. 遊戲杆事件 這個暫時用不到,以後再說。

  4. 系統事件 包括:

      a) 活動事件(Active event) 判斷當前應用是否處於活動狀態;
      b) 離開事件(quit event)當你點擊窗口右上角的×關閉窗口時,發生離開事件;
      c) 改變窗口大小事件
      d) 窗口重繪事件
      ) 其他系統事件
      f) 用戶自定義事件

      在這節裏我們主要講述鍵盤事件的處理,當我們按下一個鍵時,我們首先要從事件隊列裏接收這個事件,然後檢測事件的類型,判別是那種事件,根據事件類型做相應的處理,整個過程就是這樣簡單。

      要接收一個事件,我們就要定義一個變量來保存該事件,在SDL中事件有專門的類型SDL_Event類型,SDL_Event是一個結構體,其定義如下:

typedef union SDL_Event
{
  Uint8 type; //事件類型
  SDL_ActiveEvent active; //窗口焦點、輸入焦點及鼠標焦點的失去和得到事件
  SDL_KeyboardEvent key; //鍵盤事件,鍵盤按下和釋放
  SDL_MouseMotionEvent motion; //鼠標移動事件
  SDL_MouseButtonEvent button; //鼠標按鍵事件
  SDL_JoyAxisEvent jaxis; //手柄事件
  SDL_JoyBallEvent jball; //手柄事件
  SDL_JoyHatEvent jhat; //手柄事件
  SDL_JoyButtonEvent jbutton; //手柄事件
  SDL_ResizeEvent resize; //窗口大小變化事件
  SDL_ExposeEvent expose; //窗口重繪事件
  SDL_QuitEvent quit; //退出事件
  SDL_UserEvent user; //用戶自定義事件
  SDL_SysWMEvent syswm; //平臺相關的系統事件
} SDL_Event;

  SDL_Event是一個聯合體,其中type字段決定了是那種事件,是一個枚舉類型,其定義爲:

typedef enum {
  SDL_NOEVENT = 0, /* 未使用 */
  SDL_ACTIVEEVENT, /* 應用程序失去焦點或得到焦點*/
  SDL_KEYDOWN, /* 按下某鍵 */
  SDL_KEYUP, /* 鬆開某鍵 */
  SDL_MOUSEMOTION, /* 鼠標移動 */
  SDL_MOUSEBUTTONDOWN, /* 鼠標鍵按下 */
  SDL_MOUSEBUTTONUP, /* 鼠標鍵鬆開 */
  SDL_JOYAXISMOTION, /*遊戲杆事件 */
  SDL_JOYBALLMOTION, /*遊戲杆事件*/
  SDL_JOYHATMOTION, /*遊戲杆事件*/
  SDL_JOYBUTTONDOWN, /*遊戲杆事件*/
  SDL_JOYBUTTONUP, /*遊戲杆事件*/
  SDL_QUIT, /*離開 */
  SDL_SYSWMEVENT, /* 系統事件 */
  SDL_EVENT_RESERVEDA, /* 保留 */
  SDL_EVENT_RESERVEDB, /* 保留 */
  SDL_VIDEORESIZE, /* 用戶改變視頻模式 */
  SDL_VIDEOEXPOSE, /* 屏幕重畫 */
  SDL_EVENT_RESERVED2, /* 保留*/
  SDL_EVENT_RESERVED3, /* 保留 */
  SDL_EVENT_RESERVED4, /* 保留 */
  SDL_EVENT_RESERVED5, /* 保留 */
  SDL_EVENT_RESERVED6, /* 保留*/
  SDL_EVENT_RESERVED7, /* 保留 */
  SDL_USEREVENT = 24, /* 用戶自定義事件 */
  /* This last event is only for bounding internal arrays
  It is the number of bits in the event mask datatype -- Uint32
  */
  SDL_NUMEVENTS = 32
} SDL_EventType;

  所以,我們要檢測事件一般會這樣寫:

一個經典的事件模式

SDL_Event myEvent;//事件
int quit = 0;
while (!quit) //建立事件主循環
{
  while (SDL_PollEvent(&myEvent))//從隊列裏取出事件
  {
    switch (myEvent.type) //根據事件類型分門別類去處理
    {
    case SDL_QUIT://如果是離開事件
      quit = 1;
      break;
    }
  }
}

  這是一段典型的事件處理程序,首先建立一個主循環處理事件,然後用SDL_PollEvent從事件隊列裏取出事件,判斷類型,然後處理。直到用戶按下離開則結束主循環。在這裏從事件隊列裏取出事件用的函數是SDL_PollEvent,它的原型是:

  int SDL_PollEvent(SDL_Event *event);

  參數:event是SDL_Event類型變量的地址。

  現在myEvent變量保存了事件的信息,如果你按的是離開,則myEvent保存了離開事件的信息,每一種事件都有自己的事件類型,保存處理本類事件的信息,離開事件的結構爲:

  typedef struct{

    Uint8 type

  } SDL_QuitEvent;

  其中,type的值就是SDL_QUIT 。

  下面我們以一個例子來說一下如何檢測鍵盤按鍵,這個例子是在屏幕上顯示一個小球,然後我們通過鼠標按鍵移動小球,代碼如下:

/*
  功能:演示事件處理
  作者:csl
  日期:2012-5-9
*/
#include <stdio.h> 
#include <stdlib.h> 
#include "SDL.h" //根據你加載sdl方式去填寫

//屏幕尺寸
#define SCREENWIDTH  640
#define SCREENHEIGH  480
#define BPP  32

//小球尺寸
#define BALLWIDTH  66
#define BALLHEIGH  66

SDL_Surface *gpScreen;//顯示錶面
SDL_Surface *gpBall;//小球圖片表面
SDL_Surface *gpBackGround;//背景圖片
SDL_Event myEvent;//事件

SDL_Surface *loadImage(char *aFilename);
int main(int argc,char *argv[])
{
    int quit = 0;
    SDL_Rect dst;

    if((SDL_Init(SDL_INIT_VIDEO)==-1)) //初始化視頻子系統
    {
        printf("Unable to init SDL: %s\n", SDL_GetError());
        exit(-1);
    }
    atexit(SDL_Quit);// 註冊SDL_Quit,當退出時調用,使得退出時程序自動清理

    //創建32位600*480窗口
    gpScreen = SDL_SetVideoMode(640,480, 32, SDL_HWSURFACE | SDL_HWPALETTE | SDL_DOUBLEBUF );
    if(!gpScreen) 
    { 
        exit(1);
    }
    gpBall = loadImage("ball.bmp");
    gpBackGround = loadImage("background.jpg");
    SDL_BlitSurface(gpBackGround,NULL,gpScreen,NULL);
    SDL_BlitSurface(gpBall,NULL,gpScreen,NULL);
    SDL_Flip(gpScreen);
    while (!quit)
    {
        while (SDL_PollEvent(&myEvent))
        {
            switch (myEvent.type)
            {
            case SDL_QUIT:
                quit = 1;
                break;
            }
        }
    }

    SDL_FreeSurface(gpScreen);//退出程序前必須釋放 
    SDL_FreeSurface(gpBall);
    SDL_FreeSurface(gpBackGround);
    SDL_Quit();
    //system("pause"); 
    return 0; 
}

/*--------------------------------------------------------------------
    函數名:    loadImage
    參  數:    char *filename  圖像文件的名字
    返回值:    SDL_Surface * 返回指向圖像表面的指針
    功  能:    載入圖像
    備  注:
----------------------------------------------------------------------*/
SDL_Surface *loadImage(char *aFilename)
{
    SDL_Surface* loadedImage = NULL;
    SDL_Surface* optimizedImage = NULL;

    //載入圖像
    loadedImage = IMG_Load( aFilename);
    if( NULL != loadedImage )//If the image loaded
    {
        //創建優化圖像
        optimizedImage = SDL_DisplayFormat( loadedImage );

        //釋放loadImage
        SDL_FreeSurface( loadedImage );
    }
    return optimizedImage;
}
   現在在屏幕左上方顯示了一個小球圖片,這和以前沒什麼不同,但窗口可以移動,你可以向拖動windows的窗口一樣拖動這個窗口,並且當你點擊關閉窗口時,可以結束程序,這就是事件主循環裏我們寫的事件捕捉代碼起了作用,當檢測到SDL_QUIT事件(也就是關閉窗口)將quit賦值爲1,則結束主循環,接着釋放資源,關閉程序。但小球並不能移動,所以下面我們要檢測鍵盤上下左右鍵的按鍵,以移動小球。
switch (myEvent.type)
{
case SDL_QUIT:
    quit = 1;
    break;
case SDL_KEYDOWN:
    //處理按下鍵
    break;
case SDL_KEYUP:
    //處理鬆開鍵;
    break;
}

  我們增加了兩個case塊,檢測是否按下或鬆開了鍵盤上的鍵。一個是檢測是否按下了鍵,一個檢測是否鬆開了按鍵。如果有按下或鬆開了鍵,那麼myEvent中保存的是鍵盤事件,鍵盤事件的結構是:


  typedef struct{

    Uint8 type; // SDL_KEYDOWNSDL_KEYUP

    Uint8 state; // SDL_PRESSED 或 SDL_RELEASED

    SDL_keysym keysym; // 包含按鍵的信息

  } SDL_KeyboardEvent;

  這個結構用來保存鍵盤按鍵的信息,type和state記錄相同的信息,如果是

  按下鍵則:type = SDL_KEYDOWN 和 state = SDL_PRESSED

  當鬆開鍵時:type = SDL_KEYUP 和 state = SDL_RELEASED

  keysym記錄了按鍵的信息,其結構爲:


    typedef struct{

      Uint8 scancode; // 鍵盤硬件產生的掃描碼

      SDLKey sym; // SDL所定義的虛擬碼

      SDLMod mod; // 修飾鍵

      Uint16 unicode; //按鍵的Unicode碼

    } SDL_keysym;

  對於一般程序只要檢測sys就夠了,最多再檢測是否同時按下alt、shelft鍵等修飾鍵mod。sym是SDL定義的枚舉類型,其中常用的虛擬鍵有:

虛擬碼

按鍵

SDLK_0 … SDLK_9

0 … 9

SDLK_a … SDLK_z

a … z

SDLK_UP, SDLK_DOWN,

SDLK_LEFT, SDLK_RIGHT

上下左右鍵

SDLK_F1 … SDLK_F15

F1 … F15

SDLK_LSHIFT, SDLK_RSHIFT

左 SHIFT鍵、右 SHIFT鍵

SDLK_LALT, SDLK_RALT

左 ALT鍵、右 ALT鍵

SDLK_LCTRL, SDLK_RCTRL

左 CTRL鍵、右 CTRL鍵

  mod是修飾鍵信息,常用的修飾鍵有:

SDL 修飾鍵

意義

KMOD_NONE

無修飾鍵

KMOD_NUM

數字鎖定鍵開啓

KMOD_CAPS

大寫鍵開啓

KMOD_LCTRL, KMOD_RCTRL

按下左 CTRL 鍵、右 CTRL鍵

KMOD_CTRL

按下任一 CTRL鍵

KMOD_LSHIFT, KMOD_RSHIFT

按下左 SHIFT鍵、右 SHIFT鍵

KMOD_SHIFT

按下任一 SHIFT鍵

KMOD_LALT, KMOD_RALT

按下左 ALT鍵、右 ALT鍵

KMOD_ALT

按下任一 ALT鍵

  現在我們知道了鍵盤事件結構和常用鍵值,那麼我們就可以完善鍵盤檢測功能了。   

switch (myEvent.type)
{
case SDL_QUIT:
  quit = 1;
  break;
case SDL_KEYDOWN:
  (myEvent.key.keysym.sym)
  {
  case SDLK_LEFT:
    printf("你按下了←\n");
    break;
  case SDLK_RIGHT:
    printf("你按下了→\n");
    break;
  case SDLK_UP:
    printf("你按下了↑\n");
    break;
  case SDLK_DOWN:
    printf("你按下了↓\n");
    break;
  }
  break;
case SDL_KEYUP:
  switch(myEvent.key.keysym.sym)
  {
  case SDLK_LEFT:
    printf("你鬆開了←\n");
    break;
  case SDLK_RIGHT:
    printf("你鬆開了→\n");
    break;
  case SDLK_UP:
    printf("你鬆開了↑\n");
    break;
  case SDLK_DOWN:
    printf("你鬆開了↓\n");
    break;
  }
  break;
}

  將這一段代碼加到程序裏,我們按一下上下左右鍵,可以看到控制檯窗口裏顯示了printf輸出的信息,你按一個←鍵,輸出“你按下←鍵”,“你鬆開了←鍵”。證明我們寫的鍵盤檢測代碼起了作用。

  switch的括號裏的表達式myEvent.key. keysym.sym的含義是這樣,從左往右看,myEvent.key這是取出鍵盤事件,key是事件結構中的成員,當發生的是鍵盤事件時,key保存鍵盤事件的信息, myEvent.key.keysym中keysym是鍵盤事件結構中按鍵信息成員,至此我們得到按鍵的信息,按鍵信息是一個結構體,我們只需檢測它的sym成員的值就可以判定用戶按的是那個鍵。

  到現在爲止,你應經明白瞭如何檢測鍵盤按鍵,那麼我們可以處理鍵盤按鍵,移動圖片了,原理就是當我們按向右的鍵時,我們可以讓圖片的x座標加1,然後將背景圖片重新刷到屏幕上,將小球圖片刷到新的位置,然後刷新屏幕就可以了。

  我們要在主函數開頭定義兩個整型變量:ballX,ballY,來表示小球的座標,然後修改按下鍵代碼檢測程序段爲:

    while (SDL_PollEvent(&myEvent))
        {
            switch (myEvent.type)
            {
            case SDL_QUIT:
                quit = 1;
                break;
            case SDL_KEYDOWN:
                switch(myEvent.key.keysym.sym)
                {
                case SDLK_LEFT:
                    ballX--;
                    break;
                case SDLK_RIGHT:
                    ballX++;
                    break;
                case SDLK_UP:
                    ballY--;
                    break;
                case SDLK_DOWN:
                    ballY++;
                    break;
                }
                break;
            case SDL_KEYUP:
                switch(myEvent.key.keysym.sym)
                {
                case SDLK_LEFT:
                    printf("小球的座標:(%d,%d)\n",ballX,ballY);
                    break;
                case SDLK_RIGHT:
                    printf("小球的座標:(%d,%d)\n",ballX,ballY);
                    break;
                case SDLK_UP:
                    printf("小球的座標:(%d,%d)\n",ballX,ballY);
                    break;
                case SDLK_DOWN:
                    printf("小球的座標:(%d,%d)\n",ballX,ballY);
                    break;
                }

                break;
            }
            SDL_BlitSurface(gpBackGround,NULL,gpScreen,NULL);
            dst.x = ballX;
            dst.y = ballY;
            dst.w = gpBall->w;
            dst.h = gpBall->h;
            SDL_BlitSurface(gpBall,NULL,gpScreen,&dst);
            SDL_Flip(gpScreen);

        }

  我們通過按上下左右鍵,修改小球的座標,然後將座標賦給dst(目標矩形),表面裏有每個圖像的寬和高,所以dst.w = gpBall->w;dst.h = gpBall->h;取得小球的寬度和高度賦給dst的w和h;然後重新將背景傳輸到顯示錶面上,將小球表面傳輸到顯示錶面上,dst指出小球表面在顯示錶面的位置。然後刷新屏幕。運行程序,可以看到如下結果:

  現在我們可以移動小球,但程序還有一些bug,1)我們一次移動一個像素,移動速度很慢;2)從結果上看小球的座標可以負的,也就是小球可以移動到顯示錶面外,這是沒有意義的;3)我們必須不停按鍵才能移動小球,而在記事本里如果我們按住一個字母鍵不鬆開,可以輸入一串字母,如果移動小球時也可以按下鍵不鬆開來移動小球效果會更好。

  我們可以定一個speed變量表示小球移動速度,將這個變量定義到主函數開頭:int speed = 1;//初始值爲1個像素。然後我們增加一個對“+”鍵的檢測,如果按了“+”我們把speed的值增1,這樣就可以控制速度了,同樣增加一個對“-”鍵的檢測,當用戶按下“-”後將speed的值減1。然後將原來的ballX++修改成ballX+=speed;這樣就可以增加移動的速度了,其他類似修改。當這樣解決不了小球會移動到屏幕外的問題,所以我們應對ballX的值檢測,若果ballX小於0,則讓它等於0;若ballX+BALLWIDTH的值大於屏幕寬度則讓ballX等於SCREENWIDTH-BALLWIDTH。這樣小球在x方向就不能移動出屏幕了,y方向做同樣的處理。修改後的代碼:

while (SDL_PollEvent(&myEvent))
        {
            switch (myEvent.type)
            {
            case SDL_QUIT:
                quit = 1;
                break;
            case SDL_KEYDOWN:
                switch(myEvent.key.keysym.sym)
                {
                case SDLK_LEFT:
                    ballX-=speed;
                    ballX = ballX<0?0:ballX;
                    break;
                case SDLK_RIGHT:
                    ballX+=speed;
                    ballX = (ballX+BALLWIDTH)>SCREENWIDTH?(SCREENWIDTH-BALLWIDTH):ballX;
                    break;
                case SDLK_UP:
                    ballY-=speed;
                    ballY=ballY<0?0:ballY;
                    break;
                case SDLK_DOWN:
                    ballY+=speed;
                    ballY = (ballY+BALLHEIGH)>SCREENHEIGH?(SCREENHEIGH-BALLHEIGH):ballY;
                    break;
                case SDLK_MINUS:
                    speed--;
                    speed=speed>0?speed:0;
                case SDLK_EQUALS:
                    speed++;
                }
                break;
            case SDL_KEYUP:
                switch(myEvent.key.keysym.sym)
                {
                case SDLK_LEFT:                    
                    printf("小球的座標:(%d,%d)\n",ballX,ballY);
                    break;
                case SDLK_RIGHT:                    
                    printf("小球的座標:(%d,%d)\n",ballX,ballY);
                    break;
                case SDLK_UP:                    
                    printf("小球的座標:(%d,%d)\n",ballX,ballY);
                    break;
                case SDLK_DOWN:                    
                    printf("小球的座標:(%d,%d)\n",ballX,ballY);
                    break;
                }
                break;
            }
            SDL_BlitSurface(gpBackGround,NULL,gpScreen,NULL);
            dst.x = ballX;
            dst.y = ballY;
            dst.w = gpBall->w;
            dst.h = gpBall->h;
            SDL_BlitSurface(gpBall,NULL,gpScreen,&dst);
            SDL_Flip(gpScreen);
     }

  還有第3個問題,其實第3個問題是“粘連鍵”,在SDL中有一個函數:

  int SDL_EnableKeyRepeat(int delay, int interval);

  參數 delay是指按下多長時間才啓動鍵的粘連;毫秒

  interval 是連續鍵的間隔時間,時間單位毫秒

  這個函數可以啓動鍵的粘連,所謂粘連就是如果你按下一個鍵超過一定毫秒數,比如說500毫秒,每個interval毫秒就認爲你又按了一次該建。比如說我們傳進兩個實參500,30,則系統認爲如果你按一個鍵500毫秒以上,每個30毫秒,則等價你又按了一次這個鍵。我們把這個函數調用放到事件主循環外。整個程序代碼如下:

/*
  功能:演示事件處理
  作者:csl
  日期:2012-5-9
*/
#include <stdio.h> 
#include <stdlib.h> 
#include "SDL.h"

//屏幕尺寸
#define SCREENWIDTH  640
#define SCREENHEIGH  480
#define BPP  32

//小球尺寸
#define BALLWIDTH  66
#define BALLHEIGH  66

SDL_Surface *gpScreen;//顯示錶面
SDL_Surface *gpBall;//小球圖片表面
SDL_Surface *gpBackGround;//背景圖片
SDL_Event myEvent;//事件

SDL_Surface *loadImage(char *aFilename);
int main(int argc,char *argv[])
{
    int quit = 0;
    SDL_Rect dst;
    int ballX = 0;//小球的初始座標
    int ballY = 0;
    int speed = 1;


    if((SDL_Init(SDL_INIT_VIDEO)==-1)) //初始化視頻子系統
    {
        printf("Unable to init SDL: %s\n", SDL_GetError());
        exit(-1);
    }
    atexit(SDL_Quit);// 註冊SDL_Quit,當退出時調用,使得退出時程序自動清理

    //創建32位600*480窗口
    gpScreen = SDL_SetVideoMode(SCREENWIDTH,SCREENHEIGH, BPP, SDL_HWSURFACE | SDL_HWPALETTE | SDL_DOUBLEBUF );
    if(!gpScreen) 
    { 
        exit(1);
    }
    gpBall = loadImage("ball.bmp");
    gpBackGround = loadImage("background.jpg");
    SDL_BlitSurface(gpBackGround,NULL,gpScreen,NULL);
    SDL_BlitSurface(gpBall,NULL,gpScreen,NULL);
    SDL_Flip(gpScreen);
    SDL_EnableKeyRepeat(500,30);
    while (!quit)
    {
        while (SDL_PollEvent(&myEvent))
        {
            switch (myEvent.type)
            {
            case SDL_QUIT:
                quit = 1;
                break;
            case SDL_KEYDOWN:
                switch(myEvent.key.keysym.sym)
                {
                case SDLK_LEFT:
                    ballX-=speed;
                    ballX = ballX<0?0:ballX;
                    break;
                case SDLK_RIGHT:
                    ballX+=speed;
                    ballX = (ballX+BALLWIDTH)>SCREENWIDTH?(SCREENWIDTH-BALLWIDTH):ballX;
                    break;
                case SDLK_UP:
                    ballY-=speed;
                    ballY=ballY<0?0:ballY;
                    break;
                case SDLK_DOWN:
                    ballY+=speed;
                    ballY = (ballY+BALLHEIGH)>SCREENHEIGH?(SCREENHEIGH-BALLHEIGH):ballY;
                    break;
                case SDLK_MINUS:
                    speed--;
                    speed=speed>0?speed:0;
                case SDLK_EQUALS:
                    speed++;
                }
                break;
            case SDL_KEYUP:
                switch(myEvent.key.keysym.sym)
                {
                case SDLK_LEFT:                    
                    printf("小球的座標:(%d,%d)\n",ballX,ballY);
                    break;
                case SDLK_RIGHT:                    
                    printf("小球的座標:(%d,%d)\n",ballX,ballY);
                    break;
                case SDLK_UP:                    
                    printf("小球的座標:(%d,%d)\n",ballX,ballY);
                    break;
                case SDLK_DOWN:                    
                    printf("小球的座標:(%d,%d)\n",ballX,ballY);
                    break;
                }
                break;
            }
            SDL_BlitSurface(gpBackGround,NULL,gpScreen,NULL);
            dst.x = ballX;
            dst.y = ballY;
            dst.w = gpBall->w;
            dst.h = gpBall->h;
            SDL_BlitSurface(gpBall,NULL,gpScreen,&dst);
            SDL_Flip(gpScreen);
        }
    }

    SDL_FreeSurface(gpScreen);//退出程序前必須釋放 
    SDL_FreeSurface(gpBackGround);
    SDL_FreeSurface(gpBall);
    SDL_Quit();

    //system("pause"); 
    return 0; 
}

/*--------------------------------------------------------------------
    函數名:    loadImage
    參  數:    char *filename  圖像文件的名字
    返回值:    SDL_Surface * 返回指向圖像表面的指針
    功  能:    載入圖像
    備  注:
----------------------------------------------------------------------*/
SDL_Surface *loadImage(char *aFilename)
{
    SDL_Surface* loadedImage = NULL;
    SDL_Surface* optimizedImage = NULL;

    //載入圖像
    loadedImage = IMG_Load( aFilename);

    if( NULL != loadedImage )//If the image loaded
    {
        //創建優化圖像
        optimizedImage = SDL_DisplayFormat( loadedImage );

        //釋放loadImage
        SDL_FreeSurface( loadedImage );
    }
    return optimizedImage;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章