由於執行時沒有DOS視窗,可以輸出變數值來debug,我打算把變數值輸出到螢幕,來檢驗程式碼所呈現的效果是否和我所期待的一樣。
這一篇最主要的程式碼是這一行:
/* bind a timer, frame rate = 60 fps */
FyBindTimer(0, 60.0f, RenderScene, TRUE);
Callback函式RenderScene是今日的主角。
void RenderScene(int skip)
{
// render the scene
FnViewport vp;
vp.Object(vID);
vp.Render(cID, TRUE, TRUE);
FnActor actor;
actor.Object(aID);
actor.Play(0, LOOP, skip, TRUE, TRUE);
FnWorld gw;
gw.Object(gID);
char string[128];
sprintf(string, "Hello~ HappyMan!", skip);
gw.UseMessageFont(EXTRA_LARGE_FONT);
gw.StartMessageDisplay();
gw.MessageOnScreen(0,550,string,255,255,0,127);
gw.FinishMessageDisplay();
ShowFPS(&gw,skip);
// actor information
//FnActor actor;
actor.Object(aID);
float a_pos[3],a_fDir[3],a_uDir[3];
actor.GetPosition(a_pos);
actor.GetDirection(a_fDir,a_uDir);
char sa_pos[128],sa_fDir[128],sa_uDir[128];
sprintf(sa_pos,"A current position: %6.2f %6.2f %6.2f",a_pos[0],a_pos[1],a_pos[2]);
sprintf(sa_fDir,"A facing position: %6.2f %6.2f %6.2f",a_fDir[0],a_fDir[1],a_fDir[2]);
sprintf(sa_uDir,"A up position: %6.2f %6.2f %6.2f",a_uDir[0],a_uDir[1],a_uDir[2]);
// camera information
FnCamera camera;
camera.Object(cID);
float c_pos[3],c_fDir[3],c_uDir[3];
camera.GetPosition(c_pos);
camera.GetDirection(c_fDir,c_uDir);
char sc_pos[128],sc_fDir[128],sc_uDir[128];
sprintf(sc_pos,"C current position: %6.2f %6.2f %6.2f",c_pos[0],c_pos[1],c_pos[2]);
sprintf(sc_fDir,"C facing position: %6.2f %6.2f %6.2f",c_fDir[0],c_fDir[1],c_fDir[2]);
sprintf(sc_uDir,"C up position: %6.2f %6.2f %6.2f",c_uDir[0],c_uDir[1],c_uDir[2]);
// screen information
char s_old[128];
sprintf(s_old,"Oldx Oldy: %d %d",oldX,oldY);
gw.UseMessageFont(LARGE_FONT);
// display message
gw.StartMessageDisplay();
gw.MessageOnScreen(0,0,sa_pos,255,255,0,127);
gw.MessageOnScreen(0,15,sa_fDir,255,255,0,127);
gw.MessageOnScreen(0,30,sa_uDir,255,255,0,127);
gw.MessageOnScreen(350,0,sc_pos,255,0,255,127);
gw.MessageOnScreen(350,15,sc_fDir,255,0,255,127);
gw.MessageOnScreen(350,30,sc_uDir,255,0,255,127);
gw.MessageOnScreen(0,45,s_old,255,255,0,127);
gw.FinishMessageDisplay();
gw.SwapBuffers();
}
// show frame rate
void ShowFPS(FnWorld *gw, int skip) {
static char string[128];
if (frame == 0) {
FyTimerReset(0);
}
if (frame/10*10 == frame) {
float curTime;
curTime = FyTimerCheckTime(0);
sprintf(string, "Fps: %6.2f", frame/curTime);
}
frame += skip;
if (frame >= 1000) {
frame = 0;
}
gw->UseMessageFont(SMALL_FONT);
gw->StartMessageDisplay();
gw->MessageOnScreen(750, 5, string, 255, 0, 0);
gw->FinishMessageDisplay();
}
我在螢幕左上方顯示actor(左)和camera(右)的資訊,有current position、facing direction、up direction,再加上滑鼠在螢幕上的最後「點」的位置。
螢幕右上方則顯示FPS,這裡不是指First Person shooting,而是指Frame Per Second。
最後螢幕下方顯示我個人的訊息。
直接看圖比較容易瞭解:
上圖鼠標的位置正是顯示上的數字452 335。
我在main裡頭設定actor和camera初始位置:
// put the actor on terrain float pos[3],fDir[3],uDir[3]; pos[0] = 3569.0f; pos[1] = -3208.0f; pos[2] = 10000.0f; // current position fDir[0]=0.0f,fDir[1]=-1.0f,fDir[2]=0.0f; // facing direction uDir[0]=0.0f,uDir[1]=0.0f,uDir[2]=1.0f; // up direction actor.SetPosition(pos); actor.SetDirection(fDir,uDir); actor.PutOnTerrain(tID, false, 0); // translate the camera FnCamera camera; camera.Object(cID); camera.Rotate(X_AXIS, 90.0f, LOCAL); float cpos[3]; cpos[0]=pos[0]; cpos[1]=pos[1]; cpos[2]=0.f; camera.SetPosition(cpos); camera.Translate(0.0f, 50.0f, 500.0f, LOCAL);
可以觀察到,camera.Translate之後改變camera位置,y=50.0f、z=500.0f,結果改變的是將camera往後移500、往上移50,明明座標系為左右x、前後y、上下z。
如果改成camera.Translate(0.0f, 10.0f, 100.0f, LOCAL);,結果呈現如上,也就是上移10、後移100。



隨意留個言吧:)~