2011-03-05 162 views
1

我想在XNA中製作基於2D瓷磚的自上而下的遊戲。它是16 x 16瓦片,每個瓦片是25個像素。基於XNA瓷磚的移動

我有一個字符精靈開始於(0,0)第一個瓷磚,我試圖使它可以使用鍵盤從瓷磚到瓷磚。所以在Update方法中,當按下箭頭鍵時,我嘗試在位置向量的x或y上加或減25。它在移動時似乎與瓷磚對齊,但它一次只移動4-5個瓷磚,而不是一個瓷磚。我曾嘗試將它與gameTime.TotalGameTime.TotalSeconds相乘,但似乎沒有幫助。

我是使用XNA的新手。有沒有人有任何教程或可以幫助如何計算運動?提前致謝。

回答

8

如果你只是檢查IsKeyDown每一幀,它會說它是在每個幀下來,它被按下。在每秒60幀的情況下,按下一個按鍵會導致它在幾幀中處於關閉狀態。因此,在每一幀你都在移動你的角色!當你放開鑰匙時 - 他會移動幾個方塊。

如果要檢測每個按鍵(進入「向下」狀態的關鍵),你需要的東西是這樣的:

KeyboardState keyboardState, lastKeyboardState; 

bool KeyPressed(Keys key) 
{ 
    return keyboardState.IsKeyDown(key) && lastKeyboardState.IsKeyUp(key); 
} 

override void Update(GameTime gameTime) 
{ 
    lastKeyboardState = keyboardState; 
    keyboardState = Keyboard.GetState(); 

    if(KeyPressed(Keys.Right)) { /* do stuff... */ } 
} 

但是,如果你想添加一個「重複效應」按住時關鍵(如在打字會發生什麼),你需要統計的時​​間 - 是這樣的:

float keyRepeatTime; 
const float keyRepeatDelay = 0.5f; // repeat rate 

override void Update(GameTime gameTime) 
{ 
    lastKeyboardState = keyboardState; 
    keyboardState = Keyboard.GetState(); 

    float seconds = (float)gameTime.ElapsedGameTime.TotalSeconds; 

    if(keyboardState.IsKeyDown(Keys.Right)) 
    { 
     if(lastKeyboardState.IsKeyUp(Keys.Right) || keyRepeatTime < 0) 
     { 
      keyRepeatTime = keyRepeatDelay; 

      // do stuff... 
     } 
     else 
      keyRepeatTime -= seconds; 
    } 
} 
0

當您使用IsKeyDown,你不必使用定時器。

public void HandleInput(KeyboardState keyState) 
{ 
    if (keyState.IsKeyDown(Keys.Left)) 
    { 
     //go left... 
    } 
} 
+0

他正在執行基於網格/瓦片的移動,而不是連續的。 – JMRboosties 2012-04-27 20:53:50