电竞比分网-中国电竞赛事及体育赛事平台

分享

SDL入門教程(四):1、SDL動畫的軟件渲染(Software Render)

 renhl252 2015-06-12

作者:龍飛

1.1:準(zhǔn)備工作。

        準(zhǔn)備一張640*480的bmp位圖(back.bmp)作為背景,另外一張小一點的(比如100*100的front.bmp)作為前景。
        渲染(render)是CG術(shù)語,是將以數(shù)據(jù)結(jié)構(gòu)儲存在計算機中的圖片以人眼可觀察的圖片實現(xiàn)出來的過程。前面例子中顯示一張bmp圖片實際上也是渲染。對于那張bmp圖片,我們經(jīng)歷了3過過程的處理:1、將bmp圖片轉(zhuǎn)化為SDL_Surface的結(jié)構(gòu)格式;2、將轉(zhuǎn)化后的SDL_Surface塊移(blit)到SDL創(chuàng)建的窗口surface上;3、將這個surface顯示出來,實際上就是渲染出來。
        當(dāng)然,前面僅僅是渲染了單幀的圖片,我們這里對程序做些修改,從而實際上是連續(xù)的渲染多幀動畫(雖然表面上我們并沒有讓畫面動起來)。

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:程序改動說明。

1) 使用了全屏幕顯示;
2) 使用了改動后的pressESCtoQuit()函數(shù),用于在全屏模式下方便退出。
3) 將一些變量修改為全局變量,以提供main()所調(diào)用的函數(shù)使用。
posted on 2008-02-15 15:50 lf426 閱讀(3504) 評論(0)  編輯 收藏 引用 所屬分類: SDL入門教程

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多