斜向移動 (更新)

2009年2月13日 星期五

八方向移動能夠讓一款ARPG變得更有潛力,雖然如今類比搖桿已經出現讓玩家可以360度的選擇移動方向,但是多僅侷限於3D的美工素材,對於製作PC的同人遊戲而言8方向似乎已經夠用了。

在製作遊戲的時候,平衡性非常重要,很多作者在製作系統的時候必須考慮移動所帶來的效應。好比玩家在攻擊或逃脫敵群的時候移動上的速度需要有所變化。八方向的移動雖然看似簡單,但卻是不可輕視的細節。

當移動的時候,左右橫向座標變化4單位、上下垂直座標變化四單位,那麼如果同時上下左右搭配呢?假設同時按下上與右,那麼移動長度將是4√2單位。如此一來,斜向移動的速度將會比四方向移動時增加0.4倍左右,這是不合理的。(√2約1.414)

我將使用GM來做範例,但是效果是一樣的。
Event:Keyboard
Action:Code
if (keyboard_key==vk_left)
{left();}
if (keyboard_key==vk_right)
{right();}
if (keyboard_key==vk_up)
{up();}
if (keyboard_key==vk_down)
{down();}

首先這裡僅有四方向移動,倘若使用keyboard_check()這個函數,那麼在本代碼中就可完成斜向移動,但是移動速度仍是不均等的。在程式碼當中,keyboard_key是限定單行,我們先判定keyboard_key此變數接著呼叫了自訂的函數,分別是up、left、down、right。

然而這麼一來似乎會出現問題,就是在斜向移動後會無法繼續進行四方向移動。

if (keyboard_check(vk_left))
{
left();
}
else if (keyboard_check(vk_right))
{
right();
}
else if (keyboard_check(vk_up))
{
up();
}
else if (keyboard_check(vk_down))
{
down();
}


不過如各位所見的,我同樣使用keyboard_check()仍可以進行單鍵判定,原因是連用if跟單組if的差別。我常誤以為連用if以及else if是同樣的效果,但其實不盡然。至少在目前為止是如此,使用else if 的話只會進行「一組」,但連用四次 if 會進行「四組」,雖然同樣都是判定四次,但是概念上仍有所差別。為了讓分歧路線只進入單一,不可連用if,尤其是在按鍵判定上。

假設我們按了上鍵。

函式:up()
if (keyboard_check(vk_left))
{
x-=4;
y-=4;
player.direction=135;
}
else if (keyboard_check(vk_right))
{
x+=4;
y-=4;
player.direction=45;
}
else if(keyboard_check(vk_up))
{
y-=5.6;
player.direction=90;
}

可以看到的是,在這裡我用了if判定式。基於keyboard_check()函數可以多按鍵並行,程式已經運行到了「上」的程式中,在此又判定了是否有按下左右鍵,如果有便進入斜向移動中,如果沒有就僅在y座標向上5.6像素。

接著我們將焦點轉進上右鍵同時按下的狀況,
x+=4;
y-=4;
這時x與y同時移動4單位,如此一來,斜向移動便與四向移動的速度接近許多,不再有斜向移動破格的狀態。

雖然這裡僅提了其中兩個函數,但是道理是完全相同。
由於程式碼重複了非常多,我相信一定有網友比在下我有更好的優化代碼,如果有指教或是疑問,歡迎各位提出。

  © Blogger templates Newspaper by Ourblogtemplates.com 2008

Back to TOP