HGE系列之三 漸入佳境

 

HGE系列之三    漸入佳境函數

 

前兩次「亂七八糟」的講述了一些HGE的基礎知識,不知看過的朋友有何感想,反正我本身都覺着有些不知所謂(),但本着堅持到底的原則,今天繼續獻上拙文一篇,若是有朋友實在看不過去,大可不吝嘲笑、大肆放言 :)字體

 

好了,轉至今天的主題,此次咱們來更深刻的揣摩一番HGE的示例程序,爲了簡單起見,我選擇了HGE SDK中自帶的示例程序三,因其深度不深不淺,依其進一步講解HGE着實適當 :)那麼,首先的首先呢,先讓咱們瞅瞅這程序運行起來是個什麼樣子:spa

 

 

 

怎樣,有些簡約的味道吧 :)固然,光憑一紙圖片也遠不能描繪程序中各方操做表現,因此在此我嚴重建議有興致的朋友能夠本身親身試上一把(注意相關遊戲資源須要置於同一目錄下),想必以後對於下面的示例代碼會有更深的體會:.net

 

//必須包含的一些頭文件指針

//提供HGE的底層接口操做日誌

#include "../../include/hge.h"orm

// HGE精靈類對象

#include "../../include/hgesprite.h"blog

// HGE字體類,用於顯示文字信息接口

#include "../../include/hgefont.h"

// HGE粒子類

#include "../../include/hgeparticle.h"

 

 

// 全局的HGE接口類指針

HGE *hge=0;

 

 

// 全局的HGE對象指針

// HGE精靈,spr爲圖示中的小球,spt則爲粒子(圖示中的小五角星)

hgeSprite*                 spr;

hgeSprite*                 spt;

// HGE字體類,用於顯示圖示中左上角的幀率信息

hgeFont*                  fnt;

// 用以管理粒子生成與消亡的hgeParticleSystem

hgeParticleSystem*    par;

 

// HGE資源句柄(實際上便是DWORD類型)

// 紋理句柄

HTEXTURE                     tex;

// 聲效句柄

HEFFECT                        snd;

 

// 一些全局的變量信息

// xy 爲小球的當前位置座標

float x=100.0f, y=100.0f;

// dxdy爲小球的位置改變(偏移)量

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幫助文檔 :)下同

    hge->Effect_PlayEx(snd,100,pan,pitch);

}

 

//幀函數(HGE應用程序必須編寫並設置該函數)

bool FrameFunc()

{

  // 得到時間改變量

    float dt=hge->Timer_GetDelta();

 

    // 處理按鍵

    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(x>784) {x=784-(x-784);dx=-dx;boom();}

    if(x<16) {x=16+16-x;dx=-dx;boom();}

    if(y>584) {y=584-(y-584);dy=-dy;boom();}

    if(y<16) {y=16+16-y;dy=-dy;boom();}

 

    // 更新粒子系統

    par->info.nEmission=(int)(dx*dx+dy*dy)*2;

    par->MoveTo(x,y);

    par->Update(dt);

 

    return false;

}

 

//渲染函數

bool RenderFunc()

{

    //渲染圖形

  //開始渲染場景

    hge->Gfx_BeginScene();

  //以黑色(0)清屏

    hge->Gfx_Clear(0);

  //渲染粒子系統

    par->Render();

  //渲染小球

    spr->Render(x, y);

  //輸出信息

    fnt->printf(5, 5, HGETEXT_LEFT, "dt:%.3f/nFPS:%d (constant)", hge->Timer_GetDelta(), hge->Timer_GetFPS());

  //結束渲染場景

    hge->Gfx_EndScene();

 

    return false;

}

 

//標準WinMain函數

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

  //建立HGE實例

    hge = hgeCreate(HGE_VERSION);

 

  //設置日誌文件名,用以記錄一些程序運行的信息

    hge->System_SetState(HGE_LOGFILE, "hge_tut03.log");

  //設置幀函數

    hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);

//設置渲染函數

    hge->System_SetState(HGE_RENDERFUNC, RenderFunc);

  //設置程序標題

    hge->System_SetState(HGE_TITLE, "HGE Tutorial 03 - Using helper classes");

  //設置幀率

    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

    if(hge->System_Initiate()) {

 

           // 加載聲音及紋理

           snd=hge->Effect_Load("menu.wav");

           tex=hge->Texture_Load("particles.png");

           if(!snd || !tex)

           {

                  // 若是其中一項加載失敗則報告錯誤並關閉HGE

          // 簡單的MessageBox信息框

                  MessageBox(NULL, "Can't load one of the following files:/nMENU.WAV, PARTICLES.PNG, FONT1.FNT, FONT1.PNG, TRAIL.PSI", "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL);

                  hge->System_Shutdown();

                  hge->Release();

                  return 0;

           }

 

           // 建立並設置HGE精靈

           spr=new hgeSprite(tex, 96, 64, 32, 32);

           spr->SetColor(0xFFFFA000);

           spr->SetHotSpot(16,16);

 

           // 加載字體

           fnt=new hgeFont("font1.fnt");

 

           // 建立並設置HGE粒子類

           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();

 

           // Let's rock now!

           hge->System_Start();

 

           // 刪除建立的對象並釋放加載的資源

           delete par;

           delete fnt;

           delete spt;

           delete spr;

           hge->Texture_Free(tex);

           hge->Effect_Free(snd);

    }

 

    // 關閉HGE

    hge->System_Shutdown();

    hge->Release();

    return 0;

}

 

好了,程序代碼就是這些,相信經過註釋你們應該可以理通其中的十之八九,但毫無疑問的是,在其中我也略去了不少細節的講述,譬如小球的移動方式(小球其實是會反彈滴:)),粒子系統建立時所使用的參數等等,可是我發現若是所有講述的話,不只表述冗長,敘述中心也會偏移,畢竟咱們只是想對HGE的使用有一個更全面一些的認識,因此嘛,本着KISS原則若是你說KISS原則不是這麼用的好吧,我認可你是對的),就讓咱們在此點到輒止,至於更深刻的內容就之後再說吧 :)

最後的最後,仍是那句:下次再見嘍 :)

 

 

 

 

本文同步分享在 博客「tkokof1」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索