鍵盤上只有四個方向,所以人物只能上、下、左、右移動?嘿~那只是在只按一個鍵時的限制,若同時按兩個鍵就可以再多四個方向!於是就多了右上、左上、右下、左下這四個方向。
用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);
}
看程式碼也滿容易瞭解呢!


隨意留個言吧:)~