作者:龍飛
1.1:準(zhǔn)備工作。
準(zhǔn)備一張640*480的bmp位圖(back.bmp)作為背景,另外一張小一點(diǎn)的(比如100*100的front.bmp)作為前景。
渲染(render)是CG術(shù)語,是將以數(shù)據(jù)結(jié)構(gòu)儲(chǔ)存在計(jì)算機(jī)中的圖片以人眼可觀察的圖片實(shí)現(xiàn)出來的過程。前面例子中顯示一張bmp圖片實(shí)際上也是渲染。對(duì)于那張bmp圖片,我們經(jīng)歷了3過過程的處理:1、將bmp圖片轉(zhuǎn)化為SDL_Surface的結(jié)構(gòu)格式;2、將轉(zhuǎn)化后的SDL_Surface塊移(blit)到SDL創(chuàng)建的窗口surface上;3、將這個(gè)surface顯示出來,實(shí)際上就是渲染出來。
當(dāng)然,前面僅僅是渲染了單幀的圖片,我們這里對(duì)程序做些修改,從而實(shí)際上是連續(xù)的渲染多幀動(dòng)畫(雖然表面上我們并沒有讓畫面動(dòng)起來)。
1.2:演示程序的完整源代碼。
#include <iostream>
#include "SDL/SDL.h"
SDL_Surface* pScreen = 0;
SDL_Surface* pBack = 0;
SDL_Surface* pFront = 0;
void pressESCtoQuitPlus();
void loopRender();
int main(int argc, char* argv[])
{
try {
if ( SDL_Init(SDL_INIT_VIDEO) != 0 )
throw SDL_GetError();
}
catch ( const char* s ) {
std::cerr << "SDL_Init() failed!\n" << s << std::endl;
return -1;
}
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;
const Uint32 SCREEN_FLAGS = SDL_FULLSCREEN;
pScreen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SCREEN_FLAGS);
try {
if ( pScreen == 0 )
throw SDL_GetError();
}
catch ( const char* s ) {
std::cerr << "SDL_SetVideoMode() failed!\n" << s << std::endl;
SDL_Quit();
return -1;
}
pBack = SDL_LoadBMP("back.bmp");
try {
if ( pBack == 0 )
throw SDL_GetError();
}
catch ( const char* s ) {
std::cerr << "SDL_LoadBMP() failed!\n" << s << std::endl;
SDL_Quit();
return -1;
}
pFront = SDL_LoadBMP("front.bmp");
try {
if ( pFront == 0 )
throw SDL_GetError();
}
catch ( const char* s ) {
std::cerr << "SDL_LoadBMP() failed!\n" << s << std::endl;
SDL_Quit();
return -1;
}
try {
pressESCtoQuitPlus();
}
catch ( const char* s ) {
std::cerr << "pressESCtoQuitPlus() failed!\n" << s << std::endl;
SDL_Quit();
return -1;
}
SDL_Quit();
return 0;
}
void pressESCtoQuitPlus()
{
bool gameOver = false;
while( gameOver == false ){
SDL_Event gameEvent;
while ( SDL_PollEvent(&gameEvent) != 0 ){
if ( gameEvent.type == SDL_QUIT ){
gameOver = true;
}
if ( gameEvent.type == SDL_KEYUP ){
if ( gameEvent.key.keysym.sym == SDLK_ESCAPE ){
gameOver = true;
}
}
}
loopRender();
}
return;
}
void loopRender()
{
SDL_Rect* pSrcRect = 0;
SDL_Rect* pDstRect = 0;
if ( SDL_BlitSurface(pBack, pSrcRect, pScreen, pDstRect) != 0 )
throw SDL_GetError();
if ( SDL_BlitSurface(pFront, pSrcRect, pScreen, pDstRect) != 0 )
throw SDL_GetError();
if ( SDL_Flip(pScreen) != 0 )
throw SDL_GetError();
return;
}
1.3:程序改動(dòng)說明。
1) 使用了全屏幕顯示;
2) 使用了改動(dòng)后的pressESCtoQuit()函數(shù),用于在全屏模式下方便退出。
3) 將一些變量修改為全局變量,以提供main()所調(diào)用的函數(shù)使用。
posted on 2008-02-15 15:50
lf426 閱讀(4410)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
SDL入門教程