• <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年2月>
            272829303112
            3456789
            10111213141516
            17181920212223
            2425262728291
            2345678

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

            常用鏈接

            留言簿(21)

            隨筆分類

            隨筆檔案

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

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

            我的小游戲

            資源下載

            搜索

            •  

            積分與排名

            • 積分 - 492144
            • 排名 - 38

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            Widows version:

            //UVi Soft ( 2008 )
            //Long Fei ( lf426 ), E-mail: zbln426@163.com
            //Laboratory of ZaiBieLiunNian
            //http://www.shnenglu.com/lf426/

            //FileName: SurfaceClass.hpp
            //For Windows only

            #ifndef SURFACE_CLASS_HPP
            #define SURFACE_CLASS_HPP

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

            class ScreenSurface
            {
            private:
                
            //number of screen, make sure there is only ONE screen
                static int screenNum;
                
            //size & bpp  of screen
                int width;
                
            int height;
                
            int bpp;
                
            //common flags:SDL_SWSURFACE, SDL_HWSURFACE, SDL_DOUBLEBUF, SDL_FULLSCREEN
                
            //more: http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fSetVideoMode
                Uint32 flags;
                
            //other attribute
                SDL_Surface* pScreen;
                std::
            string windowName;
            public:
                
            //construct & deconstruct
                ScreenSurface();
                ScreenSurface(
            int w, int h, const std::string& window_name = "NULL"int b = 0, Uint32 f = 0);
                
            ~ScreenSurface();
                
            //screen's point
                SDL_Surface* point() const;
                
            //flip the screen
                void flip() const;
                
            //fill the screen with some color, default is black.
                void fillColor(Uint8 r = 0, Uint8 g = 0, Uint8 b = 0const;
            };

            class BaseSurface
            {
            private:
                
            //
            protected:
                SDL_Surface
            * pScreen;
                SDL_Surface
            * pSurface;
                BaseSurface();
            public:
                BaseSurface(
            const BaseSurface& copy);
                
            virtual ~BaseSurface();
                BaseSurface
            & operator=(const BaseSurface& copy);
                
            //surface's point
                SDL_Surface* point() const;
                
            //blit surface to screen
                void blit() const;
                
            void blit(int any_num) 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;
                
            //blit surface to another surface
                void blit(const BaseSurface& dst_surface) const;
                
            void blit(const BaseSurface& dst_surface, int any_num) const;
                
            void blit(const BaseSurface& dst_surface,
                                    
            int at_x, int at_y) const;
                
            void blit(const BaseSurface& dst_surface,
                                    
            int at_x, int at_y,
                                    
            int from_x, int from_y, int w, int h,
                                    
            int delta_x = 0int delta_y = 0const;
                
            //color keying
                void colorKey(Uint8 r = 0, Uint8 g = 0xFF, Uint8 b = 0xFF, Uint32 flag = SDL_SRCCOLORKEY);
            };

            class PictureSurface: public BaseSurface
            {
            private:
                std::
            string fileName;
            public:
                PictureSurface(
            const std::string& file_name, const ScreenSurface& screen);
            };

            class TextSurface: public BaseSurface
            {
            private:
                
            static int textNum;
                std::
            string message;
                std::
            string TTF_fileName;
                
            int TTF_size;
                Uint8 r, g, b;
            public:
                TextSurface(
            const std::string& _message, const ScreenSurface& screen,
                    Uint8 _r 
            = 0xFF, Uint8 _g = 0xFF, Uint8 _b = 0xFF
                    
            int ttf_size = 28const std::string& ttf_fileName = "./fonts/gkai00mp.ttf");
                TextSurface(
            const TextSurface& copy);
                
            ~TextSurface();
                
            //text tools
                void toBlended();
                
            void toSolid();
                
            void toShaded(Uint8 _r, Uint8 _g, Uint8 _b);
                
            void setColor(Uint8 _r, Uint8 _g, Uint8 _b);
                
            void setSize(int ttf_size);
                
            void setFont(const std::string& ttf_fileName);
            };

            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
            //Laboratory of ZaiBieLiunNian
            //http://www.shnenglu.com/lf426/

            //FileName: SurfaceClass.cpp
            //For Windows only

            #include 
            "SurfaceClass.hpp"

            //*****************************************
            //class ScreenSurface

            int ScreenSurface::screenNum = 0;

            ScreenSurface::ScreenSurface():
            width(
            640), height(480), bpp(32), flags(0), windowName("NULL")
            {
                
            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, const std::string& 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 != "NULL" ) {
                    windowName 
            = window_name;
                    SDL_WM_SetCaption(windowName.c_str(), 
            0);
                }
                
            else
                    windowName 
            = "NULL";
            }

            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());
            }

            //************************************



            //************************************
            //class BaseSurface

            //protected
            BaseSurface::BaseSurface():
            pScreen(
            0), pSurface(0)
            {}

            //public
            BaseSurface::BaseSurface(const BaseSurface& copy):
            pScreen(copy.pScreen)
            {
                pSurface 
            = SDL_ConvertSurface(copy.pSurface, copy.pSurface->format, SDL_SWSURFACE);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo(SDL_GetError());
            }

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

            BaseSurface
            & BaseSurface::operator=(const BaseSurface& copy)
            {
                SDL_FreeSurface(pSurface);
                pSurface 
            = SDL_ConvertSurface(copy.pSurface, copy.pSurface->format, SDL_SWSURFACE);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo(SDL_GetError());
                
            return *this;
            }

            //***

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

            //***

            void BaseSurface::blit() const
            {
                
            const int SRC_W = pSurface->w;
                
            const int SRC_H = pSurface->h;
                
            const int DST_W = pScreen->w;
                
            const int DST_H = pScreen->h;

                SDL_Rect offset;
                offset.x 
            = ( DST_W - SRC_W ) / 2;
                offset.y 
            = ( DST_H - SRC_H ) / 2;
                
            if ( SDL_BlitSurface(pSurface, 0, pScreen, &offset) < 0 )
                    
            throw ErrorInfo(SDL_GetError());
            }

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

            void BaseSurface::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 BaseSurface::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 BaseSurface::blit(const BaseSurface& dst_surface) const
            {
                
            const int SRC_W = pSurface->w;
                
            const int SRC_H = pSurface->h;
                
            const int DST_W = dst_surface.point()->w;
                
            const int DST_H = dst_surface.point()->h;

                SDL_Rect offset;
                offset.x 
            = ( DST_W - SRC_W ) / 2;
                offset.y 
            = ( DST_H - SRC_H ) / 2;

                
            if ( &dst_surface == this )
                    
            throw ErrorInfo("Cannot blit surface to itself!");

                
            if ( SDL_BlitSurface(pSurface, 0, dst_surface.point(), &offset) < 0 )
                    
            throw ErrorInfo(SDL_GetError());
            }

            void BaseSurface::blit(const BaseSurface& dst_surface, int any_num) const
            {
                
            if ( &dst_surface == this )
                    
            throw ErrorInfo("Cannot blit surface to itself!");

                
            if ( SDL_BlitSurface(pSurface, 0, dst_surface.point(), 0< 0 )
                    
            throw ErrorInfo(SDL_GetError());
            }

            void BaseSurface::blit(const BaseSurface& 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 ErrorInfo("Cannot blit surface to itself!");

                
            if ( SDL_BlitSurface(pSurface, 0, dst_surface.point(), &offset) < 0 )
                    
            throw ErrorInfo(SDL_GetError());
            }

            void BaseSurface::blit(const BaseSurface& 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 ErrorInfo("Cannot blit surface to itself!");

                
            if ( SDL_BlitSurface(pSurface, &dest, dst_surface.point(), &offset) < 0 )
                    
            throw ErrorInfo(SDL_GetError());
            }

            //***

            void BaseSurface::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());
            }

            //************************************


            //************************************
            //class PictureSurface

            PictureSurface::PictureSurface(
            const std::string& file_name, const ScreenSurface& screen):
            BaseSurface(),
            fileName(file_name)
            {
                SDL_Surface
            * pSurfaceTemp = IMG_Load(fileName.c_str());
                
            if ( pSurfaceTemp == 0 )
                    
            throw ErrorInfo(IMG_GetError());
                pSurface 
            = SDL_DisplayFormat(pSurfaceTemp);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo(SDL_GetError());
                SDL_FreeSurface(pSurfaceTemp);

                pScreen 
            = screen.point();
            }

            //************************************



            //************************************
            //class TextSurface

            int TextSurface::textNum = 0;

            TextSurface::TextSurface(
            const std::string& _message, const ScreenSurface& screen,
                    Uint8 _r, Uint8 _g, Uint8 _b, 
                    
            int ttf_size, const std::string& ttf_fileName):
            BaseSurface(),
            message(_message), TTF_fileName(ttf_fileName), TTF_size(ttf_size), 
            r(_r), g(_g), b(_b)
            {
                
            if ( textNum == 0 ){
                    
            if ( TTF_Init() < 0 ){
                        
            throw ErrorInfo(TTF_GetError());
                    }
                }

                SDL_Color textColor;
                textColor.r 
            = r;
                textColor.g 
            = g;
                textColor.b 
            = b;

                TTF_Font
            * pFont = TTF_OpenFont(TTF_fileName.c_str(), TTF_size);
                
            if ( pFont == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                pSurface 
            = myTTF_RenderString_Blended(pFont, message, textColor);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                TTF_CloseFont(pFont);

                pScreen 
            = screen.point();

                textNum
            ++;
            }


            TextSurface::TextSurface(
            const TextSurface& copy):
            BaseSurface(copy),
            message(copy.message), TTF_fileName(copy.TTF_fileName), TTF_size(copy.TTF_size), 
            r(copy.r), g(copy.g), b(copy.b)
            {
                textNum
            ++;
            }


            TextSurface::
            ~TextSurface()
            {
                textNum
            --;
                
            if ( textNum == 0 ){
                    TTF_Quit();
                }
            }

            //***

            void TextSurface::toBlended()
            {
                SDL_FreeSurface(pSurface);

                SDL_Color textColor;
                textColor.r 
            = r;
                textColor.g 
            = g;
                textColor.b 
            = b;

                TTF_Font
            * pFont = TTF_OpenFont(TTF_fileName.c_str(), TTF_size);
                
            if ( pFont == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                pSurface 
            = myTTF_RenderString_Blended(pFont, message, textColor);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                TTF_CloseFont(pFont);
            }

            void TextSurface::toSolid()
            {
                SDL_FreeSurface(pSurface);

                SDL_Color textColor;
                textColor.r 
            = r;
                textColor.g 
            = g;
                textColor.b 
            = b;

                TTF_Font
            * pFont = TTF_OpenFont(TTF_fileName.c_str(), TTF_size);
                
            if ( pFont == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                pSurface 
            = myTTF_RenderString_Solid(pFont, message, textColor);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                TTF_CloseFont(pFont);
            }

            void TextSurface::toShaded(Uint8 _r, Uint8 _g, Uint8 _b)
            {
                SDL_Color textColor;
                textColor.r 
            = r;
                textColor.g 
            = g;
                textColor.b 
            = b;
                
                SDL_Color bgColor;
                bgColor.r 
            = _r;
                bgColor.g 
            = _g;
                bgColor.b 
            = _b;

                SDL_FreeSurface(pSurface);

                TTF_Font
            * pFont = TTF_OpenFont(TTF_fileName.c_str(), TTF_size);
                
            if ( pFont == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                pSurface 
            = myTTF_RenderString_Shaded(pFont, message, textColor, bgColor);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                TTF_CloseFont(pFont);
            }

            void TextSurface::setColor(Uint8 _r, Uint8 _g, Uint8 _b)
            {
                SDL_FreeSurface(pSurface);

                SDL_Color textColor;
                textColor.r 
            = r = _r;
                textColor.g 
            = g = _g;
                textColor.b 
            = b = _b;

                TTF_Font
            * pFont = TTF_OpenFont(TTF_fileName.c_str(), TTF_size);
                
            if ( pFont == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                pSurface 
            = myTTF_RenderString_Blended(pFont, message, textColor);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                TTF_CloseFont(pFont);
            }

            void TextSurface::setSize(int ttf_size)
            {
                SDL_FreeSurface(pSurface);

                SDL_Color textColor;
                textColor.r 
            = r;
                textColor.g 
            = g;
                textColor.b 
            = b;
                
                TTF_size 
            = ttf_size;
                TTF_Font
            * pFont = TTF_OpenFont(TTF_fileName.c_str(), TTF_size);
                
            if ( pFont == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                pSurface 
            = myTTF_RenderString_Blended(pFont, message, textColor);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                TTF_CloseFont(pFont);
            }

            void TextSurface::setFont(const std::string& ttf_fileName)
            {
                SDL_FreeSurface(pSurface);

                SDL_Color textColor;
                textColor.r 
            = r;
                textColor.g 
            = g;
                textColor.b 
            = b;
                
                TTF_fileName 
            = ttf_fileName;
                TTF_Font
            * pFont = TTF_OpenFont(TTF_fileName.c_str(), TTF_size);
                
            if ( pFont == 0 )
                    
            throw ErrorInfo(TTF_GetError());

                pSurface 
            = myTTF_RenderString_Blended(pFont, message, textColor);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                TTF_CloseFont(pFont);
            }
            //*************************************

            Linux version:


            //UVi Soft ( 2008 ) 
            //Long Fei ( lf426 ), E-mail: zbln426@163.com 
            //Laboratory of ZaiBieLiunNian 
            //http://www.shnenglu.com/lf426/ 
             
            //FileName: SurfaceClass.hpp
            //For Linux and other UTF-8 OS 
             
            #ifndef SURFACE_CLASS_HPP 
            #define SURFACE_CLASS_HPP 
             
            #include 
            <iostream> 
            #include 
            <string> 
            #include 
            "SDL/SDL.h" 
            #include 
            "SDL/SDL_image.h" 
            #include 
            "SDL/SDL_ttf.h"
            //Linux can render UTF-8 Chinese directly
            //For Windows (simple Chinese), include below 
            //#include "SDL_render_Chinese.h" 
             
            class ScreenSurface 

            private
                
            //number of screen, make sure there is only ONE screen 
                static int screenNum; 
                
            //size & bpp  of screen 
                int width; 
                
            int height; 
                
            int bpp; 
                
            //common flags:SDL_SWSURFACE, SDL_HWSURFACE, SDL_DOUBLEBUF, SDL_FULLSCREEN 
                
            //more: http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fSetVideoMode 
                Uint32 flags; 
                
            //other attribute 
                SDL_Surface* pScreen; 
                std::
            string windowName; 
            public
                
            //construct & deconstruct 
                ScreenSurface(); 
                ScreenSurface(
            int w, int h, const std::string& window_name = "NULL"int b = 0, Uint32 f = 0); 
                
            ~ScreenSurface(); 
                
            //screen's point 
                SDL_Surface* point() const
                
            //flip the screen 
                void flip() const
                
            //fill the screen with some color, default is black. 
                void fillColor(Uint8 r = 0, Uint8 g = 0, Uint8 b = 0const
            }; 
             
            class BaseSurface 

            private
                
            // 
            protected
                SDL_Surface
            * pScreen; 
                SDL_Surface
            * pSurface; 
                BaseSurface(); 
            public
                BaseSurface(
            const BaseSurface& copy); 
                
            virtual ~BaseSurface(); 
                BaseSurface
            & operator=(const BaseSurface& copy); 
                
            //surface's point 
                SDL_Surface* point() const
                
            //blit surface to screen 
                void blit() const
                
            void blit(int any_num) 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
                
            //blit surface to another surface 
                void blit(const BaseSurface& dst_surface) const
                
            void blit(const BaseSurface& dst_surface, int any_num) const
                
            void blit(const BaseSurface& dst_surface, 
                                    
            int at_x, int at_y) const
                
            void blit(const BaseSurface& dst_surface, 
                                    
            int at_x, int at_y, 
                                    
            int from_x, int from_y, int w, int h, 
                                    
            int delta_x = 0int delta_y = 0const
                
            //color keying 
                void colorKey(Uint8 r = 0, Uint8 g = 0xFF, Uint8 b = 0xFF, Uint32 flag = SDL_SRCCOLORKEY); 
            }; 
             
            class PictureSurface: public BaseSurface 

            private
                std::
            string fileName; 
            public
                PictureSurface(
            const std::string& file_name, const ScreenSurface& screen); 
            }; 
             
            class TextSurface: public BaseSurface 

            private
                
            static int textNum; 
                std::
            string message; 
                std::
            string TTF_fileName; 
                
            int TTF_size; 
                Uint8 r, g, b; 
            public
                TextSurface(
            const std::string& _message, const ScreenSurface& screen, 
                    Uint8 _r 
            = 0xFF, Uint8 _g = 0xFF, Uint8 _b = 0xFF,  
                    
            int ttf_size = 28const std::string& ttf_fileName = "./fonts/gkai00mp.ttf"); 
                TextSurface(
            const TextSurface& copy); 
                
            ~TextSurface(); 
                
            //text tools 
                void toBlended(); 
                
            void toSolid(); 
                
            void toShaded(Uint8 _r, Uint8 _g, Uint8 _b); 
                
            void setColor(Uint8 _r, Uint8 _g, Uint8 _b); 
                
            void setSize(int ttf_size); 
                
            void setFont(const std::string& ttf_fileName); 
            }; 
             
            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 
            //Laboratory of ZaiBieLiunNian 
            //http://www.shnenglu.com/lf426/

            //FileName: SurfaceClass.cpp
            //For Linux and other UTF-8 OS 
             
            #include 
            "SurfaceClass.hpp" 
             
            //***************************************** 
            //class ScreenSurface 
             
            int ScreenSurface::screenNum = 0
             
            ScreenSurface::ScreenSurface(): 
            width(
            640), height(480), bpp(32), flags(0), windowName("NULL"

                
            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, const std::string& 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 != "NULL" ) {
                    windowName 
            = window_name;
                    SDL_WM_SetCaption(windowName.c_str(), 
            0);
                } 
                
            else 
                    windowName 
            = "NULL";

             
            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()); 

             
            //************************************
             
             
             
            //************************************
            //class BaseSurface 
             
            //protected
            BaseSurface::BaseSurface(): 
            pScreen(
            0), pSurface(0
            {} 
             
            //public
            BaseSurface::BaseSurface(const BaseSurface& copy):
            pScreen(copy.pScreen) 

                pSurface 
            = SDL_ConvertSurface(copy.pSurface, copy.pSurface->format, SDL_SWSURFACE);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo(SDL_GetError()); 

             
            BaseSurface::
            ~BaseSurface()

                SDL_FreeSurface(pSurface);

             
            BaseSurface
            & BaseSurface::operator=(const BaseSurface& copy)

                SDL_FreeSurface(pSurface);
                pSurface 
            = SDL_ConvertSurface(copy.pSurface, copy.pSurface->format, SDL_SWSURFACE);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo(SDL_GetError());
                
            return *this

             
            //***
             
            SDL_Surface
            * BaseSurface::point() const

                
            return pSurface;

             
            //***
             
            void BaseSurface::blit() const

                
            const int SRC_W = pSurface->w;
                
            const int SRC_H = pSurface->h; 
                
            const int DST_W = pScreen->w; 
                
            const int DST_H = pScreen->h; 
             
                SDL_Rect offset;
                offset.x 
            = ( DST_W - SRC_W ) / 2;
                offset.y 
            = ( DST_H - SRC_H ) / 2;
                
            if ( SDL_BlitSurface(pSurface, 0, pScreen, &offset) < 0 )
                    
            throw ErrorInfo(SDL_GetError()); 

             
            void BaseSurface::blit(int any_num) const
            {
                
            if ( SDL_BlitSurface(pSurface, 0, pScreen, 0< 0 )
                    
            throw ErrorInfo(SDL_GetError()); 

             
            void BaseSurface::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 BaseSurface::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 BaseSurface::blit(const BaseSurface& dst_surface) const

                
            const int SRC_W = pSurface->w;
                
            const int SRC_H = pSurface->h; 
                
            const int DST_W = dst_surface.point()->w;
                
            const int DST_H = dst_surface.point()->h; 
             
                SDL_Rect offset;
                offset.x 
            = ( DST_W - SRC_W ) / 2;
                offset.y 
            = ( DST_H - SRC_H ) / 2;
             
                
            if ( &dst_surface == this )
                    
            throw ErrorInfo("Cannot blit surface to itself!");
             
                
            if ( SDL_BlitSurface(pSurface, 0, dst_surface.point(), &offset) < 0 )
                    
            throw ErrorInfo(SDL_GetError()); 

             
            void BaseSurface::blit(const BaseSurface& dst_surface, int any_num) const

                
            if ( &dst_surface == this )
                    
            throw ErrorInfo("Cannot blit surface to itself!");
             
                
            if ( SDL_BlitSurface(pSurface, 0, dst_surface.point(), 0< 0 )
                    
            throw ErrorInfo(SDL_GetError()); 

             
            void BaseSurface::blit(const BaseSurface& 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 ErrorInfo("Cannot blit surface to itself!");
             
                
            if ( SDL_BlitSurface(pSurface, 0, dst_surface.point(), &offset) < 0 )
                    
            throw ErrorInfo(SDL_GetError()); 

             
            void BaseSurface::blit(const BaseSurface& 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 ErrorInfo("Cannot blit surface to itself!");
             
                
            if ( SDL_BlitSurface(pSurface, &dest, dst_surface.point(), &offset) < 0 )
                    
            throw ErrorInfo(SDL_GetError()); 

             
            //*** 
             
            void BaseSurface::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()); 

             
            //************************************
             
             
            //************************************
            //class PictureSurface 
             
            PictureSurface::PictureSurface(
            const std::string& file_name, const ScreenSurface& screen):
            BaseSurface(), 
            fileName(file_name)
            {
                SDL_Surface
            * pSurfaceTemp = IMG_Load(fileName.c_str());
                
            if ( pSurfaceTemp == 0 )
                    
            throw ErrorInfo(IMG_GetError());
                pSurface 
            = SDL_DisplayFormat(pSurfaceTemp);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo(SDL_GetError());
                SDL_FreeSurface(pSurfaceTemp);

                pScreen 
            = screen.point();
            }

            //************************************



            //************************************
            //class TextSurface

            int TextSurface::textNum = 0;

            TextSurface::TextSurface(
            const std::string& _message, const ScreenSurface& screen,
                    Uint8 _r, Uint8 _g, Uint8 _b, 
                    
            int ttf_size, const std::string& ttf_fileName):
            BaseSurface(),
            message(_message), TTF_fileName(ttf_fileName), TTF_size(ttf_size), 
            r(_r), g(_g), b(_b)
            {
                
            if ( textNum == 0 ){
                    
            if ( TTF_Init() < 0 ){
                        
            throw ErrorInfo(TTF_GetError());
                    }
                }

                SDL_Color textColor;
                textColor.r 
            = r;
                textColor.g 
            = g;
                textColor.b 
            = b;

                TTF_Font
            * pFont = TTF_OpenFont(TTF_fileName.c_str(), TTF_size);
                
            if ( pFont == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                pSurface 
            = TTF_RenderUTF8_Blended(pFont, message.c_str(), textColor);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                TTF_CloseFont(pFont);

                pScreen 
            = screen.point();

                textNum
            ++;
            }


            TextSurface::TextSurface(
            const TextSurface& copy):
            BaseSurface(copy),
            message(copy.message), TTF_fileName(copy.TTF_fileName), TTF_size(copy.TTF_size), 
            r(copy.r), g(copy.g), b(copy.b)
            {
                textNum
            ++;
            }


            TextSurface::
            ~TextSurface()
            {
                textNum
            --;
                
            if ( textNum == 0 ){
                    TTF_Quit();
                }
            }

            //***

            void TextSurface::toBlended()
            {
                SDL_FreeSurface(pSurface);

                SDL_Color textColor;
                textColor.r 
            = r;
                textColor.g 
            = g;
                textColor.b 
            = b;

                TTF_Font
            * pFont = TTF_OpenFont(TTF_fileName.c_str(), TTF_size);
                
            if ( pFont == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                pSurface 
            = TTF_RenderUTF8_Blended(pFont, message.c_str(), textColor);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                TTF_CloseFont(pFont);
            }

            void TextSurface::toSolid()
            {
                SDL_FreeSurface(pSurface);

                SDL_Color textColor;
                textColor.r 
            = r;
                textColor.g 
            = g;
                textColor.b 
            = b;

                TTF_Font
            * pFont = TTF_OpenFont(TTF_fileName.c_str(), TTF_size);
                
            if ( pFont == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                pSurface 
            = TTF_RenderUTF8_Solid(pFont, message.c_str(), textColor);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                TTF_CloseFont(pFont);
            }

            void TextSurface::toShaded(Uint8 _r, Uint8 _g, Uint8 _b)
            {
                SDL_Color textColor;
                textColor.r 
            = r;
                textColor.g 
            = g;
                textColor.b 
            = b;
                
                SDL_Color bgColor;
                bgColor.r 
            = _r;
                bgColor.g 
            = _g;
                bgColor.b 
            = _b;

                SDL_FreeSurface(pSurface);

                TTF_Font
            * pFont = TTF_OpenFont(TTF_fileName.c_str(), TTF_size);
                
            if ( pFont == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                pSurface 
            = TTF_RenderUTF8_Shaded(pFont, message.c_str(), textColor, bgColor);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                TTF_CloseFont(pFont);
            }

            void TextSurface::setColor(Uint8 _r, Uint8 _g, Uint8 _b)
            {
                SDL_FreeSurface(pSurface);

                SDL_Color textColor;
                textColor.r 
            = r = _r;
                textColor.g 
            = g = _g;
                textColor.b 
            = b = _b;

                TTF_Font
            * pFont = TTF_OpenFont(TTF_fileName.c_str(), TTF_size);
                
            if ( pFont == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                pSurface 
            = TTF_RenderUTF8_Blended(pFont, message.c_str(), textColor);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                TTF_CloseFont(pFont);
            }

            void TextSurface::setSize(int ttf_size)
            {
                SDL_FreeSurface(pSurface);

                SDL_Color textColor;
                textColor.r 
            = r;
                textColor.g 
            = g;
                textColor.b 
            = b;
                
                TTF_size 
            = ttf_size;
                TTF_Font
            * pFont = TTF_OpenFont(TTF_fileName.c_str(), TTF_size);
                
            if ( pFont == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                pSurface 
            = TTF_RenderUTF8_Blended(pFont, message.c_str(), textColor);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                TTF_CloseFont(pFont);
            }

            void TextSurface::setFont(const std::string& ttf_fileName)
            {
                SDL_FreeSurface(pSurface);

                SDL_Color textColor;
                textColor.r 
            = r;
                textColor.g 
            = g;
                textColor.b 
            = b;
                
                TTF_fileName 
            = ttf_fileName;
                TTF_Font
            * pFont = TTF_OpenFont(TTF_fileName.c_str(), TTF_size);
                
            if ( pFont == 0 )
                    
            throw ErrorInfo(TTF_GetError());

                pSurface 
            = TTF_RenderUTF8_Blended(pFont, message.c_str(), textColor);
                
            if ( pSurface == 0 )
                    
            throw ErrorInfo(TTF_GetError());
                TTF_CloseFont(pFont);
            }
            //*************************************

            lib: iconv.lib
                 SDL_ttf.lib
                 SDL.lib, SDLmain.lib
                 SDL_image.lib

            dll: iconv.dll
                 SDL_ttf.dll, libfreetype-6.dll, zlib1.dll
                 SDL.dll
                 jpeg.dll, libpng12-0.dll, libtiff-3.dll, SDL_image.dll, zlib1.dll

            gkai00mp.ttf為Debian楷體,文泉驛字庫(kù)。

            last update: 2008-05-12

            posted on 2008-04-14 14:03 lf426 閱讀(2341) 評(píng)論(2)  編輯 收藏 引用 所屬分類: mySDL_GameEngine

            FeedBack:
            # re: SurfaceClass 2012-06-08 14:00 周爽
            實(shí)現(xiàn)文件可以看一下么?  回復(fù)  更多評(píng)論
              
            # re: SurfaceClass 2012-06-08 14:01 周爽
            我對(duì)編程跟SDL都是新手,希望指教下  回復(fù)  更多評(píng)論
              
            18禁黄久久久AAA片| 99久久精品国产一区二区| 91亚洲国产成人久久精品网址| 久久久久久国产精品无码超碰| 久久久久AV综合网成人 | 丰满少妇人妻久久久久久| 久久久久亚洲AV无码网站| 99久久免费国产精品热| 伊人色综合久久| 亚洲欧美成人久久综合中文网| 久久只有这精品99| 色综合久久久久综合体桃花网| 久久久无码精品亚洲日韩按摩 | 国产精品久久久久影院嫩草| 亚洲综合婷婷久久| 欧美亚洲日本久久精品| 亚洲AV无码成人网站久久精品大| 久久国产精品成人片免费| 亚洲国产精品久久久久网站 | 看久久久久久a级毛片| 久久国产乱子精品免费女| 久久亚洲高清综合| 无码国内精品久久人妻蜜桃| 好久久免费视频高清| 性做久久久久久免费观看| 亚洲国产另类久久久精品小说| 久久精品国产影库免费看| 久久亚洲国产精品123区| 久久久女人与动物群交毛片| 91久久精品视频| 亚洲午夜久久久影院| 国产高潮国产高潮久久久91| 狠狠综合久久AV一区二区三区| 国产一久久香蕉国产线看观看 | 国产ww久久久久久久久久| 精品久久久无码人妻中文字幕 | 亚洲国产日韩欧美综合久久| 精品久久8x国产免费观看| 欧美亚洲日本久久精品| 国产精品久久久久久| 久久久久亚洲AV成人网人人网站|