- 1、本文档共14页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
SDL入门教程(十三)
HYPERLINK /lf426/archive/2008/04/26/48206.html SDL入门教程(十三):1、多线程,从动画说起
作者:龙飞1.1:简单动画游戏离不开动画。我们考虑最简单的情况:将一个角色从一个位置移动到另外一个位置。这个行为表述给电脑就是,将一个surface不断的blit(),从起始位置的坐标,移动到结束位置的坐标。移动速度取决于每次blit()的坐标差和blit()的时间间隔(v = ds/dt )。我们来设计一个函数实现这个简单的动画。我们需要的数据有:起始坐标(int beginX, int beginY),结束坐标(int endX, int endY),以及作为SDL基础的ScreenSurface窗口(const ScreenSurface screen)。一般的考虑是,将这5个数据以参数的方式传入函数;但是一种更加通用一点的方式是,将这5种数据合并成一个结构,这样函数的参数形式会更加的统一,这正是触发多线程的函数所需要的。在SDL中,我们通过函数:
SDL_Thread *SDL_CreateThread(int (*fn)(void *), void *data);
触发多线程,其中所需要的函数指针形式为:
typedef int (*fn)(void*);
而void*类型的data就是函数(*fn)()需要的的数据。我们可以将任意的结构体指针,转化为void*,作为这个函数的第二个参数需要。因此,我们可以为我们需要的动画函数定义一个结构作为传递所有数据的载体:
struct AmnArg{int beginX;int beginY;int endX;int endY;const ScreenSurface screen;AmnArg(int begin_x, int begin_y, int end_x, int end_y, const ScreenSurface _screen): beginX(begin_x), beginY(begin_y), endX(end_x), endY(end_y), screen(_screen){}};
这样,我们可以将AmnArg对象的指针传递给动画函数——考虑到多线程函数的需要,我们再曲折一点:先将AmnArg*转换成void*传递给函数,在函数内部再将其转换回来以供调用。
int amn(void* data){AmnArg* pData = (AmnArg*)data;PictureSurface stand(./images/am01.png, pData-screen);stand.colorKey();PictureSurface bg(./images/background.png, pData-screen);const int SPEED_CTRL = 300;int speedX = (pData-endX - pData-beginX) / SPEED_CTRL;int speedY = (pData-endY - pData-beginY) / SPEED_CTRL;for ( int i = 0; i SPEED_CTRL; i++ ){pData-beginX += speedX;pData-beginY += speedY;bg.blit(pData-beginX, pData-beginY, pData-beginX, pData-beginY, stand.point()-w, stand.point()-h, 2, 2);stand.blit(pData-beginX, pData-beginY);pData-screen.flip();}return 0;}
注意:我们这里仅仅设定了每次blit()的位移差(ds)而没有设定时间差(dt)。这并不意味着dt == 0,事实上,电脑处理数据是需要时间的,包括运算和显示。我们这里事实上将dt的设定交给了电脑,也就是说,让电脑以其最快的速度来完成。为什么要这么做呢?这是为了演示多线程的一个现象,卖个关子,后面解释。:)1.2:动画函数在主程序中的调用
#include SurfaceClass.hpp#include amn.hppint main(int argc ,char* argv[]){//Create a SDL screen.const int SCREEN_WIDTH = 640;const int SCREEN_HEIGHT = 480;const Uint32 SCREEN_FLAGS = 0; //SDL_FULLSCREEN | S
文档评论(0)