HGE使用日誌

 
    這些日誌都是很早前陸續寫的,拿出來分享經驗:

2006-8-15

       7:30開始學習HGE引擎。

       從以前的接觸中知道,HGE引擎基於DX8。

       創建HGE最簡單程序的步驟:

1.  定義HGE類型的指針,用來保存引擎指針。

2.  調用 hgeCreate函數得到HGE引擎指針----這是個標準的C語言函數,從以前閱讀這個引擎的部分代碼得知,引擎內部模仿了COM,採用引用計數的方式創建引擎對象。

3.  設置引擎狀態值: System_SetState。在這裏必須設置幀更新函數,這是必須的,這個引擎把消息循環隱藏了,程序的表面流程變爲: mainàrenderFuncàend。當然程序底層還是一般的消息循環。設置了幀渲染函數後,引擎會不斷地調用這個函數。

在這裏還可以設置其他狀態信息,如渲染狀態,窗口尺寸,還可以設置是否需要LOG文件。

4.  調用System_Initiate函數初始化引擎。

5.  開始,System_Start。這個時候底層基本上就進入了消息主循環了

6.  在渲染函數裏(渲染函數沒有參數,返回值爲布爾類型)返回TRUE時,底層消息循環就跳出。System_Start函數也返回了。

7.  調用System_Shutdown做一些恢復工作

8.  調用Release徹底銷燬引擎。

9.  程度退出。

 

關於基本渲染圖元(Quad is the basic HGE graphic primitive)hgeQuad對象。

       文檔裏描述Quad is the basic HGE graphic primitive。HgeQuad是個結構體,裏面保存着一個紋理對象的ID值,一個渲染模式值,和一個hgeVertex結構體,這個結構體裏又包含了四個float和一個DWORD值。

    如下:

struct hgeVertex{  float  x, y;  float  z;  DWORD  col;  float  tx, ty;};      struct hgeQuad{  hgeVertex  v[4];  HTEXTURE   tex;  int        blend;};

    其中,x,y被描述爲屏幕座標,tx,ty被描述爲紋理座標,col被描述爲顏色。回憶下DX8中的做法:創建一組頂點,每個頂點包含了位置座標,和紋理座標(紋理座標一般爲0--1),還有顏色等信息,於是這裏的情況也就很好理解了。

    一個點在屏幕上有座標,一個矩形區域需要把一張圖片映射進來,如果採用紋理方式,就需要爲每一個點指定一個二維的座標。

    如果我沒推算錯,那麼在tutorial2中顯示圖片的原理,就是利用了渲染頂點的方式,而不是用D3Dsprite去渲染Texture的,同樣的,texture還是不能自己渲染自己。

   

    利用hgeQuad顯示圖片的過程:

1.  用Texture_Load載入外部文件作爲紋理。

2.  設置hgeQuad的紋理座標,窗口座標,以及渲染模式。

3.  每一幀都調用 Gfx_RenderQuad函數

注意:設置紋理座標以及窗口座標時,v[0]表示左上角座標,v[1]表示右上角座標,v[2]表示右下角座標,v[3]表示左下角座標。我用了2個小時才發現這個。--當然這還是我的猜測,但是這樣認爲可以正確地貼圖。

 

2006-8-16

    利用hgeSprite和HTEXTURE也可以實現貼圖。

    步驟爲:

    1.HTEXTURE tex = hge->Texute_Load( filename );

    2. hgeSprite  *sprite = new hgeSprite( tex, 0, 0, 64, 64 );

    3.sprite->Render( x, y )

    載入一幅背景透明的PNG圖片,用以上代碼就可以實現透明傳送。

 

    3D裏面沒有顏色鍵,只有alpha-channel。通過對 sprite的color的alpha值進行設置,可以實現淡入淡出效果,quad的四個頂點的顏色進行設置也可以---兩者底層其實都一樣,都是設置頂點顏色。

   

    HGE要顯示文字,似乎只能載入 fnt 文件---fnt文件裏又指定了 PNG圖片,PNG圖片裏指定了各種字體,例如裏面沒有漢字,程序裏就顯示不出漢字。有點麻煩。

    顯示文字步驟:

1.  New一個 hgeFont對象,構造函數傳其fnt文件。

2.  設置文字顏色,以及縮放程度(SetScale)

3.  調用 printf 顯示,或 Render。

 

通過使用 hgeSprite::SetFlip可以在Render的時候是水平翻轉圖象還是垂直翻轉圖象,還是兩者都翻轉。

 

可以動態設置 sprite的尺寸,以及texture ,從而達到用一個sprite去顯示多個texture的目的,但是一定要注意在顯示一幅texture時,必須重新設置textureRect。

如下代碼所示:

g_sprite->SetTexture( g_texture );

    g_sprite->SetColor( 0x55ffffff );

    g_sprite->SetTextureRect( 0, 0, 64, 64 );

    g_sprite->Render( 0, 0 );

    g_font->printf( 0, 64, "alpha-blend" );

 

    g_fishSpr->SetFlip( false, false );

    g_fishSpr->SetColor( ARGB( 255, 255, 255, 255 ) );

    g_fishSpr->Render( 100, 0 );

    g_font->printf( 100, 100, "normal transparent" );

   

    g_fishSpr->SetFlip( true, false );

    g_fishSpr->Render( 0, 200 );

    g_font->printf( 0, 300, "horizontally blit" );

 

    g_sprite->SetTexture( g_fish );

    g_sprite->SetColor( 0xffffffff );

    g_sprite->SetTextureRect( 0, 0, 200, 180 );

    g_sprite->Render( 200, 200 );

 

可以直接調用 hgeSprite::RenderEx進行縮放和旋轉,如下代碼爲縮放一半:

g_sprite->SetTexture( g_fish );

g_sprite->SetColor( 0xffffffff );

g_sprite->SetTextureRect( 0, 0, 200, 180 );

g_sprite->RenderEx( 200, 200, 0, 0.5f );

 

 

所有sprite的默認blend mode都是全局的 BLEND_DEFAUT,即:BLEND_COLORMUL | BLEND_ALPHABLEND | BLEND_NOZWRITE

 

 

FrameFunc如果放在類裏,則必須是靜態成員函數,否則編譯器會報“編譯器錯誤”之類的錯誤。但是如果它作爲靜態函數了,則很多類裏的成員無法訪問,好的方法是:創建一個橋樑全局函數,然後在Cgame::Init時傳該函數指針過去,然後在 Init裏就可以通過這個指針設置FrameFunc,這個橋樑函數,會顯示地調用Cgame::FrameFunc ,後者纔是真正有意義的幀處理函數。遊戲運行時,引擎先調用那個橋樑函數,然後橋樑函數再調用那個類成員函數。(參看hge3代碼)

 

 

使用HGE引擎的 Particle Editor可以很輕易地在程序裏實現粒子系統。

大體步驟:

1.先用Particle Editor編輯好粒子系統

2.把對應的 psi 文件以及particle.png圖片複製到自己的程序目錄下。

4.  程序裏new hgeParticleSystem對象,以及對應的sprite,和texture ,然後就可以fire啓動粒子系統

5.  在FrameFunc裏 hgeParticleSystem::Update,然後在渲染代碼塊裏Render就可以了。

(大致原理,我猜測是:psi文件保存了粒子系統信息,其對應着要使用particle.png這個圖片。創建sprite時具體指定使用哪部分,然後Update會更新粒子系統狀態,Render時就用對應的PNG圖片渲染出來。)

    當hgeParticleSystem::GetAge == -2且hgeParticleSystem::GetParticlesAlive

== 0 時,表示這個粒子系統所有粒子都消失了,可以被刪除了。

 

    (2006-8-29,論壇上看到的:

1) Set hotspot of particle sprite in center (if width and height = 64, then hotspot of x and y must be 32).

2) Be sure that when you create hgeParticleManager, fps in parameter same as in particle editor.)

使用z-buffer可以方便地繪製各種精靈,z-buffer越大,就越後面,反之,就被繪製得越前面。要使用z-buffer,大致步驟爲:

1.  System_SetState時要讓 HGE_ZBUFFER 爲 TRUE。否則所有的z值都會被忽略。

2.  渲染時,因爲紋理是靠精靈繪製出來的,所以這個時候只需要設置精靈的Z值: hgeSprite::SetZ即可。

3.  渲染。

(但是particle雖然也可以設置其內部的精靈Z值,但是顯示出來就有問題。)

 

實驗發現:HGE引擎裏的 HGE::Timer_GetDelta()並不是我的FPS系統裏的 SpeedFactor.

引擎裏的Delta通常在0.006左右,而我的SpeedFactor一般爲0.200。--數量級的差別。但是二者的作用似乎都是一樣的。----去平衡速度與動畫快慢。

 

2006-8-18

    關於引擎中的鼠標輸入:

    鼠標座標,只需要調用Input_GetMousePos函數即可,所得到的座標是相對於窗口左上角的局部座標。

    而按鍵狀態可以直接通過Input_GetKeyState( HGEK_LBUTTON );之類的代碼得到。

    Input_GetMouseWheel是用來得到鼠標滾輪狀態的。

    窗口程序下,當鼠標指針移動到窗口外時,GetMousePos函數得到的座標始終是移開前那個座標。

    HGE用精靈貼圖,即使給的座標爲負數,也能被貼出來----支持裁減。(偶爾會出現閃爍的黑線)

 

    音樂播放,可以直接使用Effect_Load函數調用,這種方法適用ogg, mp3, wav 等。該引擎不能播放MID。但是可以把MID轉換爲XM文件播放。

 

2006-8-23

    關於鼠標按鍵檢測:在每一幀裏,我都會調用Input_GetKeyState(HGEK_LBUTTON )函數來檢測按鍵狀態,實驗表明,當我只按一下鼠標左鍵時,記錄的數據也表明這個狀態被多次檢測到。在使用時,最好設置個時間標誌變量----在一段時間內,無論按鍵多少次,也只算做一次。

    Timer_GetTime()返回的是秒,小數點後精確到毫秒級---還要高些。

 

2006-8-24

    Effect_PlayEx返回的是HCHANNEL類型的變量,根據這個變量可以繼續控制其播放屬性,而控制播放中的聲音屬性的一組函數是以Channel開頭的。

2006-8-25

    Effect_Play每次返回的Channel值是不一樣的,即使是播放同一個HEFFECT。

 

2006-8-27(HGE154)

    關於數據打包並讀取,最簡單的方法是:用winrar壓縮數據爲zip格式,可以加密碼,然後在程序裏m_hge->Resource_AttachPack( "data", "kevinlynx" );關聯數據文件,然後以後加載圖片,聲音等數據文件時,給的路徑爲文件在zip裏的路徑即可自動載入。

    引擎裏的很多加載資源函數都有這麼個描述:

If filename specifies relative path, texture file is first searched within all resource packs attached with Resource_AttachPack, then in the application disk folder. If filename specifies absolute disk path, texture file is loaded directly from disk.

 

2006-8-31

     關於Resource Script File可以具體參看Resource Manager.doc文件。

 

 

2006-9-3

    關於HGE裏的GUI系統。

    要使用按鈕控件,做以下幾步:

1.  創建hgeGUI對象,該對象會管理所有的控件

2. 創建一個按鈕紋理,其格式包含兩幅橫向放着的圖象,一幅用於按鈕未按下時的外觀,一幅用於按下時的外觀:The texture must hold two images, one for the button in the unpressed state, and directly to the right from it, the image for the button in pressed state.

3.   把創建的按鈕加入hgeGUI對象。

4.   在每一幀裏調用hgeGUI::Update,在渲染裏hgeGUI::Render。

5.   可以通過hgeGUIButton::GetState來得到按鈕是否被按下。

注意:HGE裏的按鈕,只有當鼠標按下時纔會改變外觀顯示。當鼠標指針放在其上時,它不改變狀態。對於按鈕如果SetMode( true )了,按鈕將變爲一個類似RadioButton的控件。當hgeGUI對象被刪除時,其AddCtrl加進來的對象會被自動刪除。

 

要使用文本控件,同使用按鈕控件一樣,不同的是,文本控件需要個hgeFont對象,文本控件被初始化後,改變hgeFont對象,也會對文本控件產生作用。

 

雖然HGE引擎的GUI很簡單,但是其擴展性很好。因爲hgeGUI::Update基本上派發了所有控件需要的消息---鍵盤操作,以及鼠標操作;而hgeGUIObject基類的很多成員函數都會處理這些消息,我們只需要派生hgeGUIObject,然後重載我們需要的消息處理即可。這樣我們很容易地就可以設計出各種GUI控件。

 

2006-9-30

關於hgeParticleManager,可以把很多粒子系統加進去讓它自動管理,使用SpawnPS來加入粒子,第一個參數可以直接從hgeParticleSystem->info得到。然後再每一幀裏Update,然後Render。hgeParticleManager會管理這一切。

2006-10-1

關於ini文件操作:

所有操作ini文件的函數都有這三個參數:1,section.2,name. 3,value,查看一個DEMO ini文件便可知道它們三個的含義:

[snd_shoot]         //section

volume=30           //name = value

要注意的,要使用ini文件,需要設置一個引擎狀態:HGE_INIFILE

 

2006-10-1

hgeAnimation也可以指定在資源腳本文件裏,不過使用這個類要注意的是:需要調用Play來開啓動畫。

 

Hge154這樣的代碼可以把開始LOGO去掉:

m_hgeEngine->System_SetState((hgeIntState)14, 0xFACE0FF);

    

2006-10-4

Gfx_SetTransform函數是相對於整個屏幕而言的,它可以讓整個屏幕的內容旋轉與縮放,但是不能操作局部範圍!

 

使用target:可以在同一幀裏先把需要繪製的紋理繪製到target上,然後用函數Target_GetTexture得到target的紋理,再把該紋理配合sprite即可繪製出來---當offscreen使用!

 

注意:Gfx_BeginScene不能嵌套使用。

 

2006-10-15

在創建hgeSprite對象時,給其指定紋理座標時,例如:

Sp = new hgeSprite( tex, 0, 0, 32, 32 );

在繪製 sp 時,不會繪製 (0, 0, 32, 32 )  0, 32, 32, 32以及 32, 0, 32, 32這兩條線。

 

2006-11-10

HGE引擎的學習以及使用到今天就結束了。以後開始學着用ClanLib,多學習幾個開源的引擎,到時候才能取衆家之長,寫出自己的引擎。

 

2006-12-27

hgeSprite::GetBoundingBox返回的是hgeSprite擁有的紋理的矩形範圍。該矩形永遠都是正立的,它不會因爲精靈旋轉而旋轉。

 

2007-3-15

    關於Gfx_SetClipping函數,當設置裁減矩形爲 ( 100, 100, 300, 200 )時,繪製圖形在 (100, 100 )處繪製不出,而在(100+300, 100+200)處則能繪製出。也就是說,可以被顯示的區域爲:(101, 101, 100 + 300, 100 + 200 ) (包括這裏列出的座標本身)。當其寬度或高度爲0時,該函數可能會設置失敗,從而導致重新設置爲整個渲染對象。

    關於Gfx_RenderQuad函數,如果設置的矩形區域爲(100, 200, 100, 200 ),繪製時,不會繪製橫座標爲100這條線。也不會繪製縱座標爲200這條線,但是可以橫座標方向可以繪製到100+99處,縱座標也是。

 

    關於Gfx_RenderLine函數,該函數忽略最後一個點。

 

 

2007-5-13

    關於Texture_Lock函數,即使lock的是紋理上的一部分,在獲取紋理上的一點顏色信息時:

    lock_ptr[ y * width + x ]

    其中width是該紋理整個的寬度,而不是lock的寬度!


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/kevinlynx/archive/2007/06/20/1659734.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章