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;
// 一些全局的變量信息
// x、y 爲小球的當前位置座標
float x=100.0f, y=100.0f;
// dx、dy爲小球的位置改變(偏移)量
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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。