注意:ttf字库文件,可以在
C:/WINDOWS/Fonts
下寻找,比如例子中用到的times.ttf;
lazy.ttf请到Lazy Foo的相关教程 True Type Fonts后面的示例中获得。
C:/WINDOWS/Fonts
下寻找,比如例子中用到的times.ttf;
lazy.ttf请到Lazy Foo的相关教程 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 = 0 , int b = 0 , Uint32 f = 0 );
~ ScreenSurface();
SDL_Surface * point() const ;
void flip() const ;
void fillColor(Uint8 r = 0 , Uint8 g = 0 , Uint8 b = 0 ) const ;
};
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 = 0 , int delta_y = 0 ) const ;
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
// 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 = 0 , int b = 0 , Uint32 f = 0 );
~ ScreenSurface();
SDL_Surface * point() const ;
void flip() const ;
void fillColor(Uint8 r = 0 , Uint8 g = 0 , Uint8 b = 0 ) const ;
};
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 = 0 , int delta_y = 0 ) const ;
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
// 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( 0xFF , 0xFF , 0xFF );
// Load a textSurface
TextSurface myText( " logo " , " UVi Soft " , screen, 0 , 0 , 0xFF , " times.ttf " , 80 );
TextSurface lazy( " lazy " , " by lf426 (zbln426@163.com) " , screen, 0xff , 0 , 0 );
// Display text
myText.blit( 170 , 180 );
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 ;
}
// 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( 0xFF , 0xFF , 0xFF );
// Load a textSurface
TextSurface myText( " logo " , " UVi Soft " , screen, 0 , 0 , 0xFF , " times.ttf " , 80 );
TextSurface lazy( " lazy " , " by lf426 (zbln426@163.com) " , screen, 0xff , 0 , 0 );
// Display text
myText.blit( 170 , 180 );
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 ;
}