hge实用小介绍.doc_第1页
hge实用小介绍.doc_第2页
hge实用小介绍.doc_第3页
hge实用小介绍.doc_第4页
hge实用小介绍.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

无意中发现了HGE中文社区,听朋友介绍,认识了HGE,然后开始对它进行研究,并使用HGE开始制作游戏。 因为我所得的资料基本上都是来源于各位高手的无私翻译,所以,我打算也做一些贡献出来,在这里写一篇HGE的基础教程,供刚接触HGE的朋友研究学习。 教程中可能会出现一些错误,请大家及时指正。由于我也是初学者,包括C+,也只是一个初学者,所以写出的教程可能质量并不高,也请大家谅解。 另外,学习此教程需要C+的基本知识,不需要非常高深,只需要了解函数调用、结构体、枚举、常量、变量、类的基本知识、函数指针等基本知识即可。关于转载: 本教程可以随处转载,我的名字就不用了,不过请著名来源于HGEChina中文论坛:/,我们将对此表示感谢。 我使用的编译器: 我使用的编译器是Microsoft的Visual C+ 2005,但是Visual C+ 6.0或者Visual C+ 2003等VisualStudio的C+编译器都是可以使用HGE的,另外,BorlandC+也是可以使用HGE的,本教程将使用Visual Studio 2005为大家做讲解,如果有一些编译器问题上的出入,请大家搜索或者提问解决。 HGE基础教程第一章:初识HGE C+有一个理念,我记得是在我看C+ Primer学习时看到的,那就是一次代码编写,处处使用,所以,就出现了诸如DLL,LIB等便于大家使用的代码库。其思想基本就是把写好的代码打包,然后只要在工程中链接lib或dll,就可以使用dll或者lib中写好的代码,它们的出现,为资源共享创造了空前的便利。那么,HGE也是贯彻这个思想的一个库,它把DirectX进行封装,方便大家使用,由于直接使用DirectX需要直接接触硬件上的东西,所以不利于入门,HGE的出现,让高效图形编程成为了简单的东西。 关于免费: HGE是一个完全免费的,并且开源的引擎,所以我们可以随便使用在自己的商业或非商业项目,在此,我们也向HGE的编写者致敬。 激动人心的时刻:第一个HGE程序。 创建工程: 我们在Visual C+中新建一个WIN32工程,选择Win32控制台程序/Win32 console,为你的项目起一个名字。选择一个目录保存你的项目,点击确定-下一步。 选择Windows应用程序,并选择“空项目”/“empty Project”。点击确定,工程创建完毕,项目文件和代码就保存在刚才你选择的目录里。 工程的设置: 创建好工程后,我们需要进行一些设置,在左边的解决方案管理器中,看到你的项目名称,点右键,选择【属性R】 打开属性窗口后,点击C/C+,将右边的附加包含目录设置到你存放HGE引擎头文件的目录下,一般情况下,下载了hge引擎解压后,在hge目录下的include目录下。 设置完成后,再双击左边的链接器,打开子选项后,点【常规】,右边的附加库目录,选到hge目录下的lib/vc/目录 再点击左边的【输入】,右边附加依赖项:hge.lib、hgehelp.lib 如此一来,工程就设置好了。 好了,我们首先创建一个任意名字的.cpp文件。敲入以下代码: 另:解释,我就不写了,程序很简短,注释也很清楚。大家编译即可创建出第一个HGE程序了。怎么样,很简单吧! 代码: 写道:#include hge.h/包含hge头文件 HGE *hge=0;/创建一个指向hge类的指针。 bool RenderFunc()/绘制函数,程序开始后HGE将不停调用它 return false;/程序正常时总是返回false,返回true将从System_Start往下执行 bool FrameFunc()/逻辑函数,程序开始后HGE将不停调用它,一些逻辑判断或者处理可以写在这里。 return false;/总是返回false int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)/WinMain函数,程序的入口。 hge=hgeCreate(HGE_VERSION);/使用hgeCreate函数创建HGE接口,参数必须传递正确的HGE_VERSION,它是在hge.h中定义的 hge-System_SetState(HGE_SCREENWIDTH, 800);/将屏幕宽度设置为800 hge-System_SetState(HGE_SCREENHEIGHT,600);/将屏幕高度设置为600 hge-System_SetState(HGE_FRAMEFUNC, FrameFunc);/设置逻辑函数为FrameFunc函数 hge-System_SetState(HGE_RENDERFUNC,RenderFunc);/设置绘制函数为RenderFunc函数 hge-System_SetState(HGE_TITLE, 我的第一个HGE程序);/设置窗口标题为“我的第一个HGE程序” hge-System_SetState(HGE_WINDOWED,true);/设置使用窗口模式 hge-System_SetState(HGE_USESOUND,false);/设置不使用声音(第一个程序我们先不讲解声音和图像的知识)if(hge-System_Initiate()/用hge类的System_Initiate()方法,检测初始化是否有错误出现。 hge-System_Start();/如果没有问题,则使用System_Start方法,开始程序。 hge-System_ShutDown();/程序停止 hge-Release();/释放HGE所占用的内存。 以上代码应该比较简单易懂,那么,我说一点小东西,是大家需要留意一下的。一:请注意HGE HeadFile和dll的版本匹配,如果两个东西的版本不匹配的话,程序是会出错的,举个例子,比如你用了hge 1.7的头文件,而使用hge 1.8的dll,那么就会报错。 二:如果你发现了程序开始会有hge的LOGO,那么不用担心,它并不是需要付费才可以解除的,我们只需要加入这一句:h-System_SetState(HGE_SHOWSPLASH,false);即可解除掉程序开头HGE的LOGO。 三:关于FrameFunc和RenderFunc的返回值,RenderFunc需要一直返回false,这貌似是HGE的一个规则,必须这么写,但是FrameFunc就不一样了,如果返回了true,程序就会从hge-System_Start();函数下面继续运行,运行到了shutdown,程序就结束了。所以,有时候返回true是结束程序的好方法,而不是随地乱扔System_ShutDown和System_Release函数。 HGE基础教程第二章:可以看到的东西-图像显示图像显示,是所有程序,包括Windows操作系统在内必不可少的部分,代码编写者(程序员)将美工绘制好的图像显示到程序中,让使用者更加直观的看到程序的意图。废话就不多说了,这里我们来讲一下在HGE中,怎么显示图像,我相信跟我一样,大多数朋友在刚刚接触一个图像引擎的时候最关心的就是这个部分。OK,我们看下去。 HTEXTURE:这是HGE中定义的一个数据类型,用来保存我们加载的图像,Texture的意思是“纹理”,说白了就是图片,当然,当你的程序越来越复杂的时候,你会很乐意接受这种很规范的命名。我们现在只需要知道,这是一个数据类型,至于怎么把图像加载、释放、显示,我们下面一一道来 屏幕上的精灵-hgeSprite类:精灵,看起来很有意思的名字,但是很简单,它就是呈现图像的一个工具,每一个精灵都有一些属性,包括它的图像,关于这个,可以在置顶贴中找到hgeSprite类的全面资料。并且附加了代码。 灵魂部分:代码说了那么多,不如一段代码来的实在,同样,我将保留以上简洁明了的代码风格,让大家很方便的读懂它,并且会有详尽的注释: 另外,请用具体的参数替代代码中红字部分 代码: 写道:#include hge.h #include hgeSprite.h HGE *hge=0;/创建HGE指针 hgeSprite *spr;/创建精灵类指针 HTEXTURE tex;/定义一个texture(纹理)对象bool RenderFunc()/绘制函数,程序开始后HGE将不停调用它 hge-Gfx_BeginScene();/开始渲染 hge-Gfx_Clear(0xFF000000);/以某颜色清屏,OxFF000000为透明度为0的黑色 spr-Render(显示位置X,显示位置Y);/在指定位置显示精灵 hge-Gfx_EndScene();/结束渲染return false;/总是返回false bool FrameFunc()/逻辑函数,程序开始后HGE将不停调用它,一些逻辑判断或者处理可以写在这里。 return false;/程序正常时总是返回false,返回true将从System_Start往下执行 int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)/WinMain函数,程序的入口。 hge=hgeCreate(HGE_VERSION);/使用hgeCreate函数创建HGE接口,参数必须传递正确的HGE_VERSION,它是在hge.h中定义的 hge-System_SetState(HGE_SCREENWIDTH, 800);/将屏幕宽度设置为800 hge-System_SetState(HGE_SCREENHEIGHT,600);/将屏幕高度设置为600 hge-System_SetState(HGE_FRAMEFUNC, FrameFunc);/设置逻辑函数为FrameFunc函数 hge-System_SetState(HGE_RENDERFUNC,RenderFunc);/设置绘制函数为RenderFunc函数 hge-System_SetState(HGE_TITLE, 显示图像);/设置窗口标题为“显示图像” hge-System_SetState(HGE_WINDOWED,true);/设置使用窗口模式 hge-System_SetState(HGE_USESOUND,false);/设置不使用声音(第二个程序我们先不讲解声音的知识)if(hge-System_Initiate()/用hge类的System_Initiate()方法,检测初始化是否有错误出现。 tex=hge-Texture_Load(图片路径和后缀,这里是相对目录,vc+2005是debug目录);/根据路径载入图片 if(tex)/检测是否图片成功载入 spr=new hgeSprite(tex,图片的显示起始位置X,起始位置Y,图片宽,图片高);/初始化精灵spr,并且指定tex为它的纹理 hge-System_Start();/如果没有问题,则使用System_Start方法,开始程序。 hge-Texture_Free(tex);/释放纹理 delete spr;/释放精灵 hge-System_ShutDown();/程序停止 hge-Release();/释放HGE所占用的内存。 编译运行代码后,是不是看到你指定的图片被显示在了屏幕上呢?很简单吧,游戏制作的第一步,就这样轻松的被我们迈了出去。 寰子的话:凌晨1:30了,累死我了,我才发现写教程不是最累的,最累的是排版 HGE基础教程第三章:可以听到的-声音播放HEFFECT:这是HGE中的一个数据类型,就像HTEXTURE一样,但是它是用来保存载入的声音的,而HTEXTURE是用来载入保存的纹理(图像)的。我们根据以上的一章,知道了载入纹理是需要用Texture_Load函数的,那么,针对HEFFECT数据类型,也有一个函数用来专门载入声音。 Effect_Load函数这是一个有返回值的函数,返回的值便是一个HEFFECT数据,于是,我们可以写:snd=Effect_Load(Source/music.mp3); Effect_Free函数这是一个没有返回值的函数,看函数的名字,Free,也就是释放了,那么这个函数不难理解,就是释放已经载入的声音数据,作用基本同于delete。 Effect_Play函数这个函数的返回值是一个陌生数据类型,这个数据类型叫做HCHANNEL,什么意思呢?就是音轨的意思,我们知道,如果有5个同时播放而互不影响的音乐,那么,它们处在5个不同的音轨上。那么,这里也会返回一个音轨,方便我们来对这个音轨上播放的文件进行操作,诸如:“暂停,播放,继续,停止”等。 实例代码:以上简单列举了一下声音播放要接触到的几个基本函数,当然,我们首先让程序出声就可以了,随后再去考虑变调、变速、或者多轨混合等等这些东西。 代码: 写道:#include hge.h HGE *hge=0;/创建HGE指针 HEFFECT snd;/定义一个Effect(音效)对象bool RenderFunc()/绘制函数,程序开始后HGE将不停调用它 return false;/总是返回false bool FrameFunc()/逻辑函数,程序开始后HGE将不停调用它,一些逻辑判断或者处理可以写在这里。 if(hge-Input_GetKeyState(HGEK_A)/检测是否按下了A键 hge-Effect_Play(snd);/如果按下了A键,则播放音乐sndreturn false;/程序正常时总是返回false,返回true将从System_Start往下执行 int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)/WinMain函数,程序的入口。 hge=hgeCreate(HGE_VERSION);/使用hgeCreate函数创建HGE接口,参数必须传递正确的HGE_VERSION,它是在hge.h中定义的 hge-System_SetState(HGE_SCREENWIDTH, 800);/将屏幕宽度设置为800 hge-System_SetState(HGE_SCREENHEIGHT,600);/将屏幕高度设置为600 hge-System_SetState(HGE_FRAMEFUNC, FrameFunc);/设置逻辑函数为FrameFunc函数 hge-System_SetState(HGE_RENDERFUNC,RenderFunc);/设置绘制函数为RenderFunc函数 hge-System_SetState(HGE_TITLE, 播放声音);/设置窗口标题为“播放声音” hge-System_SetState(HGE_WINDOWED,true);/设置使用窗口模式 hge-System_SetState(HGE_USESOUND,true);/设置使用声音if(hge-System_Initiate()/用hge类的System_Initiate()方法,检测初始化是否有错误出现。 snd=hge-Effect_Load(声音路径和后缀,这里是相对目录,vc+2005是debug目录);/根据路径载入声音 if(snd)/检测声音是否已经载入成功 hge-System_Start();/如果没有问题,则使用System_Start方法,开始程序。 hge-Effect_Free(snd);/释放声音资源 hge-System_ShutDown();/程序停止 hge-Release();/释放HGE所占用的内存。 这基本就是最简单的声音播放了,根据以上学过的知识,我再写出几个需要注意的东西,第三章就结束了: 1:使用hgeSprite类,HTEXTURE,HEFFECT数据类型时,都不要忘记在不需要的时候或者程序结束的时候进行释放。 2:一定要在使用资源以前检测资源是否被载入,否则在使用资源操作函数时程序会出错退出。(如以上代码中的if(tex).) HGE基础教程第四章:显示顺序的仲裁者-Z-BufferZ-Buffer:Z-Buffer又被称为深度缓冲,不要觉得深奥,我一一道破它的秘密。2D空间中,我们习惯了X,Y两轴的坐标,聪明的朋友可能一眼就知道Z是用来做什么的,没错,既然非要给2D空间安上一个Z坐标轴,那么它的作用,就是决定2D空间上的对象的前后顺序,前面的挡住后面的。有人说了:那直接改变绘制顺序不就好了,回答是:这样的程序是在编译时决定,而Z,是在运行时决定,这就意味着程序的灵活性将又有一个质的飞跃,你觉得哪个好呢? 开启2D空间中的第三根坐标轴:不难发现,hgeSprite也好,hgeFont也好,都有一个方法:SetZ(float z);那么,可能有的朋友也试过,为啥不管用呢?可能你忽略了一步:打开Z-Buffer功能。如何打开呢?很简单,在开始的时候,使用加上以下一句: hge-System_SetState(HGE_ZBUFFER,true); 这样,Z-Buffer的功能就被启用了。 Z-Buffer的范围:Z-Buffer虽然是一个float,但是,它的有效范围只在0.0-1.0之间,至于为什么,我就不知道了,需要去问DirectX了,呵呵。在0.0-1.0这个范围内,Z值越小的对象,将被越靠前绘制,举个例子: 两个精灵,SpriteA,SpriteB,他们的Z值分别是0.1,0.2 这样的话,不管你render的顺序是什么,他们的覆盖顺序都是SpriteA覆盖SpriteB。 为什么要使用Z-Buffer:本来我已经困了,打算明天再写,不过想了想,这节也没太多东西,一顺儿写完吧! 好,回归正题。除了刚才说到的“编译时决策”和“运行时决策”的问题,使用Z-Buffer又有一个好处,那就是它可以优化速度。拿刚才SpriteA和SpriteB的例子来说, 如果按我们的老思路,如果要A覆盖B,那么绘制的顺序是:RenderB,RenderA,由远及近,远处的先画,近处的后画,近处的覆盖远处的,就成了一个覆盖顺序正确的图像。那么,既然有了Z-Buffer,我么就要颠覆一下这套理论了,我们要先RenderA,再RenderB,为什么呢?因为当你RenderA再RenderB的时候,DirectX会自己判断,有些地方已经有A的存在了,所以B就不需要在那些地方绘制东西了,直接跳过,小图不说,如果是两张满屏的大图呢?试想一下要节约多少FPS?这样的方法被称为逆向画家算法,但是,逆向画家算法也不是随便用的,必须要有Z-Buffer的支持,而且,最重要的是,Z-Buffer的顺序要设置正确,比如,A覆盖B,那么A的Z值要比B小,也就是更靠前一些,然后颠倒正常的绘制顺序,就达到了我们优化的目的。 说到这里,一定有人问了,能优化到什么程度呢?我说一下我的试验吧,一张800*600的满屏图,前面5000个50*100的动画小人不停走动,而且是每次都clear屏幕全部重绘的实时刷新,我是Geforce Go 7200的显卡,FPS达到了30+FPS。拿HGE带的例子比较,我在我的机器上试了,它的小人比我的小,到2000个的时候,就是30FPS,再往上就卡得要死了,当然,也是没有经过任何优化,这么以来,大家比一比,结果就出来了。 以上的东西我已经尽力写的很明白了,如果还有看不懂的就回帖提问吧!另外,毕竟我也是新手,老手勿笑! HGE基础教程第五章:你需要知道的更多一些hgeSprite的常用方法之-SetHotSpot:Sprite,翻译过来是精灵,它是为我们来呈现texture的一个类,开始在图像显示的时候我也在代码里用到了这个类,这是我们在显示图像的时候经常用的东西,可能很多方法大家都不太了解,我现在说几个常用实用的。首先,我们知道,图像在屏幕上呈现的位置通常由一个坐标控制,这个坐标相对于屏幕左和上边缘,那么,相对于图像呢?可能有的人习惯认为图像的坐标相对于图像就是图像左上角的位置了,但是又有的人习惯把图像的中心作为这个决定位置的点,别怕,hgeSprite都会满足我们的要求,无论多么苛刻,那就是SetHotSpot方法,使用这个方法,你可以为你的精灵设置一个热点,这个热点,不仅仅决定了显示坐标相对于图像的位置,同时也决定了旋转时的中心,可谓是非常实用了。 hgeSprite的常用方法之-SetColor:看名字就知道,是设置渲染色的,如果你设置一个红色的渲染色,那么,图像呈现出来就是带着红色渲染效果的,非常简单,设置的方法很简单,是一个DWORD值,你可以理解为long,是这样的格式:0xFF00FF00,那么除去0x,前两位FF是透明度,这里是16进制,后面的6位分别是r,g,b,FF就相当于我们平时的255了。但是这样看起来可就太不方便了,那我们动用一下系统函数:ARGB(),传递给这个函数a,r,g,b,这4个参数,它就会反回一个相应的16进制数,那么,我们就可以这样些:SetColor(ARGB(alpha,r,g,b);这样看起来,是不是简单多了呢?好了,先说这么两个,说说其他。 如果我重新载入了Texture呢?我们前面可以看到,hgeSprite是和HTEXTURE配套出现使用的,HTEXTURE是数据,而hgeSprite负责呈现它们,那么如果重新载入了图像呢?有的朋友会习惯性的学习new和delete使用时的方式,也就是要换,先调用hge-Texture_Free(tex)来释放texture,然后再delete 精灵,其实是不用的,开始我也是这么写的,但是经过站长vicky_lh指点,我们这样写就可以:第一,在更换texture的时候你只需要tex=hge-Texture_Load(path)即可,不需要free,其次,精灵更不需要delete,只有在对象被卸载,或者程序结束的时候,才需要这么做。 程序可能出错,但是我想把错误写到我的文件里去如果我们设置了logfile,那么hge会把所有的错误记录都会写到这个log里,如果我们有了自己的需要,那么如何截获hge发出的错误消息呢?使用这个方法:hge-System_GetErrorMessage(),它会返回一个char *,一个c风格字符串,里面就是程序到现在为止最后一条发生的错误信息。很方便吧? 我知道怎么播放音乐了,可是我该如何获取音乐的长度、暂停、继续等操作呢?很简单啦,可能你也注意到了,有Channel_GetLength、Channel_IsPlaying等方法,可是怎么用呢?有朋友就问过我这个问题,我说一下如何解决,比如我们载入了一个HEFFECT数据,并且播放了它,那么,在使用hge-Effect_Play()方法的时候,它会反悔一个HCHANNEL数据,这个数据就是音轨数据,它返回了你这个音乐播放的音轨,我们要操纵这段音乐,就要靠音轨来操作,看代码片段(这是不能直接编译执行的,只是代码片段): 引用:HEFFECT snd;/声音数据 HCHANNEL channel; snd=hge-Effect_Load(音乐路径);/载入音乐数据 channel=hge-Effect_Play(snd);/播放音乐数据,并用channel将返回的音轨记录下来 hge-Channel_SetVolume(channel,声音大小);/设置channel轨道声音的大小/这样说,看起来就很简单了吧!呵呵,目的达到了!HGE教程翻译(1) 收藏 放上来自己翻译的第一系列文章,是一个2D的开源免费的引擎叫HGE,官方网站/,中文官方论坛。其实在论坛上已经有人翻译完了这个系列的教程,不过排版和翻译读起来总觉得不尽如人意,就有了自己翻译的打算。 HGE是用Direct3d来模拟2D,硬件加速,功能强大,具体介绍请看官网和中文论坛。 本系列共8章,绝对自己翻译,转载请注明出处:/liujian885邮箱:Tutorial 01 最小的 HGE 应用程序首先我们包含hge.h头文件并声明一个变量来存储HGE接口指针:#include HGE *hge = 0; 接着我们创建frame function。这是个用户定义的功能,每帧都会执行一次,这里将放置你的游戏循环代码。如果frame function返回true,HGE会停止游戏执行。在这个例子中我们只是检查ESC键是否被按下。bool FrameFunc() if (hge-Input_GetKeyState(HGEK_ESCAPE) return true; return false;WinMain函数是个标准的应用程序入口。这里我们会获得HGE接口的指针来访问HGE的函数。在这个例子中我们使用全局的HGE的接口指针。你可以用hgeCreate函数当你要访问HGE时,要确保对每个hgeCreate调用相应的Release函数。int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) hge = hgeCreate(HGE_VERSION);接着我们设置一些HGE的内部状态来配置环境。虽然大多系统状态都有适当的默认值,至少HGE_FRAMEFUNC应该设置在System_Start前调用。 hge-System_SetState(HGE_FRAMEFUNC, FrameFunc); hge-System_SetState(HGE_WINDOWED, true); hge-System_SetState(HGE_USESOUND, false); hge-System_SetState(HGE_TITLE, HGE Tutorial 01 - Minimal HGE application);现在我们开始初始化HGE。如果有错误,System_Initiate会返回false和System_GetErrorMessage中可以读到的细节描述。HGE初始化后,通过System_Start函数我们开始游戏循环。程序直到frame function返回true时结束。 if(hge-System_Initiate() hge-System_Start(); else MessageBox(NULL, hge-System_GetErrorMessage(), Error, MB_OK | MB_ICONERROR | MB_APPLMODAL); 当按下ESC键或用户关闭窗口时,我们应该恢复视频模式并释放分配的资源。当然我们要释放HGE接口。 hge-System_Shutdown(); hge-Release(); return 0;看!只是20行代码我们就完成所有功能并且启动游戏环境!本文来自CSDN博客,转载请标明出处:/liujian885/archive/2008/03/08/2158026.aspx HGE教程翻译(2) 收藏 Tutorial 02 使用声音,输入和图象要渲染一些东西我们需要hgeQuad结构体。Quad是HGE的基本渲染元素。它包含4个顶点,顺时针0到3。同时我们需要声音效果的句柄。hgeQuad quad; HEFFECT snd; 这里我们放些游戏需要的变量和常量。float x=100.0f, y=100.0f;float dx=0.0f, dy=0.0f; const float speed=90;const float friction=0.98f; 这里我们创建一个播放碰撞声音的函数,参数是精灵的位置和速度。void boom() int pan=int(x-400)/4); float pitch=(dx*dx+dy*dy)*0.0005f+0.2f; hge-Effect_PlayEx(snd,100,pan,pitch); 现在来到frame function。我们需要知道从上次调用函数到现在的时间来调整动画的速度在当前的帧速率下。用Timer_GetDelta来获得时间。bool FrameFunc() float dt=hge-Timer_GetDelta(); 现在我们处理按键。我们用Input_GetKeyState函数来检测按键状态。捕获键的点击用Input_GetKey。 if (hge-Input_GetKeyState(HGEK_ESCAPE) return true; if (hge-Input_GetKeyState(HGEK_LEFT) dx-=speed*dt; if (hge-Input_GetKeyState(HGEK_RIGHT) dx+=speed*dt; if (hge-Input_GetKeyState(HGEK_UP) dy-=speed*dt; if (hge-Input_GetKeyState(HGEK_DOWN) dy+=speed*dt; 现在我们作些运动计算和碰撞检测: dx*=friction; dy*=friction; x+=dx; y+=dy; if(x784) x=784-(x-784);dx=-dx;boom(); if(x584) y=584-(y-584);dy=-dy;boom(); if(yGfx_BeginScene(); hge-Gfx_Clear(0); hge-Gfx_RenderQuad(&quad); hge-Gfx_EndScene(); return false; 渲染函数应该总是返回false。现在来看看WinMain函数的改变。在这例子中我们在HGE初始化前设置更多的系统状态。首先指定渲染函数。也要启用记录文件的支持并明确指定视频模式。 hge-System_SetState(HGE_LOGFILE, hge_tut02.log); hge-System_SetState(HGE_FRAMEFUNC, FrameFunc); hge-System_SetState(HGE_RENDERFUNC, RenderFunc); hge-System_SetState(HGE_TITLE, HGE Tutorial 02 - Using input, sound and rendering); hge-System_SetState(HGE_FPS, 100); hge-System_SetState(HGE_WINDOWED, true); hge-System_SetState(HGE_SCREENWIDTH, 800); hge-System_SetState(HGE_SCREENHEIGHT, 600); hge-System_SetState(HGE_SCREENBPP, 32); 当HGE初始化后我们要载入纹理和音效。 snd=hge-Effect_Load(menu.wav); quad.tex=hge-Texture_Load(particles.png); 现在我们设置需要渲染的hgeQuad结构体。纹理已经设置好,现在设置渲染模式并填充顶点数据。这个例子中我们不使用z-buffer,所以顶点的z-order被忽略,任意设置一个0.0到1.0的值。颜色的DWORD值格式为0xAARRGGBB。tx和 tx定义纹理的每个部分在精灵上渲染的位置。值为0.0到1.0。0,0意味着左上角,1,1是右下角。这里有个128x128的纹理,我们希望使用它的32 x32大的从96,64开始的一部分。 quad.blend=BLEND_ALPHAADD | BLEND_COLORMUL | BLEND_ZWRITE; for(int i=0;iSystem_Start(); hge-Texture_Free(quad.tex); hge-Effect_Free(snd); 本文来自CSDN博客,转载请标明出处:/liujian885/archive/2008/03/08/2158061.aspxHGE教程翻译(3) 收藏 Tutorial 03 使用 helper classes这次我们会学习使用HGE的一些帮助类。首先,包含所有需要的头文件并声明HGE全局指针,大多数帮助类都需要它。#include #include #include #include HGE *hge=0; 现在声明HGE对象。hgeSprite* spr;hgeSprite* spt;hgeFont* fnt;hgeParticleSystem* par; HTEXTURE tex; 在FrameFunc中我们更新粒子系统对象:我们基于精灵速度调整喷射速率并移动它到当前精灵位置。 par-info.nEmission=(int)(dx*dx+dy*dy)*2; par-MoveTo(x,y); par-Update(dt); 在RenderFunc中我们渲染所有的对象,调用它们的渲染方法。 hge-Gfx_BeginScene(); hge-Gfx_Clear(0); par-Render(); spr-Render(x, y); fnt-printf(5, 5, HGETEXT_LEFT, dt:%.3fnFPS:%d, hge-Timer_GetDelta(), hge-Timer_GetFPS(); hge-Gfx_EndScene(); 在WinMain函数中HGE初始化后创建HGE对象。首先设置精灵: spr=new hgeSprite(tex, 96, 64, 32, 32); spr-SetColor(0xFFFFA000); spr-SetHotSpot(16, 16); 接着载入字体。字体用两个文件描述font1.fnt 和 font1.png。 fnt=new hgeFont(font1.fnt); 创建粒子系统和精灵。 spt=new hgeSprite(tex, 32, 32, 32, 32); spt-SetBlendMode( BLEND_COLORMUL | BLEND_ALPHAADD | BLEND_NOZWRITE); spt-SetHotSpot(16, 16); par=new hgeParticleSystem(trail.psi, spt); par-Fire(); 现在所有对象创建完毕开始游戏循环。 hge-System_Start(); 游戏循环结束我们删除所有的HGE对象。 delete par; delete fnt; delete spt; delete spr; 这个程序的结束值和先前的示例是一样的。 本文来自CSDN博客,转载请标明出处:/liujian885/archive/2008/03/08/2158067.aspxHGE教程翻译(4) 收藏 Tutorial 04 渲染纹理首先我们声明渲染对象的句柄和配合使用的精灵。hgeSprite* tar; HTARGET target; 在一些事件期间,如视频模式选择,渲染对象的纹理句柄可能改变。所以我们在获得新的渲染目标的纹理时写GfxRestoreFunc函数。bool GfxRestoreFunc() if(tar & target) tar-SetTexture(hge-Target_GetTexture(target); return false; 在RenderFunc中我们首先渲染所有的素材到纹理,在Gfx_BeginScene中详细指定渲染对象。 hge-Gfx_BeginScene(target); hge-Gfx_Clear(0); par-Render(); spr-Render(x, y); hge-Gfx_EndScene(); 接着渲染一些纹理的示例到屏幕。 hge-Gfx_BeginScene(); hge-Gfx_Clear(0); for(i=0;iSetColor(0xFFFFFF | (5-i)*40+55)RenderEx(i*100.0f, i*50.0f, i*M_PI/8, 1.0f-i*0.1f); fnt-printf(5, 5 ,HGETEXT_LEFT, dt:%.3fnFPS:%d, hge-Timer_GetDelta(), hge-Timer_GetFPS(); hge-Gfx_EndScene(); 在WinMain中配置自己的GfxRestoreFunc函数。 hge-System_SetState(HGE_GFXRESTOREFUNC, GfxRestoreFunc); 在HGE初始化后,我们创建渲染对象和一个精灵,用创建的纹理渲染时容易点。 target=hge-Target_Create(512,512,false); tar=new hgeSprite( hge-Target_GetTexture(target),0,0,512,512); tar-SetBlendMode( BLEND_COLORMUL | BLEND_ALPHAADD | BLEND_NOZWRITE); 程序关闭时我们删除精灵以及对象。 delete tar; hge-Target_Free(target); 结束标识和前面的教程一样。本文来自CSDN博客,转载请标明出处:/liujian885/archive/2008/03/08/2158072.aspxHGE教程翻译(5) 收藏 Tutorial 05 使用曲面变换在这个教程中我们学习如何使用曲面变形,一种可以创建水面、透镜、纸张甚至实时的变化。我们使用静态的纹理,但你可以渲染你的整个游戏场景到一个纹理,通过扭曲网格来达到一些很酷的实时特效。首先包含头文

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论