/* ------------------ 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); } // .... }
/*------------------ 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); } }
/*------------------------------------------------------------- 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); }