Just My Life & My Work

[TheFly] 螢幕顯示

由於執行時沒有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

隨意留個言吧:)~

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料

標籤雲