SDL游戏开发教程07(图像的旋转和缩放)

效果图    

 

     默认的SDL库中没有提供surface的旋转和缩放函数,要实现这些功能,有两种方法,一种是自己写,另一种是找一个支持旋转和缩放的SDL扩展库。很明显,第一种方法不适合我,只能去找一个SDL扩展库。

 

    通过在SDL网站上搜索,找到了两个库:SpriG和SDL_gfx。

 

    其中SpriG我试用了他的旋转函数,结果发现旋转后不是少了些东西,就是多点东西,始终不能达到要求,想修改他的源代码,发现代码有些乱,于是放弃了SpriG库。这个过程中也有可能是我的理解或者使用出了问题,在这里将这个库列举出来,是给大家提供一个参考,有能力的话你可以利用他的思想,改进他的代码,使他满足你的要求。

 

    SDL_gfx的网站http://www.ferzkopp.net/joomla/content/view/19/14/ ,上面只有源代码,没有编译好的开发库。我试着用网上搜到的办法在mingw+eclipse中编译,但始终不成功,后来通过将源代码加入自己工程的办法实现了surface的旋转和缩放。下面就这个方法进行介绍:

 

    1、下载源代码,这里下载的是SDL_gfx-2.0.17.tar.gz。

    2、解压,将SDL_rotozoom.h和SDL_rotozoom.c拷贝到当前C++工程的src目录下。这里是拷贝到src\SDL\GFX.

    3、将SDL_rotozoom.h中链接动态库的如下宏代码

C代码   收藏代码
  1. #ifdef WIN32  
  2. #ifdef BUILD_DLL  
  3. #define DLLINTERFACE __declspec(dllexport)  
  4. #else  
  5. #define DLLINTERFACE __declspec(dllimport)  
  6. #endif  
  7. #else  
  8. #define DLLINTERFACE  
  9. #endif  

     替换成

C代码   收藏代码
  1. #ifndef DLLINTERFACE  
  2.     #define DLLINTERFACE  
  3. #endif  

    这样之后就可以用里面的函数了。

 

在本教程中,我们对他提供的函数进行了封装,类名为SDLTransform,代码如下

Cpp代码   收藏代码
  1. #ifndef SDLTRANSFORM_H_  
  2. #define SDLTRANSFORM_H_  
  3. #include "SDLSurface.h"  
  4. class SDLTransform  
  5. {  
  6.     friend class SDL;  
  7. private:  
  8.     SDLTransform();  
  9. public:  
  10.     virtual ~SDLTransform();  
  11. public:  
  12.     /** 
  13.      * 旋转图片 
  14.      * src                  源图片 
  15.      * numClockwiseTurns    numClockwiseTurns*90即为旋转的度素 
  16.      * return               旋转后得到的新图片 
  17.      */  
  18.     SDLSurfacePtr   Rotate90Degrees(SDLSurfacePtr src, int numClockwiseTurns);  
  19.   
  20.     /* 
  21.      * 缩放图片 
  22.      * src                  源图片 
  23.      * zoomx                X轴缩放倍数 
  24.      * zoomy                Y轴缩放倍数 
  25.      * smooth               暂时不知道啥意思 
  26.      * return               缩放后的图片 
  27.      */  
  28.     SDLSurfacePtr   Zoom( SDLSurfacePtr src, double zoomx, double zoomy, bool smooth = 0);  
  29. };  
  30.   
  31. #endif /* SDLTRANSFORM_H_ */  
 
Cpp代码   收藏代码
  1. #include "SDLTransform.h"  
  2. #include "SDLException.h"  
  3. #include "SDLCore.h"  
  4. #include "GFX/SDL_rotozoom.h"  
  5. SDLTransform::SDLTransform()  
  6. {  
  7.     // TODO Auto-generated constructor stub  
  8.   
  9. }  
  10.   
  11. SDLTransform::~SDLTransform()  
  12. {  
  13.     // TODO Auto-generated destructor stub  
  14. }  
  15.   
  16. SDLSurfacePtr SDLTransform::Rotate90Degrees(SDLSurfacePtr src,  
  17.         int numClockwiseTurns)  
  18. {  
  19.         SDL_Surface * surface = rotateSurface90Degrees(src->value(), numClockwiseTurns);  
  20.         if(surface ==NULL)  
  21.         {  
  22.             throw SDLException(std::string("旋转图片失败:") + SDL_GetError());  
  23.         }  
  24.         return SDLSurfacePtr(new SDLSurface(surface));  
  25. }  
  26.   
  27. SDLSurfacePtr   SDLTransform::Zoom( SDLSurfacePtr src, double zoomx, double zoomy, bool smooth)  
  28. {  
  29.     SDL_Surface * surface = zoomSurface(src->value(), zoomx, zoomy, smooth);  
  30.     if(surface ==NULL)  
  31.     {  
  32.         throw SDLException(std::string("SPG_Scale缩放图片失败:") + SDL_GetError());  
  33.     }  
  34.     return SDLSurfacePtr(new SDLSurface(surface));  
  35. }  

    这里只封装了两个要用到的函数,别的函数等用到了再封装进来。SDLTransform同前面的其他的封装类一样,只能由SDL类获取对象。下面是调用的示例代码:

Cpp代码   收藏代码
  1. #include "Lesson03.h"  
  2. Lesson03::Lesson03()  
  3. {  
  4.     // TODO Auto-generated constructor stub  
  5.   
  6. }  
  7.   
  8. Lesson03::~Lesson03()  
  9. {  
  10.     // TODO Auto-generated destructor stub  
  11. }  
  12.   
  13. void Lesson03::onRender()  
  14. {  
  15.     //设置背景为白色  
  16.     SDL_Rect rect;  
  17.     rect.x = 0;  
  18.     rect.y = 0;  
  19.     rect.w = screen->value()->w;  
  20.     rect.h = screen->value()->h;  
  21.     Uint32 color = SDL::video()->MapRGB(screen->value()->format, 255, 255, 255);  
  22.     SDL::video()->FillRect(screen, &rect, color);  
  23.   
  24.     //在屏幕中央绘制正常的文字  
  25.     rect.x = screen->value()->w/2 - message->value()->w/2;  
  26.     rect.y = screen->value()->h/2 - message->value()->h/2;  
  27.     SDL::video()->BlitSurface(message, NULL, screen, &rect);  
  28.   
  29.     //在(50,50)的地方绘制旋转90度的文字  
  30.     rect.x = 50;  
  31.     rect.y = 50;  
  32.     SDL::video()->BlitSurface(message1, NULL, screen, &rect);  
  33.   
  34.     //在(100,100)的地方绘制Y轴方向缩小一半的文字  
  35.     rect.x = 100;  
  36.     rect.y = 100;  
  37.     SDL::video()->BlitSurface(message2, NULL, screen, &rect);  
  38. }  
  39. void Lesson03::onInit()  
  40. {  
  41.     //获取字体  
  42.     SDLFontPtr font = SDL::fontManager()->OpenFont("E:\\code_picture\\wqy-zenhei.ttc", 20);  
  43.     font->SetFontStyle(TTF_STYLE_UNDERLINE | TTF_STYLE_ITALIC);  
  44.   
  45.     //渲染文字  
  46.     message = font->RenderUNICODEBlended("大家好(Hello, Everybody)", SDL::assistant()->makeColor(255, 0, 0));  
  47.       
  48.     //旋转90度  
  49.     message1 = SDL::transform()->Rotate90Degrees(message, 1);  
  50.       
  51.     //X轴大小不变,Y轴缩小一半  
  52.     message2 = SDL::transform()->Zoom(message, 1, 0.5);  
  53. }  
 

    SDL_gfx还包含了许多其他图形相关的功能,这里不再一一解释(想解释也解释不了,我也是新手),等用到的时候再说。如果有人有兴趣并且有时间,希望能对这个库进行更进一步的研究,然后写几篇文章出来,这样可以让我们深入理解surface的相关转换和处理原理,我也可以不用那么辛苦找资料了 。

    附件中是用到的GFX库源代码,整个工程的完整代码见后面的教程。

  • GFX.rar (6.5 KB)
  • 下载次数: 59
  • 查看图片附件

你可能感兴趣的:(SDL游戏开发教程07(图像的旋转和缩放))