免费的游戏引擎HGE使用记

来源:互联网 发布:淘宝店铺出租安全吗 编辑:程序博客网 时间:2024/04/29 19:37
今天了解到有个HGE的2D免费游戏引擎,不由得心痒痒想看看,本来还害怕太大,下起来麻烦,结果去其官网一看,才2M多,马上就下下来。
官网地址:http://hge.relishgames.com/downloads.html
Google了一下,英文资料比较多,中文就几篇,找到一篇中文的tutorial来试试吧。
Tutorial地址:http://www.rainstorey.com/blog/article.asp?id=66

二话不说,建立一个win32的普通窗口工程,选择空项目,把上面的代码拷贝一下,再将lib什么的加上,代码基本就是这样的:

#include "hge.h" //引用HGE头文件,每个使用HGE Engine的程序都要有这行。
#include "hgesprite.h" //精灵系统头文件
#include "hgefont.h" //字体系统头文件
#include "hgeparticle.h" //粒子系统头文件

#pragma comment (lib,"D://src//libs//hge16//lib//vc//hge.lib")
#pragma comment (lib,"D://src//libs//hge16//lib//vc//hgehelp.lib")

//定义Engine的指针
HGE *hge=NULL;

//HGE对象定义
hgeSprite *spt;
hgeFont *fnt;
//粒子系统
hgeParticleSystem *par;

//颜色
hgeColor color;

//纹理和声音句柄
HTEXTURE tex;
HEFFECT snd;
hgeQuad quad;

//回调,游戏主循环
bool FrameFunc()
{

    float dt=hge->Timer_GetDelta();

    // 检测键盘
    if (hge->Input_GetKeyState(HGEK_ESCAPE)) return true;//按下ESCAPE则结束循环

    quad.v[0].tx=0; quad.v[0].ty=0;
    quad.v[1].tx=1; quad.v[1].ty=0;
    quad.v[2].tx=1; quad.v[2].ty=1;
    quad.v[3].tx=0; quad.v[3].ty=1;
  
     color.SetHWColor(0xFFFFE060);

    //更新粒子系统
    //设置粒子密度
    par->info.nEmission=150;
    par->Update(dt);//更新粒子系统状态

    //渲染画面
    hge->Gfx_BeginScene();
    hge->Gfx_Clear(0x00000000);
    hge->Gfx_RenderQuad(&quad);
    par->Render();//粒子系统渲染
    //输出字体
    //fnt->SetColor(ARGB(0,0,48,156));
    fnt->SetColor(color.GetHWColor());
    fnt->printf(5,5,0,"deltatime:%.3f/nFPS:%d/nAuthor:thinkinnight", dt, hge->Timer_GetFPS());
    hge->Gfx_EndScene();//渲染结束

    //继续循环
    return false;
}


int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    //创建Engine接口
    hge = hgeCreate(HGE_VERSION);

    //生成日志
    hge->System_SetState(HGE_LOGFILE, "Game.log");

    //设置回调
    hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);

    //设置窗口标题
    hge->System_SetState(HGE_TITLE, "MyHGEDemo");

    //设置最大FPS
    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->System_SetState(HGE_USESOUND, true);

    //Engine初始化
    if(hge->System_Initiate()) {

        //载入声音和纹理
        snd=hge->Effect_Load("BG.mp3");
        tex=hge->Texture_Load("texture.png");
        quad.tex=hge->Texture_Load("texture.jpg");
        if(snd && tex && quad.tex)//如果没有意外
        {
            //载入字体
            fnt=new hgeFont("font1.fnt");

            //创建粒子Sprite用于粒子系统
            spt=new hgeSprite(tex, 0,0, 32, 32);
            spt->SetBlendMode(BLEND_COLORMUL | BLEND_ALPHAADD | BLEND_NOZWRITE);
            spt->SetHotSpot(16,16);

            // 创建和设置粒子系统
            par=new hgeParticleSystem("trail.psi",spt);
            par->MoveTo(400,300);//粒子发散中心点
            par->Fire();//启动

            quad.blend=BLEND_ALPHABLEND | BLEND_COLORMUL | BLEND_NOZWRITE;

            for(int i=0;i<4;i++)
            {
                //设置颜色,格式为0xAARRGGBB
                quad.v[i].col=0xFFFFFFFF;
            }

            quad.v[0].x=0; quad.v[0].y=0;
            quad.v[1].x=1024; quad.v[1].y=0;
            quad.v[2].x=1024; quad.v[2].y=1024;
            quad.v[3].x=0; quad.v[3].y=1024;

            hge->Effect_PlayEx(snd,100,0,1.0f,true);
            //启动Engine开始主循环
            hge->System_Start();//该方法反回则代码游戏将要退出

            //删除用过的资源
            delete par;
            par=NULL;
            delete fnt;
            fnt=NULL;
            delete spt;
            spt=NULL;

            hge->Target_Free(quad.tex);
            hge->Texture_Free(tex);
            hge->Effect_Free(snd);
        }
    }

    //Engine关闭
    hge->System_Shutdown();
    //释放指针
    hge->Release();

    return 0;
}

build一下,哈,成功。
运行一下呢?咦!怎么出来一下就跳出了,看来要看看代码,原来是这样        snd=hge->Effect_Load("BG.mp3");
tex=hge->Texture_Load("texture.png");
quad.tex=hge->Texture_Load("texture.jpg");
fnt=new hgeFont("font1.fnt");
par=new hgeParticleSystem("trail.psi",spt);

这些资源文件我都没有,在load的时候就出错了,那就加上吧。
首先是mp3和jpg文件,这个简单,马上搞定。
然后png文件,上网下载一个好了。
接着的font1.fnt和trail.psi,就用上面那位兄弟提供的程序包中的吧,呵呵,不好意思了。
忽然发现,上面那位兄弟的文件中还有一个font1.png文件,恩,很可疑,于是去查资料,
终于在wiki中找到,是由.fnt和.png来组成一个font,这个也一起要。
好了,现在一切都有了,先运行起来看看。
恩,不错不错,很漂亮!

不过,怎么感觉还是缺了点什么?我不是用了font的吗?似乎font也没输出什么来嘛
fnt->printf(5,5,0,"deltatime:%.3f/nFPS:%d/nAuthor:thinkinnight", dt, hge->Timer_GetFPS());
这句到哪里去了?

呵呵,不急,我们有log文件
打开运行程序目录,发现里面新产生了一个game.log文件,打开文件,哦,里面说:
“font1.fnt is incorrent font”,大概是这个意思了,因为我是下午的时候搞的,现在那个文件也找不到了。也就是说font1.fnt这个文件不对,我想起我是下载的最新版,是不是因为这个原因,老的.fnt文件不能使用了呢?
那怎么办?不能输出,不是很不爽。

找找吧,呵呵,给我找到了,在doc的同一级目录,有个tool目录,下面有fonted目录,下面有个exe,打开exe,哈,就是它了,原来是个生成字体文件的东东,用它生成一个字体文件,放入工程目录,再次运行,那一串字出来了。

不过字出来的时候默认是白色的,不喜欢,换个颜色吧,
fnt->,点出来setcolor方法,加个RGB值进去,编译、运行,怎么字又不见了?看来我太乐观了,去看doc,原来是那个的ARGB,还有个Alpha值。
怎么办?难不倒我,不就多个值嘛,来找找sample,哈哈,找到了
于是加上一个hgeColor对象color
color.SetHWColor(0xFFFFE060);
fnt->SetColor(color.GetHWColor());
其实直接用fnt->setcolor(0xffffe060)也行,不过照着sample来吧。
再次编译运行,成功!字体变成黄色!虽然本来想改成天蓝色的,不过懒得再找其ARGB值了,先就这样吧!

最终的运行效果截图如下:

怎么样?还不错吧!那些光点就是渲染的效果,是可以不断动的,而且还有一个mp3的背景音乐。字体也是不断刷新的。

不过也是有缺点的,不支持中文,从它使用的字体文件就知道了。看来要中文化,还是要花功夫去修改源码,以及添加字库文件的。