青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 96  文章 - 255  trackbacks - 0
<2008年2月>
272829303112
3456789
10111213141516
17181920212223
2425262728291
2345678

E-mail:zbln426@163.com QQ:85132383 長期尋找對戰略游戲感興趣的合作伙伴。

常用鏈接

留言簿(21)

隨筆分類

隨筆檔案

SDL相關網站

我的個人網頁

我的小游戲

資源下載

搜索

  •  

積分與排名

  • 積分 - 496258
  • 排名 - 39

最新評論

閱讀排行榜

評論排行榜

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楷體,文泉驛字庫。

last update: 2008-05-12

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

FeedBack:
# re: SurfaceClass 2012-06-08 14:00 周爽
實現文件可以看一下么?  回復  更多評論
  
# re: SurfaceClass 2012-06-08 14:01 周爽
我對編程跟SDL都是新手,希望指教下  回復  更多評論
  

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              欧美sm视频| 久久婷婷激情| 国产亚洲精品自拍| 欧美激情精品久久久久| 国产精品海角社区在线观看| 裸体素人女欧美日韩| 欧美另类变人与禽xxxxx| 久久免费视频在线| 欧美日韩精品在线播放| 欧美福利电影网| 国产专区精品视频| 亚洲影视在线| 夜夜嗨av一区二区三区网页| 久久成人国产精品| 欧美一区二区三区免费大片| 欧美伦理a级免费电影| 在线亚洲欧美视频| 亚洲视屏一区| 欧美国产精品劲爆| 欧美大片在线观看一区| 国产精品99久久久久久久女警| 国产精品色婷婷| 亚洲乱码国产乱码精品精可以看| 一区二区三区中文在线观看| 亚洲欧美欧美一区二区三区| 亚洲欧美三级伦理| 欧美性久久久| 亚洲午夜久久久| 亚洲免费在线视频| 国产精品夜夜夜| 欧美成人精品在线| 亚洲国产经典视频| 久久久久国产一区二区| 久久一二三国产| 在线观看亚洲精品| 免费成人在线视频网站| 亚洲国产高清aⅴ视频| 欧美一级午夜免费电影| 国产一区二区三区在线观看免费| 欧美高清视频在线| 久久人人看视频| 亚洲欧美大片| 99视频精品全部免费在线| 99re66热这里只有精品4| 欧美日韩一区精品| 亚洲欧美日韩国产综合精品二区| 欧美一区二区在线免费观看| 日韩视频中午一区| 亚洲高清免费在线| 欧美黄网免费在线观看| 久久久久久久久久久一区| 亚洲欧美日韩在线播放| 在线一区二区三区四区五区| 亚洲激情网站| 亚洲男同1069视频| 国产精品99久久不卡二区| 亚洲精品一区二区网址| 久久久综合香蕉尹人综合网| 午夜精品久久99蜜桃的功能介绍| 一区二区三区日韩欧美精品| 久久精品一区四区| 91久久久久久国产精品| 国产精品videosex极品| 欧美日韩一区国产| 欧美日韩午夜视频在线观看| 欧美日本网站| 欧美日韩久久精品| 欧美视频中文在线看| 久久色在线观看| 久久免费精品视频| 欧美午夜久久久| 亚洲精品你懂的| 国模精品一区二区三区色天香| 欧美天天影院| 欧美午夜精品久久久久免费视 | 亚洲国产精品精华液2区45| 99热精品在线观看| 日韩一级片网址| 亚洲午夜精品一区二区| 黄色精品一二区| 欧美性大战久久久久久久蜜臀| 欧美日韩亚洲不卡| 国产精品久久午夜| 欧美高清视频免费观看| 欧美啪啪一区| 国产精品久久久久99| 国产亚洲欧美激情| 在线欧美影院| 国产一区二区三区四区hd| 狠狠色狠色综合曰曰| 亚洲人成网站在线播| 亚洲视频欧美视频| 久久成人亚洲| 亚洲午夜免费福利视频| 欧美一二三视频| 欧美**人妖| 日韩亚洲不卡在线| 亚洲人成网站777色婷婷| 日韩视频久久| 久久se精品一区二区| 午夜精品久久久久久久久久久久久| 欧美一区三区二区在线观看| 亚洲一区二区免费看| 久久国产88| 欧美精品在线播放| 国产欧美精品日韩区二区麻豆天美| 欧美午夜一区二区三区免费大片| 国产日韩精品综合网站| 国产精品欧美风情| 在线看视频不卡| 亚洲影视中文字幕| 亚洲一区三区电影在线观看| 久久久久九九九| 亚洲精品久久久久| 久久精品99| 欧美三级乱人伦电影| 在线日韩av| 欧美一区二区网站| 亚洲日韩欧美视频一区| 久久国产精品毛片| 国产精品久久久久久久免费软件| 在线观看欧美成人| 欧美一级专区免费大片| 亚洲激情在线观看| 久久久久久亚洲精品不卡4k岛国| 欧美日韩一区二区在线观看| 在线观看日韩av| 欧美在线二区| 一区二区高清在线| 欧美刺激午夜性久久久久久久| 国产亚洲精品久久久久久| 中日韩美女免费视频网址在线观看 | 久久久久一区| 国产精品视频免费观看www| 亚洲美女视频在线免费观看| 久久―日本道色综合久久| 一区二区三区四区五区在线| 欧美国产一区二区| 亚洲国产cao| 久久精品人人| 欧美大片91| 久久精品免费看| 欧美韩日精品| 亚洲黄色免费网站| 亚洲视频一二三| 亚洲国产美女久久久久| 久久一区免费| 精品动漫一区| 奶水喷射视频一区| 久久久久久九九九九| 国内外成人免费激情在线视频| 亚洲欧美精品suv| 在线亚洲欧美视频| 国产精品高潮在线| 亚洲欧美激情一区二区| 中文在线不卡| 国产精品腿扒开做爽爽爽挤奶网站| 在线亚洲一区二区| 两个人的视频www国产精品| 午夜一区二区三区不卡视频| 欧美 日韩 国产一区二区在线视频| 欧美日韩精品在线| 国产精品99久久久久久久vr| 亚洲麻豆av| 国产精品国产三级国产专播品爱网 | 国产精品捆绑调教| 小黄鸭视频精品导航| 亚洲在线一区| 国产亚洲激情| 美日韩精品免费| 亚洲午夜精品一区二区| 国产精品乱码| 久久爱www| 久久精品国产免费| 亚洲第一网站免费视频| 亚洲高清电影| 欧美日韩免费观看中文| 亚洲综合日韩在线| 性娇小13――14欧美| 在线日韩av片| 亚洲精品自在在线观看| 国产精品毛片| 麻豆九一精品爱看视频在线观看免费 | 亚洲精品欧美日韩专区| 亚洲人屁股眼子交8| 国产精品福利av| 久久久精品一区| 女人色偷偷aa久久天堂| 亚洲视频一二三| 久久国产精品99国产| 亚洲精品乱码久久久久久黑人| 一区二区精品| 黄色精品在线看| 亚洲裸体视频| 国内精品久久久久影院 日本资源| 欧美大胆人体视频| 国产精品欧美一区喷水| 蜜臀va亚洲va欧美va天堂 | 国产精品久久国产三级国电话系列| 欧美在线视频网站|