作者:龍飛
4.1:再討論簡單的SDL event響應。
Uint8 *SDL_GetKeyState(int *numkeys);
要讓圖片動起來,最好是我們可以“操作”的動。按照一般思路,鍵盤的“上”“下”“左”“右”是不錯的選擇。在FPS游戲和模擬器中,我們可能更習慣wsad四個鍵,所以,讓他們同時起作用吧。這個函數的一般用法,是把參數設置為空指針。我們還是先忽略細節。因為有了兩個新的blit()重載方法的加入,我們設置要移動的圖片在screen上的坐標是(xpos,ypos),則:
//key event for up, down, left and right.
Uint8* keys;
//moving image's coordinate.
int xpos = 0;
int ypos = 0;
控制圖片移動的代碼如下:
//key event to move image.
keys = SDL_GetKeyState(0);
if ( keys[SDLK_UP] || keys[SDLK_w] ){
ypos -= 1;
}
if ( keys[SDLK_DOWN]|| keys[SDLK_s] ){
ypos += 1;
}
if ( keys[SDLK_LEFT]|| keys[SDLK_a] ){
xpos -= 1;
}
if ( keys[SDLK_RIGHT]|| keys[SDLK_d] ){
xpos += 1;
}
代碼一目了然,不用多解釋。具體對應的按鍵可參考:
http://www.libsdl.org/cgi/docwiki.cgi/SDLKey4.2:對于第二種方法的分析。
我們前面討論了總是把surface blit到screen上的情況。如果我們的思路是把其他surface先blit到一個作為背景畫布的surface上,最后把背景畫布blit到screen上呢?
我們將遇到的第一個疑問是,surface能不能把自己blit到自己上面?試驗的結果是否定的,而SDL并沒有給出官方的異常信息,即SDL_GetError()沒有起作用。所以,異常得我們自己來拋出。另外一個后果是,我們必須建立背景畫布的拷貝,把拷貝blit到背景畫布上才是可行的。
class DisplaySurface
{
public:
bool blitToSurface(const DisplaySurface& dst_surface,
int at_x = 0, int at_y = 0) const;
bool blitToSurface(const DisplaySurface& dst_surface,
int at_x, int at_y,
int from_x, int from_y, int w, int h,
int delta_x = 2, int delta_y = 2) const;
};
這和blit到screen是類似的,但是實際效果是完全不一樣的。因為,沒有被blit到screen上的surface,都不可能被flip顯示出來。所以,雖然參數列表是不一樣的,意味著我可以繼續用blit()這個名字重載。但是為了表明他們的實際效果有區別,我重新用了方法名。
bool DisplaySurface::blitToSurface(const DisplaySurface& dst_surface, int at_x, int at_y) const
{
SDL_Rect offset;
offset.x = at_x;
offset.y = at_y;
if ( &dst_surface == this )
throw "Cannot blit surface to itself!";
if ( SDL_BlitSurface(pSurface, 0, dst_surface.point(), &offset) < 0 )
return false;
else return true;
}
bool DisplaySurface::blitToSurface(const DisplaySurface& dst_surface,
int at_x, int at_y,
int from_x, int from_y, int w, int h,
int delta_x, int delta_y) const
{
SDL_Rect offset;
offset.x = at_x - delta_x;
offset.y = at_y - delta_y;
SDL_Rect dest;
dest.x = from_x - delta_x;
dest.y = from_y - delta_y;
dest.w = w + delta_x*2;
dest.h = h + delta_y*2;
if ( &dst_surface == this )
throw "Cannot blit surface to itself!";
if ( SDL_BlitSurface(pSurface, &dest, dst_surface.point(), &offset) < 0 )
return false;
else return true;
}
posted on 2008-02-21 15:12
lf426 閱讀(3816)
評論(2) 編輯 收藏 引用 所屬分類:
SDL入門教程