Just My Life & My Work

[TheFly] 人物八方向移動

鍵盤上只有四個方向,所以人物只能上、下、左、右移動?嘿~那只是在只按一個鍵時的限制,若同時按兩個鍵就可以再多四個方向!於是就多了右上、左上、右下、左下這四個方向。

用TheFly來設計時,相當方便,因為只要確定同時按了哪些鍵,就可以讓actor往哪個方向移動,用我所設計的方法圖來解釋:

演算法流程是橙色箭頭上→下→右→左。左方框是只有按一個鍵時,右方框是同時按兩個鍵時,用紅色圈出來的是設計右上、左上、右下、左下這四個方向。如果是同時按三個鍵,會有什麼效果呢?人物會在第三個鍵按下時移動速度變慢。例如我往右上(按鍵為上+右)走,這時候我按下,人物移動速度變慢。

人物的面向(facing)有八個向量,分別以x和y來計量,單純只有上下左右的向量相當簡單,若以右上、左上、右下、左下這四個方向來考量,x和y都是0.71單位,原因是要讓x向量加y向量的絕對值(長度)為1,就跟單純只有上下左右一樣的單位向量囉~

if (FyCheckHotKeyStatus(FY_UP)&&!FyCheckHotKeyStatus(FY_DOWN)){// first up
	if(FyCheckHotKeyStatus(FY_RIGHT)||FyCheckHotKeyStatus(FY_LEFT)){
		if (FyCheckHotKeyStatus(FY_RIGHT)){// second right
			if(a_fDir[0]!=0.71||a_fDir[1]!=0.71){
				a_fDir[0]=0.71;	a_fDir[1]=0.71;
				actor->SetDirection(a_fDir,a_uDir);
			}
			actor->Play(0, LOOP, skip, TRUE, TRUE);
			actor->MoveForward(distance, TRUE, FALSE, 0.0f, TRUE);
		}
		if (FyCheckHotKeyStatus(FY_LEFT)){// second left
			if(a_fDir[0]!=-0.71||a_fDir[1]!=0.71){
				a_fDir[0]=-0.71;	a_fDir[1]=0.71;
				actor->SetDirection(a_fDir,a_uDir);
			}
			actor->Play(0, LOOP, skip, TRUE, TRUE);
			actor->MoveForward(distance, TRUE, FALSE, 0.0f, TRUE);
		}
	}
	else{
		if(a_fDir[1]!=1.0){
			a_fDir[0]=0.0;	a_fDir[1]=1.0;
			actor->SetDirection(a_fDir,a_uDir);
			actor->MakeCurrentAction(0, NULL, curPoseID);
		}
		actor->Play(0, LOOP, skip, TRUE, TRUE);
		actor->MoveForward(distance, TRUE, FALSE, 0.0f, TRUE);
	}
}
if (FyCheckHotKeyStatus(FY_DOWN)&&!FyCheckHotKeyStatus(FY_UP)){// first down
	if(FyCheckHotKeyStatus(FY_RIGHT)||FyCheckHotKeyStatus(FY_LEFT)){
		if (FyCheckHotKeyStatus(FY_RIGHT)){// second right
			if(a_fDir[0]!=0.71||a_fDir[1]!=-0.71){
				a_fDir[0]=0.71;	a_fDir[1]=-0.71;
				actor->SetDirection(a_fDir,a_uDir);
			}
			actor->Play(0, LOOP, skip, TRUE, TRUE);
			actor->MoveForward(distance, TRUE, FALSE, 0.0f, TRUE);
		}
		if (FyCheckHotKeyStatus(FY_LEFT)){// second left
			if(a_fDir[0]!=-0.71||a_fDir[1]!=-0.71){
				a_fDir[0]=-0.71;	a_fDir[1]=-0.71;
				actor->SetDirection(a_fDir,a_uDir);
			}
			actor->Play(0, LOOP, skip, TRUE, TRUE);
			actor->MoveForward(distance, TRUE, FALSE, 0.0f, TRUE);
		}
	}
	else{
		if(a_fDir[1]!=-1.0){
			a_fDir[0]=0.0;	a_fDir[1]=-1.0;
			actor->SetDirection(a_fDir,a_uDir);
			actor->MakeCurrentAction(0, NULL, curPoseID);
		}
		actor->Play(0, LOOP, skip, TRUE, TRUE);
		actor->MoveForward(distance, TRUE, FALSE, 0.0f, TRUE);
	}
}
if (FyCheckHotKeyStatus(FY_RIGHT)&&!FyCheckHotKeyStatus(FY_UP)&&!FyCheckHotKeyStatus(FY_DOWN)&&!FyCheckHotKeyStatus(FY_LEFT)){// right
	if(a_fDir[0]!=1.0){
		a_fDir[0]=1.0;	a_fDir[1]=0.0;
		actor->SetDirection(a_fDir,a_uDir);
		actor->MakeCurrentAction(0, NULL, curPoseID);
	}
	actor->Play(0, LOOP, skip, TRUE, TRUE);
	actor->MoveForward(distance, TRUE, FALSE, 0.0f, TRUE);
}
if (FyCheckHotKeyStatus(FY_LEFT)&&!FyCheckHotKeyStatus(FY_UP)&&!FyCheckHotKeyStatus(FY_DOWN)&&!FyCheckHotKeyStatus(FY_RIGHT)){// left
	if(a_fDir[0]!=-1.0){
		a_fDir[0]=-1.0;	a_fDir[1]=0.0;
		actor->SetDirection(a_fDir,a_uDir);
		actor->MakeCurrentAction(0, NULL, curPoseID);
	}
	actor->Play(0, LOOP, skip, TRUE, TRUE);
	actor->MoveForward(distance, TRUE, FALSE, 0.0f, TRUE);
}

看程式碼也滿容易瞭解呢!

隨意留個言吧:)~

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

標籤雲

%d 位部落客按了讚: