• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 96  文章 - 255  trackbacks - 0
            <2008年3月>
            2425262728291
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            E-mail:zbln426@163.com QQ:85132383 長(zhǎng)期尋找對(duì)戰(zhàn)略游戲感興趣的合作伙伴。

            常用鏈接

            留言簿(21)

            隨筆分類

            隨筆檔案

            SDL相關(guān)網(wǎng)站

            我的個(gè)人網(wǎng)頁(yè)

            我的小游戲

            資源下載

            搜索

            •  

            積分與排名

            • 積分 - 493193
            • 排名 - 39

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            注意:ttf字庫(kù)文件,可以在
            C:\WINDOWS\Fonts
            下尋找,比如例子中用到的times.ttf;
            lazy.ttf請(qǐng)到Lazy Foo的相關(guān)教程True Type Fonts后面的示例中獲得。

            //UVi Soft (2008)
            //Long Fei (lf426), E-mail: zbln426@163.com

            //FileName: SurfaceClass.h

            #ifndef SURFACE_CLASS_H
            #define SURFACE_CLASS_H

            #include 
            <iostream>
            #include 
            <string>
            #include 
            "SDL/SDL.h"
            #include 
            "SDL/SDL_image.h"
            #include 
            "SDL/SDL_ttf.h"

            class ScreenSurface
            {
            private:
                
            static int screenNum;
                
            int width;
                
            int height;
                
            int bpp;
                Uint32 flags;
                SDL_Surface
            * pScreen;
                
            char* windowName;
            public:
                ScreenSurface();
                ScreenSurface(
            int w, int h, char* window_name = 0int b = 0, Uint32 f = 0);
                
            ~ScreenSurface();
                SDL_Surface
            * point() const;
                
            void flip() const;
                
            void fillColor(Uint8 r = 0, Uint8 g = 0, Uint8 b = 0const;
            };

            class DisplaySurface
            {
            private:
                std::
            string fileName;
                SDL_Surface
            * pSurface;
                SDL_Surface
            * pScreen;
                
            //for TextSurafce
                static int textNum;
                TTF_Font
            * pFont;
            public:
                DisplaySurface(
            const std::string& file_name, const ScreenSurface& screen);
                
            ~DisplaySurface();
                SDL_Surface
            * point() const;
                
            void blit() const;
                
            void blit(int at_x, int at_y) const;
                
            void blit(int at_x, int at_y,
                            
            int from_x, int from_y, int w, int h,
                            
            int delta_x = 0int delta_y = 0const;
                
            void colorKey(Uint8 r = 0, Uint8 g = 0xFF, Uint8 b = 0xFF, Uint32 flag = SDL_SRCCOLORKEY);
            protected:
                
            //for TextSurface
                DisplaySurface(const std::string& msg_name, const std::string& message, const ScreenSurface& screen,
                                Uint8 r, Uint8 g, Uint8 b, 
                                
            const std::string& ttf_fileName, int ttf_size);
                
            int tellTextNum() const;
                
            void reduceTextNum();
                
            void deleteFontPoint();
            };

            class TextSurface: public DisplaySurface
            {
            public:
                TextSurface(
            const std::string& msg_name, const std::string& message, const ScreenSurface& screen,
                                Uint8 r 
            = 0xFF, Uint8 g = 0xFF, Uint8 b = 0xFF
                                
            const std::string& ttf_fileName = "lazy.ttf"int ttf_size = 28);
                
            ~TextSurface();
            };

            class ErrorInfo
            {
            private:
                std::
            string info;
            public:
                ErrorInfo():info(
            "Unknown ERROR!")
                {}
                ErrorInfo(
            const char* c_str)
                {
                    info 
            = std::string(c_str);
                }
                ErrorInfo(
            const std::string& str):info(str)
                {}
                
            void show() const
                {
                    std::cerr 
            << info << std::endl;
                }
            };

            #endif

            //UVi Soft (2008)
            //Long Fei (lf426), E-mail: zbln426@163.com

            #include 
            "SurfaceClass.h"

            //VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
            //class ScreenSurface

            int ScreenSurface::screenNum = 0;

            ScreenSurface::ScreenSurface():
            width(
            640), height(480), bpp(32), flags(0), windowName(0)
            {
                
            if ( screenNum > 0 )
                    
            throw ErrorInfo("DONOT create more than ONE screen!");
                
            if ( SDL_Init(SDL_INIT_VIDEO < 0 ) )
                    
            throw ErrorInfo(SDL_GetError());
                pScreen 
            = SDL_SetVideoMode(width, height, bpp, flags);
                screenNum
            ++;
            }

            ScreenSurface::ScreenSurface(
            int w, int h, char* window_name, int b, Uint32 f):
            width(w), height(h), bpp(b), flags(f)
            {
                
            if ( screenNum > 0 )
                    
            throw ErrorInfo("DONOT create more than ONE screen!");
                
            if ( SDL_Init(SDL_INIT_VIDEO < 0 ) )
                    
            throw ErrorInfo(SDL_GetError());
                pScreen 
            = SDL_SetVideoMode(width, height, bpp, flags);
                screenNum
            ++;
                
            if ( window_name != 0 ) {
                    windowName 
            = window_name;
                    SDL_WM_SetCaption(windowName, 
            0);
                }
                
            else
                    windowName 
            = 0;
            }

            ScreenSurface::
            ~ScreenSurface()
            {
                SDL_Quit();
            }

            SDL_Surface
            * ScreenSurface::point() const
            {
                
            return pScreen;
            }

            void ScreenSurface::flip() const
            {
                
            if ( SDL_Flip(pScreen) < 0 )
                    
            throw ErrorInfo(SDL_GetError());
            }


            void ScreenSurface::fillColor(Uint8 r, Uint8 g, Uint8 b) const
            {
                 
            if ( SDL_FillRect(pScreen, 0, SDL_MapRGB(pScreen->format, r, g, b)) < 0 )
                     
            throw ErrorInfo(SDL_GetError());
            }

            //AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

            //VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
            //class DisplaySurface

            int DisplaySurface::textNum = 0;

            DisplaySurface::DisplaySurface(
            const std::string& file_name, const ScreenSurface& screen):
            fileName(file_name), pFont(
            0)
            {
                SDL_Surface
            * pSurfaceTemp = IMG_Load(file_name.c_str());
                
            if ( pSurfaceTemp == 0 )
                    
            throw ErrorInfo(SDL_GetError());
                pSurface 
            = SDL_DisplayFormat(pSurfaceTemp);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo(SDL_GetError());
                SDL_FreeSurface(pSurfaceTemp);
                pScreen 
            = screen.point();
            }

            DisplaySurface::
            ~DisplaySurface()
            {
                SDL_FreeSurface(pSurface);
            }

            SDL_Surface
            * DisplaySurface::point() const
            {
                
            return pSurface;
            }

            void DisplaySurface::blit() const
            {
                
            if ( SDL_BlitSurface(pSurface, 0, pScreen, 0< 0 )
                    
            throw ErrorInfo(SDL_GetError());
            }


            void DisplaySurface::blit(int at_x, int at_y) const
            {
                SDL_Rect offset;
                offset.x 
            = at_x;
                offset.y 
            = at_y;

                
            if ( SDL_BlitSurface(pSurface, 0, pScreen, &offset) < 0 )
                    
            throw ErrorInfo(SDL_GetError());
            }

            void DisplaySurface::blit(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 ( SDL_BlitSurface(pSurface, &dest, pScreen, &offset) < 0 )
                    
            throw ErrorInfo(SDL_GetError());
            }

            void DisplaySurface::colorKey(Uint8 r, Uint8 g, Uint8 b, Uint32 flag)
            {
                Uint32 colorkey 
            = SDL_MapRGB(pSurface->format, r, g, b);
                
            if ( SDL_SetColorKey(pSurface, flag, colorkey ) < 0 )
                    
            throw ErrorInfo(SDL_GetError());
            }

            //for TextSurface
            DisplaySurface::DisplaySurface(const std::string& msg_name, const std::string& message, const ScreenSurface& screen,
                                Uint8 r, Uint8 g , Uint8 b, 
                                
            const std::string& ttf_fileName, int ttf_size):
            fileName(msg_name)
            {
                
            if ( textNum == 0 )
                    
            if ( TTF_Init() < 0 )
                        
            throw ErrorInfo("TTF_Init() failed!");
                
                SDL_Color textColor;
                textColor.r 
            = r;
                textColor.g 
            = g;
                textColor.b 
            = b;

                pFont 
            = TTF_OpenFont(ttf_fileName.c_str(), ttf_size);
                
            if ( pFont == 0 )
                    
            throw ErrorInfo("TTF_OpenFont() failed!");

                pSurface 
            = TTF_RenderText_Solid(pFont, message.c_str(), textColor);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo("TTF_RenderText_solid() failed!");
                pScreen 
            = screen.point();

                textNum
            ++;
            }

            int DisplaySurface::tellTextNum() const
            {
                
            return textNum;
            }

            void DisplaySurface::reduceTextNum()
            {
                textNum
            --;
            }

            void DisplaySurface::deleteFontPoint()
            {
                TTF_CloseFont(pFont);
            }

            //AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

            //VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
            //class TextSurface

            TextSurface::TextSurface(
            const std::string& msg_name, const std::string& message, const ScreenSurface& screen,
                                Uint8 r, Uint8 g, Uint8 b, 
                                
            const std::string& ttf_fileName, int ttf_size):
            DisplaySurface(msg_name, message, screen, r, g, b, ttf_fileName, ttf_size)
            {}

            TextSurface::
            ~TextSurface()
            {
                deleteFontPoint();
                reduceTextNum();
                
            if ( tellTextNum() == 0 )
                    TTF_Quit();
            }

            //AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

            //UVi Soft (2008)
            //Long Fei (lf426), E-mail: zbln426@163.com

            #include 
            "SurfaceClass.h"

            int game(int argc, char* argv[]);
            int main(int argc ,char* argv[])
            {
                
            int mainRtn = 0;
                
            try {
                    mainRtn 
            = game(argc, argv);
                }
                
            catch ( const ErrorInfo& info ) {
                    info.show();
                    
            return -1;
                }
                
                
            return mainRtn;
            }

            int game(int argc ,char* argv[])
            {
                
            //Create a SDL screen.
                const int SCREEN_WIDTH = 640;
                
            const int SCREEN_HEIGHT = 480;
                ScreenSurface screen(SCREEN_WIDTH, SCREEN_HEIGHT, 
            "Font");
                
            //Fill background with white.(default is black)
                screen.fillColor(0xFF0xFF0xFF);

                
            //Load a textSurface
                TextSurface myText("logo""UVi Soft", screen, 000xFF"times.ttf"80);
                TextSurface lazy(
            "lazy""by lf426 (zbln426@163.com)", screen, 0xff00);
                
            //Display text
                myText.blit(170180);
                lazy.blit(
            150,400);
                screen.flip();
                
                
            //press ESC or click X to quit.
                bool gameOver = false;
                SDL_Event gameEvent;
                
            while( gameOver == false ){
                    
            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;
                            }
                        }
                    }
                }

                
            return 0;
            }
            posted on 2008-03-24 20:31 lf426 閱讀(2347) 評(píng)論(2)  編輯 收藏 引用 所屬分類: SDL入門(mén)教程

            FeedBack:
            # re: SDL入門(mén)教程(九):2、顯示文本的完整代碼 2008-07-20 14:58 zhou
            class TextSurface: public DisplaySurface
            {
            };

            DisplaySurface作為父類需要提供虛析構(gòu)函數(shù),否則:

            DisplaySurface*psurface = new TextSurface;
            delete psurface;

            這樣調(diào)用時(shí),TextSurface的析構(gòu)函數(shù)不會(huì)被調(diào)用。
              回復(fù)  更多評(píng)論
              
            # re: SDL入門(mén)教程(九):2、顯示文本的完整代碼[未登錄](méi) 2008-07-21 13:38 lf426
            謝謝。你說(shuō)得很對(duì),當(dāng)初在開(kāi)始寫(xiě)本節(jié)教程的時(shí)候還沒(méi)有把SDL幾種surface的關(guān)系整理清晰。在后面的SurfaceClass中,我設(shè)置了一個(gè)BaseSurface作為Picture和Text兩種面的父類,這個(gè)面就使用了虛析構(gòu)函數(shù)了。更新的代碼在“mySDL_GameEngine”,請(qǐng)不吝賜教,萬(wàn)分感謝。  回復(fù)  更多評(píng)論
              
            无码任你躁久久久久久老妇App| 久久精品青青草原伊人| 91久久精一区二区三区大全| 国产亚洲色婷婷久久99精品| 91久久婷婷国产综合精品青草| 中文字幕一区二区三区久久网站 | 亚洲va久久久噜噜噜久久男同 | 国产成人精品久久免费动漫| 亚洲狠狠综合久久| 思思久久99热只有频精品66| www性久久久com| 青青草原综合久久大伊人| 久久精品成人免费网站| 久久丫忘忧草产品| 久久99精品久久久久久野外| 欧美一区二区三区久久综| 久久se精品一区精品二区国产| 人妻丰满AV无码久久不卡| 久久精品国产WWW456C0M| 精品一区二区久久| 色偷偷88888欧美精品久久久| 久久综合色区| 国产69精品久久久久99尤物| 国内精品久久久久影院优| 久久九九久精品国产免费直播| 精品久久久久久无码中文字幕| 99久久人妻无码精品系列| 久久青青草原精品国产| 亚洲精品国精品久久99热一| 精品国产乱码久久久久软件| 久久99国产一区二区三区| 伊人久久大香线蕉精品| 国产V亚洲V天堂无码久久久| 欧美激情一区二区久久久| 午夜精品久久久内射近拍高清| 国产精品免费久久| 成人精品一区二区久久| 欧美激情精品久久久久久久九九九 | 97r久久精品国产99国产精| 国产成年无码久久久久毛片| 久久99国产亚洲高清观看首页 |