效果图
默认的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中链接动态库的如下宏代码
#ifdef WIN32
#ifdef BUILD_DLL
#define DLLINTERFACE __declspec(dllexport)
#else
#define DLLINTERFACE __declspec(dllimport)
#endif
#else
#define DLLINTERFACE
#endif
替换成
#ifndef DLLINTERFACE
#define DLLINTERFACE
#endif
这样之后就可以用里面的函数了。
在本教程中,我们对他提供的函数进行了封装,类名为SDLTransform,代码如下
#ifndef SDLTRANSFORM_H_
#define SDLTRANSFORM_H_
#include "SDLSurface.h"
class SDLTransform
{
friend class SDL;
private:
SDLTransform();
public:
virtual ~SDLTransform();
public:
/**
* 旋转图片
* src 源图片
* numClockwiseTurns numClockwiseTurns*90即为旋转的度素
* return 旋转后得到的新图片
*/
SDLSurfacePtr Rotate90Degrees(SDLSurfacePtr src, int numClockwiseTurns);
/*
* 缩放图片
* src 源图片
* zoomx X轴缩放倍数
* zoomy Y轴缩放倍数
* smooth 暂时不知道啥意思
* return 缩放后的图片
*/
SDLSurfacePtr Zoom( SDLSurfacePtr src, double zoomx, double zoomy, bool smooth = 0);
};
#endif /* SDLTRANSFORM_H_ */
#include "SDLTransform.h"
#include "SDLException.h"
#include "SDLCore.h"
#include "GFX/SDL_rotozoom.h"
SDLTransform::SDLTransform()
{
// TODO Auto-generated constructor stub
}
SDLTransform::~SDLTransform()
{
// TODO Auto-generated destructor stub
}
SDLSurfacePtr SDLTransform::Rotate90Degrees(SDLSurfacePtr src,
int numClockwiseTurns)
{
SDL_Surface * surface = rotateSurface90Degrees(src->value(), numClockwiseTurns);
if(surface ==NULL)
{
throw SDLException(std::string("旋转图片失败:") + SDL_GetError());
}
return SDLSurfacePtr(new SDLSurface(surface));
}
SDLSurfacePtr SDLTransform::Zoom( SDLSurfacePtr src, double zoomx, double zoomy, bool smooth)
{
SDL_Surface * surface = zoomSurface(src->value(), zoomx, zoomy, smooth);
if(surface ==NULL)
{
throw SDLException(std::string("SPG_Scale缩放图片失败:") + SDL_GetError());
}
return SDLSurfacePtr(new SDLSurface(surface));
}
这里只封装了两个要用到的函数,别的函数等用到了再封装进来。SDLTransform同前面的其他的封装类一样,只能由SDL类获取对象。下面是调用的示例代码:
#include "Lesson03.h"
Lesson03::Lesson03()
{
// TODO Auto-generated constructor stub
}
Lesson03::~Lesson03()
{
// TODO Auto-generated destructor stub
}
void Lesson03::onRender()
{
//设置背景为白色
SDL_Rect rect;
rect.x = 0;
rect.y = 0;
rect.w = screen->value()->w;
rect.h = screen->value()->h;
Uint32 color = SDL::video()->MapRGB(screen->value()->format, 255, 255, 255);
SDL::video()->FillRect(screen, &rect, color);
//在屏幕中央绘制正常的文字
rect.x = screen->value()->w/2 - message->value()->w/2;
rect.y = screen->value()->h/2 - message->value()->h/2;
SDL::video()->BlitSurface(message, NULL, screen, &rect);
//在(50,50)的地方绘制旋转90度的文字
rect.x = 50;
rect.y = 50;
SDL::video()->BlitSurface(message1, NULL, screen, &rect);
//在(100,100)的地方绘制Y轴方向缩小一半的文字
rect.x = 100;
rect.y = 100;
SDL::video()->BlitSurface(message2, NULL, screen, &rect);
}
void Lesson03::onInit()
{
//获取字体
SDLFontPtr font = SDL::fontManager()->OpenFont("E:\\code_picture\\wqy-zenhei.ttc", 20);
font->SetFontStyle(TTF_STYLE_UNDERLINE | TTF_STYLE_ITALIC);
//渲染文字
message = font->RenderUNICODEBlended("大家好(Hello, Everybody)", SDL::assistant()->makeColor(255, 0, 0));
//旋转90度
message1 = SDL::transform()->Rotate90Degrees(message, 1);
//X轴大小不变,Y轴缩小一半
message2 = SDL::transform()->Zoom(message, 1, 0.5);
}
SDL_gfx还包含了许多其他图形相关的功能,这里不再一一解释(想解释也解释不了,我也是新手),等用到的时候再说。如果有人有兴趣并且有时间,希望能对这个库进行更进一步的研究,然后写几篇文章出来,这样可以让我们深入理解surface的相关转换和处理原理,我也可以不用那么辛苦找资料了
。
附件中是用到的GFX库源代码,整个工程的完整代码见后面的教程。
- 大小: 25.1 KB
分享到:
相关推荐
SDL方面的经典教程,并提供有例子以供练习。
SDL_gfx 函数是支持旋转和缩放的SDL扩展库,本文件是SDL_GF函数的源代码
SDL游戏开发经典教程03源代码,来自http://lazyfoo.net/tutorials/SDL/index.php
NULL 博文链接:https://public0821.iteye.com/blog/296051
SDL游戏开发经典教程01源代码,来自:http://lazyfoo.net/tutorials/SDL/index.php
NULL 博文链接:https://public0821.iteye.com/blog/399347
NULL 博文链接:https://public0821.iteye.com/blog/306432
NULL 博文链接:https://public0821.iteye.com/blog/292056
lazyfoo SDL游戏入门教程 紫冀魔王 翻译版 lazyfoo的libsdl教程是比较好的入门教程,而此中文版翻译可以让学习者更容易学习
NULL 博文链接:https://public0821.iteye.com/blog/309076
因为Linux的普及以及不受$M的牵制,SDL在过去的几年中,成为了跨平台开发PC游戏的首选。即使是在Windows平台下,SDL有具有自身的优势。与MFC使用不成熟的C++外表伪封装的win32api以及一家独唱推崇的COM风格和.net相...
NULL 博文链接:https://public0821.iteye.com/blog/294105
该资料是从网上搜集的SDL详细资料的总结,适于SDL的游戏开发、linux下的视频播放器开发、嵌入式产品GUI界面的开发!该资料是从网上搜集的SDL详细资料的总结,适于SDL的游戏开发、linux下的视频播放器开发、嵌入式...
教程内容:PDF文档 1.输出图片 2,块传输 3,事件控制 4,设置色键 5,裁剪精灵 6,定位崩溃 7,显示字体 8,按键操作 9,鼠标操作 10,按键状态 11,播放声音 12,动画制作 13,定时器 14,定时器高级应用 15,调整...
SDL1.2中文教程。网页版。解压后使用浏览器打开index.html即可
SDL系列教程 我要向大家介绍一个非常出名的游戏开发库――SDL。
sdl(Simple DirectMedia Layer)简易直控媒体层,详细介绍了SDL游戏开发。
本书面向的对象为SDL2初学者。 或正在使用C4droid练习c/c++语音的中学生高中生等。 本书介绍了SDL2上基础的几个部分,学完本书相信大家基本学会了SDL2的使用方法。对于本书的源码全部在 Android平台C4droid用g++...