`
public0821
  • 浏览: 238039 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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中链接动态库的如下宏代码

#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
  • GFX.rar (6.5 KB)
  • 下载次数: 73
分享到:
评论
1 楼 qq452492805 2012-10-09  

相关推荐

    SDL.rar_SDL知名游戏_sdl教程_sdl游戏

    开发者可以通过SDL的图像库来处理图片的旋转、缩放和颜色转换等操作。 **事件处理**是游戏与用户交互的关键。SDL提供了一个事件队列,可以捕获键盘、鼠标、触摸屏和其他输入设备的事件。通过对这些事件的响应,...

    此图书对大家更加深刻的讲解SDL使用游戏制作

    2. **图像加载与处理**:SDL能够加载多种图像格式,如PNG、JPEG、BMP等,并进行缩放、旋转、裁剪等图像操作。 3. **音频处理**:SDL可以播放和混合音频流,支持多种音频格式,如WAV、MIDI等。这使得游戏能够包含...

    SDL.zip_sdl_sdl教程

    标题:“SDL.zip_sdl_sdl教程”揭示了一个关于SDL(Simple DirectMedia Layer)的全面学习资源,这是一款广泛应用于游戏开发和其他多媒体项目的开源库。SDL库为开发者提供了低级别的硬件访问能力,包括图形渲染、...

    SDL入门教程

    3. **旋转与缩放**: `SDL_RenderCopyEx`允许你指定旋转角度和缩放比例,实现图像的动态变换。 4. **混合模式**: SDL支持多种混合模式,通过`SDL_SetRenderDrawBlendMode`改变渲染器的混合模式,实现复杂的图像效果...

    sdl中文文档---很简单很容易入门

    **SDL (Simple DirectMedia Layer)** 是一个跨平台的多媒体库,主要用于开发图形用户界面和游戏。这个库由.libsdl.org维护,它为开发者提供了一种简单的方法来处理音频、视频、输入设备和时间同步等任务,是许多开源...

    SDL学习电子档

    同时,了解图像的旋转、缩放和裁剪操作。 5. **音频播放**:掌握音频缓冲和混音的概念,学习如何播放音乐和音效文件。 6. **游戏开发**:结合前面的知识,尝试开发简单的2D游戏,如打砖块、贪吃蛇等,实践SDL在...

    SDL.rar_sdl_sdl api

    5. **事件处理**:SDL提供了一个事件模型,能够捕获用户输入,如键盘、鼠标、触摸和游戏控制器的事件。 6. **文件系统接口**:简化了对文件的操作,提供了跨平台的读写接口。 7. **多线程支持**:允许开发者创建和...

    SDL2-2.0.3库

    综上所述,`SDL2-2.0.3`是一个功能强大的跨平台开发库,对于任何涉及多媒体和游戏开发的项目来说,都是一个不可或缺的工具。通过其丰富的API和广泛的社区支持,开发者可以轻松地创建高性能、交互性强的应用程序。

    SDL学习资料

    3. **图像加载与处理**:讲解如何加载图片文件,并进行旋转、缩放等操作。 4. **颜色和透明度**:探讨如何处理颜色和透明效果。 5. **音频流处理**:深入讲解音频缓冲、格式转换和混音。 6. **事件处理**:阐述如何...

    sdl图片浏览器

    SDL是一个跨平台的开发库,主要用于处理多媒体元素,如图形、音频和输入设备控制,尤其在游戏开发领域应用广泛。本软件提供了对图片的简单操作功能,用户可以方便地浏览和管理个人的图像集合。 在描述中提到的...

    SDL-devel-1.2.14-VC8.rar_www2.at.vc

    3. **图形渲染**:SDL可以处理2D图形渲染,包括图像加载、绘制、旋转、缩放等操作。它还支持硬件加速,提高图形性能。 4. **输入设备管理**:SDL可以获取键盘、鼠标、游戏手柄等各种输入设备的状态,方便用户交互。...

    c语言初学者图像编程

    1. **SDL库**:这是一个跨平台的多媒体库,适用于游戏开发和图形编程。它提供了窗口管理、图像渲染、音频处理和输入设备控制等功能。例如,`SDL_Init()` 初始化库,`SDL_CreateWindow()` 创建窗口,`SDL_Renderer` ...

    瓦片地图简单游戏

    6. **学习资源与进阶**: 对于想要深入学习瓦片地图和游戏开发的初学者,可以参考《Game Programming Patterns》这样的书籍,或者网上大量的教程和论坛讨论。进阶话题可能包括自定义物理引擎、AI路径规划、网络同步等...

    pygame教程.pdf

    - pygame.transform模块提供图像的缩放、旋转和移动功能。 文档还提到了在使用Pygame之前,应该对Python具备一定的基础知识,因为Pygame是建立在Python语言之上的。对于初学者,可以选择适合自己的Python基础教程...

    2014年辛星pygame教程第一版

    - **变换操作**:支持图像旋转、缩放等。 #### 四、Pygame的安装与配置 1. **Python环境**:首先确保安装了Python,并且了解当前Python的具体版本。 2. **Pygame下载**:访问官方网站[www.pygame.org]...

    SDL Framework-开源

    5. **输入处理**:包括键盘、鼠标和游戏控制器在内的输入设备都可以被轻松地集成到游戏中,为用户提供交互式体验。 6. **资源管理**:SDLFW帮助开发者有效地加载、管理和释放游戏资源,如图像、音频文件和数据结构...

    C游戏编程入门到精通

    这可能包括学习如何绘制2D图形、旋转、缩放和移动图像。OpenGL是一个广泛使用的图形库,虽然C语言本身不支持图形,但可以通过OpenGL库进行图形编程。 在编程过程中,调试和优化也是必不可少的环节。学习如何使用...

    SDL2-实践

    SDL2(Simple DirectMedia Layer 2)是一个跨平台的开发库,用于创建多媒体应用,包括游戏、视频播放器和其他图形密集型软件。这个教程将深入讲解如何使用C++与SDL2库进行实际开发。在Lazyfoo.net上的SDL2教程是一套...

    C++图像chuli

    在IT行业中,C++是一种广泛使用的编程语言,尤其在系统软件、游戏开发和高性能计算等领域。在本资源中,我们关注的是C++在图像处理方面的应用。"VC++"是Visual C++的简称,它是微软提供的一个集成开发环境,支持C++...

Global site tag (gtag.js) - Google Analytics