内容
|
Textures
支持的图像格式有: (BMP, DDS, DIB, JPG, PNG and TGA ). 通常纹理可作为背景图,和精灵单元.
Sprites
Sprites 定义为纹理图像的一部分. 在Sprite定义之前必须至少定义一个Texture,来为sprite提供精灵单元. hgeSprite 是一个 helper class 用来设计和操作sprite. 你可以对sprite进行重设大小(包括伸缩图像),填入其他颜色,旋转和许多其他的成员功能函数的功能。
在资源管理器中定义sprite和texture
定义Texture,在resource.res文件中定义,例如:
Texture background { filename=bg.jpg }
确保bg.jpg文件与执行文件处于同样目录中,你可以下载本例程的该文件: Media:HGE_bg.jpg
定义sprite,需要增加一个必须 的参数 rect, 该参数用来定义截取texture文件的比例大小. rect参数的格式含义为: 左上角的坐标+宽高。例如,一个sprite起始于texture坐标的 (0, 0), 并且宽高为32,则其格式为( 0, 0, 32, 32). 如果用正张图片,宽高你该知道怎么设置*。*
resource。res文件中的定义:
Sprite bgSprite { texture=background rect=0, 0, 512, 512 }
注意:Texture文件 的大小必须是2的幂,而sprite则不用设定。
显示sprite
用 hgeSprite 类:
#include <hgesprite.h> hgeSprite* bgSprite;
Step 1: 初始化 sprite
在WinMain函数中,在 HGE 初始化之后,在该函数下面 myRes = new hgeResourceManager("resource.res"); 添加如下:
bgSprite = myRes->GetSprite("bgSprite");
这里的bgSprite名字的重合,纯属偶然!注意res文件中的命名与这里引用的名称的一致性。
Step 2:渲染 sprite
在函数 (FrameFunc), 我们加入 Gfx_BeginScene() 和 Gfx_EndScene() 函数来表示我们开始和结束渲染. Gfx_Clear() 函数用指定颜色清屏(0 是黑色).
sprite的 Render() 函数开始渲染,起始点为屏幕的左上角。
bool FrameFunc() { hge->Gfx_BeginScene(); hge->Gfx_Clear(0); //clear the screen, filling it with black bgSprite->Render(0, 0); //render the background sprite hge->Gfx_EndScene(); return false; }
return false; 意味着动画将一直执行。return true;动画执行一次将关闭窗口。
改变 bgSprite->Render(0, 0); 如下
bgSprite->RenderStretch(0, 0, 800, 600); //render the background sprite stretched
RenderStretch()函数将按坐标的起始点和宽高来拉伸sprite。
添加其他sprite
定义添加另外一个sprite在当前文件中。
你可以下载该图像: Media:HGE_sheet.png
在resource.res文件中定义如下:
Texture sheet { filename=sheet.png } Sprite playerSprite { texture=sheet rect=0, 0, 64, 64 }
这里的playerSprite将截取起始点为左上角,以64x64宽来截取texture。
在上面的程序中,在bgSprite的声明下,加入:
hgeSprite* playerSprite;
在WinMain函数中,在bgSprite的初始化后面,加入:
playerSprite = myRes->GetSprite("playerSprite");
下FrameFunc函数中加入:
playerSprite->Render(200, 200); //render the player sprite
在(200, 200).位置将绘制playerSprite的绿色圆形。
Animations
动画是一系列的sprite的相继显示,定义动画需要额外的参数有:帧数,以及fps(即每秒钟的显示帧数)。.hgeAnimation 是 HGE 动画处理sprite的 helper class
它继承自hgeSprite类,因此你可以调用所有的hgeSprite方法。在资源管理器中定义一个动画和定义一个sprite很接近,除了额外的3个参数需要设定:
- frames: 动画显示的帧数。该帧数的计算是从动画的原点开始,以设定的宽高来自左向右或者从上到下来截取下一张图像。每一帧的图像大小一定要相等。
- fps: 每秒显示的帧数。
- mode: 动画的运动模式.
-
Group 1.
方向: 选取下列中的一项
-
FORWARD - 连续
-
REVERSE - 逆序
-
The default value is
FORWARD.
-
FORWARD - 连续
-
Group 2.
循环: 选取一项
- LOOP - 完成后从1帧开始
- NOLOOP - 只显示一次
- 默认值是 : LOOP.
-
Group 3.
乒乓型: 选取一项
- PINGPONG - 例如三帧的动画,可能显示的顺序是: 1, 2, 3, 2, 1, 2, 3, 2, 1, ....
- NOPINGPONG - 不用此行。
- 默认值是: NOPINGPONG.
下面定义了一个显示数字的星星的sprite:
Animation star { texture=sheet rect=0, 64, 64, 64 frames=3 fps=1.0 mode=FORWARD,LOOP }
注意这里的起始点是 (0, 64) ,FORWARD类型,则下一张是(32, 64) 、 (64, 64) 。。。.
#include <hgeanim.h> hgeAnimation* star;
动画不会自己显示,调用play()函数:
star = myRes->GetAnimation("star"); star->Play(); //start playback of animation
为了让动画显示的=更合理,我们调用如下函数:
float dt=hge->Timer_GetDelta(); //得到调用FrameFunc函数的时间间隔 star->Update(dt); //update the animation
渲染
star->Render(400, 300); //render the animation of a star
完整的FrameFunc函数将是如下所示:
bool FrameFunc() { float dt=hge->Timer_GetDelta(); //get the time since the last call to FrameFunc star->Update(dt); //update the animation hge->Gfx_BeginScene(); hge->Gfx_Clear(0); //clear the screen, filling it with black bgSprite->RenderStretch(0, 0, 800, 600); //render the background sprite stretched playerSprite->Render(200, 200); //render the player sprite star->Render(400, 300); //render the animation of a star hge->Gfx_EndScene(); return false; }