/* ---------------------- perform the rendering C.Wang 0720, 2006 ---------------------- - / / ---------------------- perform the rendering C.Wang 0720, 2006 ---------------------- - */ void RenderIt(int skip) { FnViewport vp; // render the whole scene vp.ID(vID); vp.Render3D(cID, TRUE, TRUE); // get camera's data FnCamera camera; camera.ID(cID); float pos[3], fDir[3], uDir[3]; camera.GetPosition(pos); camera.GetDirection(fDir, uDir); // show frame rate 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; } FnText text; text.ID(textID); text.Begin(vID); text.Write(string, 20, 20, 255, 0, 0); char posS[256], fDirS[256], uDirS[256]; float cpos[3], apos[3], distance, height, length;// FnCharacter actor; actor.ID(actorID); FnObject terrain; terrain.ID(tID); sprintf(posS, "pos: %8.3f %8.3f %8.3f", pos[0], pos[1], pos[2]); sprintf(fDirS, "facing: %8.3f %8.3f %8.3f", fDir[0], fDir[1], fDir[2]); sprintf(uDirS, "up: %8.3f %8.3f %8.3f", uDir[0], uDir[1], uDir[2]); text.Write(posS, 20, 35, 255, 255, 0); text.Write(fDirS, 20, 50, 255, 255, 0); text.Write(uDirS, 20, 65, 255, 255, 0); text.End(); // swap buffer FySwapBuffers(); }
void CameraControl(CHARACTERid targetid) { FnCamera camera; camera.ID(cID); FnCharacter actor; actor.ID(targetid); float targetPos[3]; actor.GetPosition(targetPos); float negativeDistance[3]; negativeDistance[0] = -distance; negativeDistance[1] = 0; negativeDistance[2] = 0; float* rotation = EulerToQuarternion(0, degToRad(rot_y), degToRad(rot_x)); float* forwardDir = QuaternionMultiVector(rotation, negativeDistance); float camPos[3], GlobalRight[3]; GlobalRight[0] = 0; GlobalRight[1] = 1; GlobalRight[2] = 0; camPos[0] = targetPos[0] - forwardDir[0]; camPos[1] = targetPos[1] - forwardDir[1]; camPos[2] = targetPos[2] - forwardDir[2]; float* upDir = VectorCross(GlobalRight, forwardDir); //camera.Quaternion(rotation[0], rotation[1], rotation[2], rotation[3], GLOBAL); camera.SetPosition(camPos); camera.SetDirection(forwardDir, upDir); }
/* ------------------ movement control ------------------ - */ void Movement(BYTE code, BOOL4 value) { FnCharacter actor; actor.ID(actorID); bool up = FyCheckHotKeyStatus(FY_UP) || FyCheckHotKeyStatus('W'), down = FyCheckHotKeyStatus(FY_DOWN) || FyCheckHotKeyStatus('S'), left = FyCheckHotKeyStatus(FY_LEFT) || FyCheckHotKeyStatus('A'), right = FyCheckHotKeyStatus(FY_RIGHT) || FyCheckHotKeyStatus('D'), act = (frame - frameattack + 1000) % 1000 >= attacktime; if (code == 'J'&&value == TRUE) { if ((frame - frameattack + 1000) % 1000> attacktime) { actor.SetCurrentAction(NULL, 0, attackID, 5.0f); actor.Play(ONCE, 0.0f, FALSE, TRUE); frameattack = frame; FnCharacter npc1, npc2; npc1.ID(npc1ID); npc2.ID(npc2ID); float apos[3], npos[3], vector[2], fDir[3], rDir[3]; actor.GetDirection(fDir, NULL); actor.GetPosition(apos); npc1.GetPosition(npos); vector[0] = npos[0] - apos[0]; vector[1] = npos[1] - apos[1]; rDir[0] = fDir[1]; rDir[1] = -fDir[0]; if ((HP1>0) && (dot2(vector, fDir) / norm2(fDir)>0.0f) && (dot2(vector, fDir) / norm2(fDir) < 150.0f) && (abs(dot2(vector, rDir)) / norm2(rDir) < 20.0f)) { framedamage1 = frame + 10; HP1--; } npc2.GetPosition(npos); vector[0] = npos[0] - apos[0]; vector[1] = npos[1] - apos[1]; rDir[0] = fDir[1]; rDir[1] = -fDir[0]; if ((HP2>0) && (dot2(vector, fDir) / norm2(fDir)>0.0f) && (dot2(vector, fDir) / norm2(fDir) < 150.0f) && (abs(dot2(vector, rDir)) / norm2(rDir) < 20.0f)) { framedamage2 = frame + 10; HP2--; } } } else if (((up || down) && !(up&&down)) || ((left || right) && !(left&&right))) { curPoseID = runID; if (act) actor.SetCurrentAction(NULL, 0, curPoseID, 5.0f); } else { curPoseID = idleID; if (act) actor.SetCurrentAction(NULL, 0, curPoseID, 5.0f); } }
/*------------------ movement control -------------------*/ void Movement(BYTE code, BOOL4 value) { // Homework #01 part 2 FnCharacter actor; actor.ID(actorID); if (code == FY_UP || code == FY_LEFT || code == FY_RIGHT) { if (value) actor.SetCurrentAction(NULL, 0, runID, 5.0f); else if (!(FyCheckHotKeyStatus(FY_UP) || FyCheckHotKeyStatus(FY_LEFT) || FyCheckHotKeyStatus(FY_RIGHT))) actor.SetCurrentAction(NULL, 0, idleID, 5.0f); } // .... }
/*------------------------------------------------------------- 30fps timer callback in fixed frame rate for major game loop --------------------------------------------------------------*/ void GameAI(int skip) { FnCharacter actor; // play character pose actor.ID(actorID); actor.Play(LOOP, (float)skip, FALSE, TRUE); // Homework #01 part 1 if (FyCheckHotKeyStatus(FY_UP)) actor.MoveForward(20); if (FyCheckHotKeyStatus(FY_LEFT)) actor.TurnRight(-5); if (FyCheckHotKeyStatus(FY_RIGHT)) actor.TurnRight(5); //else {} // .... if (IsCameraFollow) { CameraControl(actorID); } }
void RenderIt(int skip){ float pos[3], fDir[3], uDir[3]; FnViewport vp; if(!stateMenu) {mouseInput.update();} //render the whole scene vp.ID(viewportID); if (!stateGhost) vp.Render3D(cameraID, TRUE, TRUE); if(stateMenu) vp.RenderSprites(sID2menu, FALSE, TRUE); // no clear the background but clear the z buffer else vp.RenderSprites(sID2, FALSE, TRUE); // no clear the background but clear the z buffer //show frame rate static char string[128]; if(frame == 0){ FyTimerReset(0); } if((frame/10)*10 == frame){ float curTime; curTime = FyTimerCheckTime(0); sprintf_s(string, "Fps: %6.2f", frame/curTime); } frame += skip; if(frame >= 1000){ frame = 0; } FnText text, charactorInfo,char_HP,info; text.ID(textID); charactorInfo.ID(textCharID); char_HP.ID(textHP_vID); info.ID(textInfo_vID); text.Begin(viewportID); charactorInfo.Begin(viewportID); text.Write(string, 20, 20, 255, 0, 0); //get camera's data camera.getCameraPos(pos); camera.getCameraDir(fDir, uDir); float fCameraAngle = camera.getCameraAngle(); char posS[256], fDirS[256], uDirS[256]; sprintf_s(posS, "pos: %8.3f %8.3f %8.3f", pos[0], pos[1], pos[2]); sprintf_s(fDirS, "facing: %8.3f %8.3f %8.3f", fDir[0], fDir[1], fDir[2]); sprintf_s(uDirS, "up: %8.3f %8.3f %8.3f", uDir[0], uDir[1], uDir[2]); char sCameraAngle[256], sMousePosX[256], sMousePosY[256]; sprintf_s(sCameraAngle, "camera angle: %8.3f", fCameraAngle); sprintf_s(sMousePosX, "mouse X %d ", mouseInput.mousePosX); sprintf_s(sMousePosY, "mouse Y %d ", mouseInput.mousePosY); text.Write(sCameraAngle, 20, 35, 255, 255, 0); text.Write(sMousePosX, 20, 50, 255, 255, 0); text.Write(sMousePosY, 20, 65, 255, 255, 0); text.Write(posS, 20, 80, 255, 255, 0); text.Write(fDirS, 20, 95, 255, 255, 0); text.Write(uDirS, 20, 110, 255, 255, 0); FnCharacter actor; actor.ID(actorID); //get actor's data actor.GetPosition(pos); actor.GetDirection(fDir, uDir); sprintf_s(posS, "pos: %8.3f %8.3f %8.3f", pos[0], pos[1], pos[2]); sprintf_s(fDirS, "facing: %8.3f %8.3f %8.3f", fDir[0], fDir[1], fDir[2]); sprintf_s(uDirS, "up: %8.3f %8.3f %8.3f", uDir[0], uDir[1], uDir[2]); text.Write(posS, 20, 125, 255, 255, 0); text.Write(fDirS, 20, 140, 255, 255, 0); text.Write(uDirS, 20, 155, 255, 255, 0); text.End(); sprintf_s(posS, "HEALTH"); charactorInfo.Write(posS, 50, 700, 255, 255, 100); sprintf_s(posS, "ROUND"); charactorInfo.Write(posS, 400, 700, 255, 255, 100); sprintf_s(posS, "TIME"); charactorInfo.Write(posS, 515, 700, 255, 255, 100); charactorInfo.End(); sprintf_s(posS, "%d", chrMgtSystem.getCharacterblood(actorID)); char_HP.Write(posS, 110, 672, 255, 255, 255); sprintf_s(posS, "%d", game_timer.getCurrentRound()); info.Write(posS, 460, 694 ,255, 255, 255); sprintf_s(posS, "%d", game_timer.getTimeLeft()); info.Write(posS, 560, 694, 255, 255, 255); info.End(); FySwapBuffers(); }
/*------------------ the main program C.Wang 1010, 2014 -------------------*/ void FyMain(int argc, char **argv) { // create a new world BOOL4 beOK = FyStartFlyWin32("NTU@2015 Homework #02 - Use Fly2", 0, 0, 1024, 768, FALSE); // setup the data searching paths FySetShaderPath("Data\\NTU6\\Shaders"); FySetModelPath("Data\\NTU6\\Scenes"); FySetTexturePath("Data\\NTU6\\Scenes\\Textures"); FySetScenePath("Data\\NTU6\\Scenes"); //Tang: FX FySetGameFXPath("Data\\NTU6\\FX"); //Tang // create a viewport vID = FyCreateViewport(0, 0, 1024, 768); FnViewport vp; vp.ID(vID); // create a 3D scene sID = FyCreateScene(10); FnScene scene; scene.ID(sID); // load the scene scene.Load("gameScene02"); scene.SetAmbientLights(1.0f, 1.0f, 1.0f, 0.6f, 0.6f, 0.6f); // load the terrain tID = scene.CreateObject(OBJECT); FnObject terrain; terrain.ID(tID); BOOL beOK1 = terrain.Load("terrain"); terrain.Show(FALSE); // set terrain environment terrainRoomID = scene.CreateRoom(SIMPLE_ROOM, 10); FnRoom room; room.ID(terrainRoomID); room.AddObject(tID); // load the character FySetModelPath("Data\\NTU6\\Characters"); FySetTexturePath("Data\\NTU6\\Characters"); FySetCharacterPath("Data\\NTU6\\Characters"); actorID = scene.LoadCharacter("Lyubu2"); // put the character on terrain float pos[3], fDir[3], uDir[3]; SetValues(pos, 3569.0f, -3208.0f, 1000.0f); SetValues(fDir, 1.0f, 1.0f, 0.0f); SetValues(uDir, 0.0f, 0.0f, 1.0f); ActorGen(scene, terrainRoomID, LyubuID, "Lyubu2", "Idle", pos, fDir, uDir); actorID = LyubuID.actorID; FnCharacter actor; actor.ID(actorID); // Get two character actions pre-defined at Lyubu2 idleID = actor.GetBodyAction(NULL, "Idle"); runID = actor.GetBodyAction(NULL, "Run"); NormalAttack1ID = actor.GetBodyAction(NULL, "NormalAttack1"); NormalAttack2ID = actor.GetBodyAction(NULL, "NormalAttack2"); HeavyAttack1ID = actor.GetBodyAction(NULL, "HeavyAttack1"); // translate the camera cID = scene.CreateObject(CAMERA); FnCamera camera; camera.ID(cID); camera.SetNearPlane(5.0f); camera.SetFarPlane(100000.0f); //hw3 : Donzo and Robber02 initialization float temp_pos[3]; float temp_fDir[3]; /* for (int i = 0; i < NUM_OF_BADGUYS; i++) { temp_pos[0] = pos[0] + 30 * (rand()%8); temp_pos[1] = pos[1] + 30 * (rand()%8); temp_pos[2] = pos[2] + 30 * (rand()%8); temp_fDir[0] = -1.0f; temp_fDir[1] = -1.0f; temp_fDir[2] = 1.0f; ActorGen(scene, terrainRoomID, badguyID[i], "Robber02", "CombatIdle", temp_pos, temp_fDir, uDir); } */ for (int i = 0; i < NUM_OF_BOSS; i++) { temp_pos[0] = pos[0] + 30 * (rand() % 8); temp_pos[1] = pos[1] + 30 * (rand() % 8); temp_pos[2] = pos[2] + 30 * (rand() % 8); SetValues(temp_fDir, -1.0f, -1.0f, 1.0f); ActorGen(scene, terrainRoomID, BossID[i], "Donzo2", "CombatIdle", temp_pos, temp_fDir, uDir); } // hw2 initial : set camera position actor.GetPosition(pos); pos[0] = pos[0] - SHORTDIST * fDir[0]; pos[1] = pos[1] - SHORTDIST * fDir[1]; pos[2] = pos[2] + HEIGHTOFFSET; SetValues(fDir, 1.0f, 1.0f, 0.0f); SetValues(uDir, 0.0f, 0.0f, 1.0f); camera.SetPosition(pos); camera.SetDirection(fDir, uDir); // the same as actor float mainLightPos[3] = { -4579.0, -714.0, 15530.0 }; float mainLightFDir[3] = { 0.276, 0.0, -0.961 }; float mainLightUDir[3] = { 0.961, 0.026, 0.276 }; FnLight lgt; lgt.ID(scene.CreateObject(LIGHT)); lgt.Translate(mainLightPos[0], mainLightPos[1], mainLightPos[2], REPLACE); lgt.SetDirection(mainLightFDir, mainLightUDir); lgt.SetLightType(PARALLEL_LIGHT); lgt.SetColor(1.0f, 1.0f, 1.0f); lgt.SetName("MainLight"); lgt.SetIntensity(0.4f); // create a text object for displaying messages on screen textID = FyCreateText("Trebuchet MS", 18, FALSE, FALSE); // create a 2D scene for sprite rendering which will be rendered on the top of 3D sID2 = FyCreateScene(1); scene.ID(sID2); scene.SetSpriteWorldSize(800, 600); // 2D scene size in pixels spID0 = scene.CreateObject(SPRITE); sp.ID(spID0); //showPicture(sp, "talk_mission.jpg", 780, 200 , 10, 10); //showPicture parameter : FnSprite ,imageName, size, position // set Hotkeys FyDefineHotKey(FY_ESCAPE, QuitGame, FALSE); // escape for quiting the game FyDefineHotKey(FY_UP, Movement, FALSE); // Up for moving forward FyDefineHotKey(FY_RIGHT, Movement, FALSE); // Right for turning right FyDefineHotKey(FY_LEFT, Movement, FALSE); // Left for turning left FyDefineHotKey(FY_DOWN, Movement, FALSE); FyDefineHotKey(FY_Q, Movement, FALSE); FyDefineHotKey(FY_W, Movement, FALSE); FyDefineHotKey(FY_E, Movement, FALSE); FyDefineHotKey(FY_A, Movement, FALSE); // Turn left with camera rotation FyDefineHotKey(FY_D, Movement, FALSE); // Turn right with camera rotation FyDefineHotKey(FY_S, Movement, FALSE); // define some mouse functions FyBindMouseFunction(LEFT_MOUSE, InitPivot, PivotCam, NULL, NULL); FyBindMouseFunction(MIDDLE_MOUSE, InitZoom, ZoomCam, NULL, NULL); FyBindMouseFunction(RIGHT_MOUSE, InitMove, MoveCam, NULL, NULL); // bind timers, frame rate = 30 fps FyBindTimer(0, 30.0f, GameAI, TRUE); FyBindTimer(1, 30.0f, RenderIt, TRUE); // invoke the system FyInvokeFly(TRUE); }
/*------------------ movement control -------------------*/ void Movement(BYTE code, BOOL4 value) { ////////////////////////////////////////// // Homework #01 part 2 ////////////////////////////////////////// // note : only hotkey input can trigger this function FnCharacter actor; FnCharacter badguy; //Tang: FX vector<char*> FX_FileName; //Tang float actorPos[3], actorfDir[3], actoruDir[3]; float badguyPos[3], badguyfDir[3], badguyuDir[3]; actor.ID(actorID); actor.GetPosition(actorPos); actor.GetDirection(actorfDir, actoruDir); // 2. use a global idle_count variable to memorize the action status. // (to prevent the "slide" actor bug) if (value) { idle_count++; if (FyCheckHotKeyStatus(FY_Q) && dirCount % SMOOTHINESS == 0) { actorPos[0] += actorfDir[0] * HATKOFFSET; actorPos[1] += actorfDir[1] * HATKOFFSET; for (int i = 0; i < NUM_OF_BADGUYS; i++) { badguy.ID(badguyID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < HATKRANGE && badguyID[i].blood_remain > 0) { if (!ActAction(badguyID[i], "Damage1", HATKDAMAGE)) { LyubuID.exp_cur += 50; if (LyubuID.exp_cur >= LyubuID.exp_total){ LyubuID.level++; LyubuID.exp_cur -= LyubuID.exp_total; } } //Tang: FX FX_FileName.clear(); FX_FileName.push_back("LyubuDamege"); GenFX(sID, gFXID, dummyID, badguyPos, FX_FileName); //Tang } } for (int i = 0; i < NUM_OF_BOSS; i++) { badguy.ID(BossID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < HATKRANGE && BossID[i].blood_remain > 0) { ActAction(BossID[i], "Donzo", HATKDAMAGE); //Tang: FX FX_FileName.clear(); FX_FileName.push_back("LyubuDamege"); GenFX(sID, gFXID, dummyID, badguyPos, FX_FileName); //Tang } } } if (FyCheckHotKeyStatus(FY_W) && dirCount % SMOOTHINESS == 0) { actorPos[0] += actorfDir[0] * NATK1OFFSET; actorPos[1] += actorfDir[1] * NATK1OFFSET; for (int i = 0; i < NUM_OF_BADGUYS; i++) { badguy.ID(badguyID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < NATK1RANGE && badguyID[i].blood_remain > 0) { if (!ActAction(badguyID[i], "Damage2", NATK1DAMAGE)) { LyubuID.exp_cur += 50; if (LyubuID.exp_cur >= LyubuID.exp_total){ LyubuID.level++; LyubuID.exp_cur -= LyubuID.exp_total; } } //Tang: FX FX_FileName.clear(); FX_FileName.push_back("MonGotHit"); GenFX(sID, gFXID, dummyID, badguyPos, FX_FileName); //Tang } } for (int i = 0; i < NUM_OF_BOSS; i++) { badguy.ID(BossID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < NATK1RANGE && BossID[i].blood_remain > 0) { ActAction(BossID[i], "Donzo", NATK1DAMAGE); //Tang: FX FX_FileName.clear(); FX_FileName.push_back("MonGotHit2G02"); GenFX(sID, gFXID, dummyID, badguyPos, FX_FileName); //Tang } } } if (FyCheckHotKeyStatus(FY_E) && dirCount % SMOOTHINESS == 0) { actorPos[0] += actorfDir[0] * NATK2OFFSET; actorPos[1] += actorfDir[1] * NATK2OFFSET; for (int i = 0; i < NUM_OF_BADGUYS; i++) { badguy.ID(badguyID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < NATK2RANGE && badguyID[i].blood_remain > 0) { if (!ActAction(badguyID[i], "Damage2", NATK2DAMAGE)) { LyubuID.exp_cur += 50; if (LyubuID.exp_cur >= LyubuID.exp_total){ LyubuID.level++; LyubuID.exp_cur -= LyubuID.exp_total; } } //Tang: FX FX_FileName.clear(); FX_FileName.push_back("Lyubu_atk01 -X"); GenFX(sID, gFXID, dummyID, badguyPos, FX_FileName); //Tang } } for (int i = 0; i < NUM_OF_BOSS; i++) { badguy.ID(badguyID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < NATK2RANGE && BossID[i].blood_remain > 0) { ActAction(BossID[i], "Donzo", NATK2DAMAGE); //Tang: FX FX_FileName.clear(); FX_FileName.push_back("Lyubu_atk01 -X"); GenFX(sID, gFXID, dummyID, badguyPos, FX_FileName); //Tang } } } if ((FyCheckHotKeyStatus(FY_UP) || FyCheckHotKeyStatus(FY_S)) && dirCount % SMOOTHINESS == 0) { dirCount = 0 - dirState; dirState = 0; } if (FyCheckHotKeyStatus(FY_RIGHT) && dirCount % SMOOTHINESS == 0) { dirCount = SMOOTHINESS / 4 - dirState; dirState = SMOOTHINESS / 4; } if (FyCheckHotKeyStatus(FY_LEFT) && dirCount % SMOOTHINESS == 0) { dirCount = SMOOTHINESS * 3 / 4 - dirState; dirState = SMOOTHINESS * 3 / 4; } if (FyCheckHotKeyStatus(FY_DOWN) && dirCount % SMOOTHINESS == 0) { dirCount = SMOOTHINESS / 2 - dirState; dirState = SMOOTHINESS / 2; } } else { idle_count--; } // 3. the actor is idle when idle_count is equal to zero. if (idle_count > 0) { if (FyCheckHotKeyStatus(FY_Q) && dirCount % SMOOTHINESS == 0) { curPoseID = NormalAttack1ID; //Tang: FX FX_FileName.clear(); FX_FileName.push_back("AttacKBasic"); FX_FileName.push_back("Lyubu_skill01"); FX_FileName.push_back("LyubuDamege"); GenFX(sID, gFXID, dummyID, actorPos, FX_FileName); //Tang } else if (FyCheckHotKeyStatus(FY_W) && dirCount % SMOOTHINESS == 0) { curPoseID = NormalAttack2ID; //Tang: FX FX_FileName.clear(); FX_FileName.push_back("AttacKBasic"); FX_FileName.push_back("Lyubu_skill02"); FX_FileName.push_back("Lyubu_atk01"); FX_FileName.push_back("MonGotHit_1"); GenFX(sID, gFXID, dummyID, actorPos, FX_FileName); //Tang } else if (FyCheckHotKeyStatus(FY_E) && dirCount % SMOOTHINESS == 0) { curPoseID = HeavyAttack1ID; //Tang: FX FX_FileName.clear(); FX_FileName.push_back("AttacKBasic"); FX_FileName.push_back("Lyubu_skill03"); FX_FileName.push_back("MonGotHit2G04"); //FX_FileName.push_back("Lyubu_atk01 - X"); GenFX(sID, gFXID, dummyID, actorPos, FX_FileName); //Tang } else { curPoseID = runID; //Tang: FX FX_FileName.clear(); FX_FileName.push_back("RunFX"); GenFX(sID, gFXID, dummyID, actorPos, FX_FileName); //Tang } actor.SetCurrentAction(NULL, 0, curPoseID, 5.0f); } else if (curPoseID == runID) { curPoseID = idleID; actor.SetCurrentAction(NULL, 0, curPoseID, 5.0f); } }
/*---------------------- perform the rendering C.Wang 0720, 2006 -----------------------*/ void RenderIt(int skip) { FnViewport vp; // render the whole scene vp.ID(vID); vp.Render3D(cID, TRUE, TRUE); // render the sprites vp.RenderSprites(sID2, FALSE, TRUE); // no clear the background but clear the z buffer FySwapBuffers(); // get camera's data FnCamera camera; camera.ID(cID); FnObject terrain; terrain.ID(tID); float pos[3], fDir[3], uDir[3]; //-----------------HW2 added-----------------------// float actorPos[3], actorfDir[3], actoruDir[3]; FnCharacter actor; actor.ID(actorID); actor.GetPosition(actorPos); actor.GetDirection(actorfDir, actoruDir); camera.GetPosition(pos); camera.GetDirection(fDir, uDir); // Initialze probing ray direction float dir[3], charDir[3]; dir[0] = -fDir[0] / CAMERAPROBE; dir[1] = -fDir[1] / CAMERAPROBE; dir[2] = -1; charDir[0] = actorfDir[0] / ACTORPROBE; charDir[1] = actorfDir[1] / ACTORPROBE; charDir[2] = -1; if ((FyCheckHotKeyStatus(FY_A) || FyCheckHotKeyStatus(FY_D)) && dirCount % SMOOTHINESS == 0) { int tempHeight = pos[2]; pos[2] = actorPos[2]; int theDistance = FyDistance(pos, actorPos); pos[0] = actorPos[0] - theDistance * actorfDir[0]; pos[1] = actorPos[1] - theDistance * actorfDir[1]; pos[2] = tempHeight; fDir[0] = actorfDir[0]; fDir[1] = actorfDir[1]; uDir[0] = fDir[0] / abs(fDir[0] * fDir[1]); uDir[1] = fDir[1] / abs(fDir[0] * fDir[1]); uDir[2] = -abs(uDir[0] * fDir[0] + uDir[1] * fDir[1]) / fDir[2]; } if ((FyCheckHotKeyStatus(FY_UP) || FyCheckHotKeyStatus(FY_S)) && dirCount % SMOOTHINESS == 0) { if (pos[2] > actorPos[2] + HEIGHTOFFSET) { pos[2] = actorPos[2]; pos[2] = actorPos[2] + HEIGHTBOUND + HEIGHTOFFSET - FyDistance(pos, actorPos); fDir[0] = actorPos[0] - pos[0]; fDir[1] = actorPos[1] - pos[1]; fDir[2] = -pos[2]; uDir[0] = fDir[0] / abs(fDir[0] * fDir[1]); uDir[1] = fDir[1] / abs(fDir[0] * fDir[1]); uDir[2] = -abs(uDir[0] * fDir[0] + uDir[1] * fDir[1]) / fDir[2]; } else // Reset the up direction { pos[2] = actorPos[2] + HEIGHTOFFSET; fDir[0] = actorfDir[0]; fDir[1] = actorfDir[1]; fDir[2] = 0; uDir[0] = 0; uDir[1] = 0; uDir[2] = 1; } if (FyDistance(pos, actorPos) > LONGDIST) { pos[0] = actorPos[0] - LONGDIST * actorfDir[0]; pos[1] = actorPos[1] - LONGDIST * actorfDir[1]; pos[2] = actorPos[2] + HEIGHTOFFSET; fDir[0] = actorfDir[0]; fDir[1] = actorfDir[1]; fDir[2] = -0.0f; uDir[0] = actoruDir[0]; uDir[1] = actoruDir[1]; uDir[2] = actoruDir[2]; } } if (FyCheckHotKeyStatus(FY_RIGHT) && dirCount % SMOOTHINESS == 0) { actorPos[2] += HEIGHTOFFSET; if (terrain.HitTest(actorPos, charDir) <= 0) { camera.MoveRight(-CAMERASPEED, FALSE, FALSE, 0, FALSE); camera.GetPosition(pos); } fDir[0] = actorPos[0] - pos[0]; fDir[1] = actorPos[1] - pos[1]; fDir[2] = 0.0f; } if (FyCheckHotKeyStatus(FY_LEFT) && dirCount % SMOOTHINESS == 0) { actorPos[2] += HEIGHTOFFSET; if (terrain.HitTest(actorPos, charDir) <= 0) { camera.MoveRight(CAMERASPEED, FALSE, FALSE, 0, FALSE); camera.GetPosition(pos); } fDir[0] = actorPos[0] - pos[0]; fDir[1] = actorPos[1] - pos[1]; fDir[2] = 0.0f; } if (FyCheckHotKeyStatus(FY_DOWN) && dirCount % SMOOTHINESS == 0) { if (FyDistance(pos, actorPos) < SHORTDIST) { if (terrain.HitTest(pos, dir) > 0) { pos[0] = actorPos[0] + SHORTDIST * actorfDir[0]; pos[1] = actorPos[1] + SHORTDIST * actorfDir[1]; pos[2] = actorPos[2] + HEIGHTOFFSET; fDir[0] = -actorfDir[0]; fDir[1] = -actorfDir[1]; fDir[2] = 0.0f; uDir[0] = actoruDir[0]; uDir[1] = actoruDir[1]; uDir[2] = actoruDir[2]; } else { // go back and hit Obstacle : camera look down at the actor pos[2] = actorPos[2]; pos[2] = actorPos[2] + HEIGHTBOUND + HEIGHTOFFSET - FyDistance(pos, actorPos); fDir[0] = actorPos[0] - pos[0]; fDir[1] = actorPos[1] - pos[1]; fDir[2] = -pos[2]; uDir[0] = fDir[0] / abs(fDir[0] * fDir[1]); uDir[1] = fDir[1] / abs(fDir[0] * fDir[1]); uDir[2] = -abs(uDir[0] * fDir[0] + uDir[1] * fDir[1]) / fDir[2]; } } } //-----------------HW2 end-------------------------// if (dirCount % SMOOTHINESS == 0) { camera.SetPosition(pos); camera.SetDirection(fDir, uDir); } // show frame rate 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; } FnText text; text.ID(textID); text.Begin(vID); text.Write(string, 20, 20, 255, 0, 0); char posS[256], fDirS[256], uDirS[256], debug[256]; sprintf(posS, "pos: %8.3f %8.3f %8.3f", pos[0], pos[1], pos[2]); sprintf(fDirS, "facing: %8.3f %8.3f %8.3f", fDir[0], fDir[1], fDir[2]); sprintf(uDirS, "up: %8.3f %8.3f %8.3f", uDir[0], uDir[1], uDir[2]); sprintf(debug, "debug: %d %d %d", LyubuID.level, LyubuID.exp_cur, LyubuID.blood_remain); text.Write(posS, 20, 35, 255, 255, 0); text.Write(fDirS, 20, 50, 255, 255, 0); text.Write(uDirS, 20, 65, 255, 255, 0); text.Write(debug, 20, 90, 255, 255, 0); text.End(); // swap buffer FySwapBuffers(); }
/*------------------------------------------------------------- 30fps timer callback in fixed frame rate for major game loop --------------------------------------------------------------*/ void GameAI(int skip) { // play character pose FnCharacter actor; FnCharacter cur_actor; FnObject terrain; terrain.ID(tID); FnScene scene; scene.ID(sID); LyubuID.actorID = actorID; //Tang: FX float actorPos[3]; vector<char*> FX_FileName; //Tang actor.ID(actorID); //Tang: FX actor.GetPosition(actorPos); //Tang if (curPoseID == runID || curPoseID == idleID) actor.Play(LOOP, (float)skip, FALSE, TRUE); else if (actor.Play(ONCE, (float)skip, FALSE, TRUE) == 0) actor.SetCurrentAction(NULL, 0, idleID, 10.0f); for (int i = 0; i < NUM_OF_BADGUYS; i++) { cur_actor.ID(badguyID[i].actorID); if (badguyID[i].blood_remain > 0) { bool checkMove = MoveToTargetLocation(badguyID[i], LyubuID, badguyID, terrain); if (cur_actor.Play(ONCE, (float)skip, FALSE, TRUE) == 0) { if (checkMove) { ACTIONid CombatIdleID = cur_actor.GetBodyAction(NULL, "Run"); cur_actor.SetCurrentAction(NULL, 0, CombatIdleID); } else { ACTIONid CombatIdleID = cur_actor.GetBodyAction(NULL, "NormalAttack2"); cur_actor.SetCurrentAction(NULL, 0, CombatIdleID); //Tang: FX FX_FileName.clear(); FX_FileName.push_back("HitForRobber"); GenFX(sID, gFXID, dummyID, actorPos, FX_FileName); //Tang } } } } for (int i = 0; i < NUM_OF_BOSS; i++) { cur_actor.ID(BossID[i].actorID); ACTIONid cur_action = cur_actor.GetCurrentAction(NULL, 0); ACTIONid DieID = cur_actor.GetBodyAction(NULL, "Die"); if (cur_action == DieID) cur_actor.Play(ONCE, (float)skip, FALSE, TRUE); else if (BossID[i].blood_remain > 0) { bool checkMove = MoveToTargetLocation(BossID[i], LyubuID, BossID, terrain); if (cur_actor.Play(ONCE, (float)skip, FALSE, TRUE) == 0) { if (checkMove) { ACTIONid CombatIdleID = cur_actor.GetBodyAction(NULL, "Run"); cur_actor.SetCurrentAction(NULL, 0, CombatIdleID); } else { ACTIONid CombatIdleID = cur_actor.GetBodyAction(NULL, "HeavyAttack"); cur_actor.SetCurrentAction(NULL, 0, CombatIdleID); //Tang: FX FX_FileName.clear(); FX_FileName.push_back("HitForRobber"); GenFX(sID, gFXID, dummyID, actorPos, FX_FileName); //Tang } } } } // Camera's position and direction as a standard for character's location setting FnCamera camera; camera.ID(cID); float cameraPos[3], camerafDir[3], camerauDir[3]; camera.GetPosition(cameraPos); // not used camera.GetDirection(camerafDir, camerauDir); float camVertical = camerafDir[2]; camerafDir[2] = 0; // Guaranteed up direction be 1 camerauDir[0] = 0; camerauDir[1] = 0; camerauDir[2] = 1; float dir[3], origin[3], actorfDir[3], actoruDir[3];// origin is the actor's position actor.GetPosition(origin); actor.GetDirection(actorfDir, actoruDir); //Generator location genSpot[0][0] = 2905.724; genSpot[0][1] = -2856.196; genSpot[1][0] = 729.288; genSpot[1][1] = -2472.88; // Bad guys generator for (int i = 0; i < NUM_OF_GENERATOR; i++) { if (!InArea(origin, genSpot[i], generator[i].range)) { generator[i].in = 0; generator[i].double_in = 0; } if (generator[i].in && InArea(origin, genSpot[i], generator[i].range)) { generator[i].double_in = 1; } if (InArea(origin, genSpot[i], generator[i].range)) { generator[i].in = 1; } if (generator[i].in == 1 && generator[i].double_in == 0) generator[i].produce(origin, actoruDir, scene, i, NUM_OF_GENERATOR); } origin[2] = origin[2] + HEIGHTOFFSET; // need an offset to probe the hit dir[0] = actorfDir[0] / ACTORPROBE; dir[1] = actorfDir[1] / ACTORPROBE; dir[2] = -1.0f; ////////////////////////////////////////// // Homework #01 part 1 ////////////////////////////////////////// if (dirCount % SMOOTHINESS != 0) { if ((dirCount + SMOOTHINESS) % SMOOTHINESS < SMOOTHINESS / 2 + 1) { dirCount--; actor.TurnRight(360 / SMOOTHINESS); } else { dirCount++; actor.TurnRight(360 - 360 / SMOOTHINESS); } } if ((FyCheckHotKeyStatus(FY_UP) || FyCheckHotKeyStatus(FY_S)) && dirCount % SMOOTHINESS == 0) { actor.SetDirection(camerafDir, camerauDir); if (terrain.HitTest(origin, dir) > 0) actor.MoveForward(RUNSPEED, FALSE, FALSE, 0, FALSE); } if (FyCheckHotKeyStatus(FY_D) && dirCount % SMOOTHINESS == 0) actor.TurnRight(TURNSPEED); if (FyCheckHotKeyStatus(FY_A) && dirCount % SMOOTHINESS == 0) actor.TurnRight(360 - TURNSPEED); else if (FyCheckHotKeyStatus(FY_RIGHT) && dirCount % SMOOTHINESS == 0) { actorfDir[0] = camerafDir[1]; actorfDir[1] = -camerafDir[0]; actor.SetDirection(actorfDir, actoruDir); if (terrain.HitTest(origin, dir) > 0) { //actor.MoveRight(CALLIBRATION, FALSE, FALSE, 0, FALSE); actor.MoveForward(RUNSPEED / 2, FALSE, FALSE, 0, FALSE); } } else if (FyCheckHotKeyStatus(FY_LEFT) && dirCount % SMOOTHINESS == 0) { actorfDir[0] = -camerafDir[1]; actorfDir[1] = camerafDir[0]; actor.SetDirection(actorfDir, actoruDir); if (terrain.HitTest(origin, dir) > 0) { //actor.MoveRight(CALLIBRATION, FALSE, FALSE, 0, FALSE); actor.MoveForward(RUNSPEED / 2, FALSE, FALSE, 0, FALSE); } } else if (FyCheckHotKeyStatus(FY_DOWN) && dirCount % SMOOTHINESS == 0) { actor.SetDirection(camerafDir, camerauDir); actor.TurnRight(180.0f); if (terrain.HitTest(origin, dir) > 0 && camVertical > MAXCAMANGLE) actor.MoveForward(RUNSPEED, FALSE, FALSE, 0, FALSE); } //Tang: FX if (gFXID != FAILED_ID) { FnGameFXSystem gxS(gFXID); BOOL4 beOK = gxS.Play((float)skip, ONCE); if (!beOK) { FnScene scene(sID); scene.DeleteGameFXSystem(gFXID); gFXID = FAILED_ID; } } //Tang }
/*------------------ movement control -------------------*/ void Movement(BYTE code, BOOL4 value) { ////////////////////////////////////////// // Homework #01 part 2 ////////////////////////////////////////// // note : only hotkey input can trigger this function FnCharacter actor; FnCharacter badguy; float actorPos[3], actorfDir[3], actoruDir[3]; float badguyPos[3], badguyfDir[3], badguyuDir[3]; actor.ID(actorID); actor.GetPosition(actorPos); actor.GetDirection(actorfDir, actoruDir); // 2. use a global idle_count variable to memorize the action status. // (to prevent the "slide" actor bug) if (value) { idle_count++; if (FyCheckHotKeyStatus(FY_Q) && dirCount % SMOOTHINESS == 0 && LyubuID.mana_remain > 0) { actorPos[0] += actorfDir[0] * HATKOFFSET; actorPos[1] += actorfDir[1] * HATKOFFSET; LyubuID.mana_remain = LyubuID.mana_remain - HATKDAMAGE; for (int i = 0; i < NUM_OF_BADGUYS; i++) { badguy.ID(badguyID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < HATKRANGE && badguyID[i].blood_remain > 0) { if (!ActAction(badguyID[i], "Damage1", HATKDAMAGE)) { LyubuID.exp_cur += 50; if (LyubuID.exp_cur >= LyubuID.exp_total){ LyubuID.level++; LyubuID.exp_cur -= LyubuID.exp_total; } } } } for (int i = 0; i < NUM_OF_BOSS; i++) { badguy.ID(BossID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < HATKRANGE && BossID[i].blood_remain > 0) { ActAction(BossID[i], "Donzo", HATKDAMAGE); } } } if (FyCheckHotKeyStatus(FY_W) && dirCount % SMOOTHINESS == 0 && LyubuID.mana_remain > 0) { actorPos[0] += actorfDir[0] * NATK1OFFSET; actorPos[1] += actorfDir[1] * NATK1OFFSET; LyubuID.mana_remain = LyubuID.mana_remain - NATK1DAMAGE; for (int i = 0; i < NUM_OF_BADGUYS; i++) { badguy.ID(badguyID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < NATK1RANGE && badguyID[i].blood_remain > 0) { if (!ActAction(badguyID[i], "Damage2", NATK1DAMAGE)) { LyubuID.exp_cur += 50; if (LyubuID.exp_cur >= LyubuID.exp_total){ LyubuID.level++; LyubuID.exp_cur -= LyubuID.exp_total; } } } } for (int i = 0; i < NUM_OF_BOSS; i++) { badguy.ID(BossID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < NATK1RANGE && BossID[i].blood_remain > 0) { ActAction(BossID[i], "Donzo", NATK1DAMAGE); } } } if (FyCheckHotKeyStatus(FY_E) && dirCount % SMOOTHINESS == 0 && LyubuID.mana_remain > 0) { actorPos[0] += actorfDir[0] * NATK2OFFSET; actorPos[1] += actorfDir[1] * NATK2OFFSET; LyubuID.mana_remain = LyubuID.mana_remain - NATK2DAMAGE; for (int i = 0; i < NUM_OF_BADGUYS; i++) { badguy.ID(badguyID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < NATK2RANGE && badguyID[i].blood_remain > 0) { if (!ActAction(badguyID[i], "Damage2", NATK2DAMAGE)) { LyubuID.exp_cur += 50; if (LyubuID.exp_cur >= LyubuID.exp_total){ LyubuID.level++; LyubuID.exp_cur -= LyubuID.exp_total; } } } } for (int i = 0; i < NUM_OF_BOSS; i++) { badguy.ID(badguyID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < NATK2RANGE && BossID[i].blood_remain > 0) { ActAction(BossID[i], "Donzo", NATK2DAMAGE); } } } if ((FyCheckHotKeyStatus(FY_UP) || FyCheckHotKeyStatus(FY_S)) && dirCount % SMOOTHINESS == 0) { dirCount = 0 - dirState; dirState = 0; } if (FyCheckHotKeyStatus(FY_RIGHT) && dirCount % SMOOTHINESS == 0) { dirCount = SMOOTHINESS / 4 - dirState; dirState = SMOOTHINESS / 4; } if (FyCheckHotKeyStatus(FY_LEFT) && dirCount % SMOOTHINESS == 0) { dirCount = SMOOTHINESS * 3 / 4 - dirState; dirState = SMOOTHINESS * 3 / 4; } if (FyCheckHotKeyStatus(FY_DOWN) && dirCount % SMOOTHINESS == 0) { dirCount = SMOOTHINESS / 2 - dirState; dirState = SMOOTHINESS / 2; } } else { idle_count--; } // 3. the actor is idle when idle_count is equal to zero. if (idle_count > 0) { if (FyCheckHotKeyStatus(FY_Q) && dirCount % SMOOTHINESS == 0 && LyubuID.mana_remain > 0) { curPoseID = NormalAttack1ID; } else if (FyCheckHotKeyStatus(FY_W) && dirCount % SMOOTHINESS == 0 && LyubuID.mana_remain > 0) { curPoseID = NormalAttack2ID; } else if (FyCheckHotKeyStatus(FY_E) && dirCount % SMOOTHINESS == 0 && LyubuID.mana_remain > 0) { curPoseID = HeavyAttack1ID; } else if (!FyCheckHotKeyStatus(FY_T) && !FyCheckHotKeyStatus(FY_M) && !FyCheckHotKeyStatus(FY_Q) && !FyCheckHotKeyStatus(FY_W) && !FyCheckHotKeyStatus(FY_E) ) { curPoseID = runID; } else { curPoseID = idleID; } actor.SetCurrentAction(NULL, 0, curPoseID, 5.0f); } else if (curPoseID == runID) { curPoseID = idleID; actor.SetCurrentAction(NULL, 0, curPoseID, 5.0f); } if (FyCheckHotKeyStatus(FY_T) && picture_count <= 8) { char str_buf[16]; itoa(picture_count, str_buf, 10); string pic_num(str_buf); string picture = "startTalk_" + pic_num + ".png"; char* chr = strdup(picture.c_str()); showPicture(sp, chr, 780, 180, 10, 10); //showPicture parameter : FnSprite ,imageName, size, position free(chr); picture_count++; } else if (FyCheckHotKeyStatus(FY_T) && picture_count == 9){ showPicture(sp, "mission_transparent.png", 580, 580 , 110, 15); picture_count++; } else if (FyCheckHotKeyStatus(FY_T) && picture_count > 9) { showPicture(sp, "", 0, 0, 0, 0); } if (FyCheckHotKeyStatus(FY_M) && missionWindowStatus == FALSE && picture_count > 9) { showPicture(sp, "mission_transparent.png", 580, 580, 110, 15); missionWindowStatus = TRUE; } else if(FyCheckHotKeyStatus(FY_M) && missionWindowStatus == TRUE && picture_count > 9) { showPicture(sp, "", 0, 0, 0, 0); missionWindowStatus = FALSE; } }
/*------------------ the main program C.Wang 1010, 2014 -------------------*/ void FyMain(int argc, char **argv) { // create a new world BOOL4 beOK = FyStartFlyWin32("NTU@2014 Homework #01 - Use Fly2", 0, 0, 1024, 768, FALSE); // setup the data searching paths FySetShaderPath("Data\\NTU6\\Shaders"); FySetModelPath("Data\\NTU6\\Scenes"); FySetTexturePath("Data\\NTU6\\Scenes\\Textures"); FySetScenePath("Data\\NTU6\\Scenes"); // create a viewport vID = FyCreateViewport(0, 0, 1024, 768); FnViewport vp; vp.ID(vID); // create a 3D scene sID = FyCreateScene(10); FnScene scene; scene.ID(sID); // load the scene scene.Load("gameScene02"); scene.SetAmbientLights(1.0f, 1.0f, 1.0f, 0.6f, 0.6f, 0.6f); // load the terrain tID = scene.CreateObject(OBJECT); FnObject terrain; terrain.ID(tID); BOOL beOK1 = terrain.Load("terrain"); terrain.Show(FALSE); // set terrain environment terrainRoomID = scene.CreateRoom(SIMPLE_ROOM, 10); FnRoom room; room.ID(terrainRoomID); room.AddObject(tID); // load the character FySetModelPath("Data\\NTU6\\Characters"); FySetTexturePath("Data\\NTU6\\Characters"); FySetCharacterPath("Data\\NTU6\\Characters"); actorID = scene.LoadCharacter("Lyubu2"); // put the character on terrain float pos[3], fDir[3], uDir[3]; FnCharacter actor; actor.ID(actorID); pos[0] = 3569.0f; pos[1] = -3208.0f; pos[2] = 1000.0f; fDir[0] = 1.0f; fDir[1] = -1.0f; fDir[2] = 0.0f; uDir[0] = 0.0f; uDir[1] = 0.0f; uDir[2] = 1.0f; actor.SetDirection(fDir, uDir); actor.SetTerrainRoom(terrainRoomID, 10.0f); beOK = actor.PutOnTerrain(pos); // Get two character actions pre-defined at Lyubu2 idleID = actor.GetBodyAction(NULL, "Idle"); runID = actor.GetBodyAction(NULL, "Run"); // set the character to idle action curPoseID = idleID; actor.SetCurrentAction(NULL, 0, curPoseID); actor.Play(START, 0.0f, FALSE, TRUE); actor.TurnRight(90.0f); // translate the camera cID = scene.CreateObject(CAMERA); FnCamera camera; camera.ID(cID); camera.SetNearPlane(5.0f); camera.SetFarPlane(100000.0f); // set camera initial position and orientation pos[0] = 4069.0f; pos[1] = -3208.0f; pos[2] = 93.046f; fDir[0] = -500.0f; fDir[1] = -0.0f; fDir[2] = -0.0f; uDir[0] = -0.116f; uDir[1] = -0.031f; uDir[2] = 0.993f; camera.SetPosition(pos); camera.SetDirection(fDir, uDir); float mainLightPos[3] = { -4579.0, -714.0, 15530.0 }; float mainLightFDir[3] = { 0.276, 0.0, -0.961 }; float mainLightUDir[3] = { 0.961, 0.026, 0.276 }; FnLight lgt; lgt.ID(scene.CreateObject(LIGHT)); lgt.Translate(mainLightPos[0], mainLightPos[1], mainLightPos[2], REPLACE); lgt.SetDirection(mainLightFDir, mainLightUDir); lgt.SetLightType(PARALLEL_LIGHT); lgt.SetColor(1.0f, 1.0f, 1.0f); lgt.SetName("MainLight"); lgt.SetIntensity(0.4f); // create a text object for displaying messages on screen textID = FyCreateText("Trebuchet MS", 18, FALSE, FALSE); // set Hotkeys FyDefineHotKey(FY_ESCAPE, QuitGame, FALSE); // escape for quiting the game FyDefineHotKey(FY_UP, Movement, FALSE); // Up for moving forward FyDefineHotKey(FY_RIGHT, Movement, FALSE); // Right for turning right FyDefineHotKey(FY_LEFT, Movement, FALSE); // Left for turning left // define some mouse functions if (!IsCameraFollow) { FyBindMouseFunction(LEFT_MOUSE, InitPivot, PivotCam, NULL, NULL); FyBindMouseFunction(MIDDLE_MOUSE, InitZoom, ZoomCam, NULL, NULL); FyBindMouseFunction(RIGHT_MOUSE, InitMove, MoveCam, NULL, NULL); } else { FyBindMouseFunction(LEFT_MOUSE, InitZoom2, ZoomCam2, NULL, NULL); FyBindMouseFunction(RIGHT_MOUSE, NULL, RotateCam, NULL, NULL); } // bind timers, frame rate = 30 fps FyBindTimer(0, 30.0f, GameAI, TRUE); FyBindTimer(1, 30.0f, RenderIt, TRUE); // invoke the system FyInvokeFly(TRUE); }