コード例 #1
0
/* ------------------
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);
	}
}
コード例 #2
0
/*------------------
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);
	}
	// ....
}
コード例 #3
0
ファイル: hw01_Tang.cpp プロジェクト: dragonkiss81/Fly2_API
/*------------------
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);
	}


}
コード例 #4
0
ファイル: hw01_Tang.cpp プロジェクト: dragonkiss81/Fly2_API
/*-------------------------------------------------------------
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
}
コード例 #5
0
ファイル: hw01_me.cpp プロジェクト: dragonkiss81/Fly2_API
/*------------------
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;
	}
}
コード例 #6
0
/*------------------
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);
}