作者:龍飛
4.1:再討論簡(jiǎn)單的SDL event響應(yīng)。
Uint8 *SDL_GetKeyState(int *numkeys);
要讓圖片動(dòng)起來,最好是我們可以“操作”的動(dòng)。按照一般思路,鍵盤的“上”“下”“左”“右”是不錯(cuò)的選擇。在FPS游戲和模擬器中,我們可能更習(xí)慣wsad四個(gè)鍵,所以,讓他們同時(shí)起作用吧。這個(gè)函數(shù)的一般用法,是把參數(shù)設(shè)置為空指針。我們還是先忽略細(xì)節(jié)。因?yàn)橛辛藘蓚€(gè)新的blit()重載方法的加入,我們?cè)O(shè)置要移動(dòng)的圖片在screen上的坐標(biāo)是(xpos,ypos),則:
//key event for up, down, left and right.
Uint8* keys;
//moving image's coordinate.
int xpos = 0;
int ypos = 0;
控制圖片移動(dòng)的代碼如下:
//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;
}
代碼一目了然,不用多解釋。具體對(duì)應(yīng)的按鍵可參考:
http://www.libsdl.org/cgi/docwiki.cgi/SDLKey4.2:對(duì)于第二種方法的分析。
我們前面討論了總是把surface blit到screen上的情況。如果我們的思路是把其他surface先blit到一個(gè)作為背景畫布的surface上,最后把背景畫布blit到screen上呢?
我們將遇到的第一個(gè)疑問是,surface能不能把自己blit到自己上面?試驗(yàn)的結(jié)果是否定的,而SDL并沒有給出官方的異常信息,即SDL_GetError()沒有起作用。所以,異常得我們自己來拋出。另外一個(gè)后果是,我們必須建立背景畫布的拷貝,把拷貝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是類似的,但是實(shí)際效果是完全不一樣的。因?yàn)?,沒有被blit到screen上的surface,都不可能被flip顯示出來。所以,雖然參數(shù)列表是不一樣的,意味著我可以繼續(xù)用blit()這個(gè)名字重載。但是為了表明他們的實(shí)際效果有區(qū)別,我重新用了方法名。
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 閱讀(3838)
評(píng)論(2) 編輯 收藏 引用 所屬分類:
SDL入門教程