2011-02-17 164 views
4

我對C#和XNA很熟悉,並且很好地推進(就像我可以遵循一個tutoral一樣,但是大多數創建它自己仍然真的很難) 。現在我一直在試圖弄清楚如何做到這一點「簡單」的事情。我已經搜索了一些頁面和頁面的問題,因爲我確信有人問過這個問題,但截至目前爲止(200多個問題)我沒有找到我需要的東西。 (請原諒我的拼寫錯誤)鼠標移動:點擊精靈「散步」點擊

這裏的想法,它將成爲塔防遊戲;現在我正在研究裸骨基礎知識。我有我的小精靈,他會用鍵盤輸入來移動,現在我想點擊屏幕上的某個地方,讓他「走」到那一點。只有我迷失在邏輯上。我可以點擊,他會跳到那裏

if(aMouse.LeftButton == ButtonState.Pressed) { Position.X = aMouse.X; Position.Y = aMouse.Y; }

有人可以指點我嗎?或者這個問題的答案在哪裏?或者給我一些例子?我會拿任何東西。

從我讀過的其他鼠標輸入,我想我會需要某種循環(布爾也許?),將移動精靈在一個方向,將不得不運行檢查,看看是否他已經到了那個地步了。但在鼠標點擊並創建該循環後獲取該點,運行檢查......我很無聊。

在此先感謝您的幫助!

+1

你有兩個問題需要解決。人們正在回答其中的一個。另一個是如果你的方式有障礙,該怎麼做。見到http://en.wikipedia.org/wiki/Pathfinding一旦你到達那一點。 – 2011-02-17 05:38:55

回答

2

您需要添加一些實例變量:

Point2D targetPos; 

而且一些常量:

const Point2D speed; 

,當你通過更新運行()循環,通過將速度矢量更新當前位置它(按照正確的方向),直到你處於目標位置的預定義閾值內(通常閾值是從速度矢量計算的 - 如果從當前位置到目標位置的距離小於速度的長度矢量,那麼你就是在你的位置)。在這種情況下使用bool會很好。當您單擊鼠標時將另一個實例變量(移動)設置爲true,並且一旦到達目標位置,將移動設置爲false。

+0

謝謝你的迴應!我需要進一步瞭解Point2D並定義閾值。 – Steph 2011-02-17 05:41:15

+0

沒問題。我的意思是邏輯門檻。它只是檢查您的當前位置是否在距目標位置一定距離(閾值)內。 – 2011-02-17 05:59:13

1

我假設你有三樣東西:

  1. 當前位置
  2. 所需位置
  3. 速度移動的每個「遊戲滴答」 //不知道遊戲蜱是什麼?找出!

您正在尋找這樣

enter image description here

// dx, dy are delta x and delta y. It's how far in each direction 
// the player must travel 
// note, I fixed a typo where they were desired - desired... should be 
// desired - current, as they are now 
float dx = desiredX - currentX; 
float dy = desiredY - currentY; 

// d uses the pythagorean theorum to find the distance between current and desired 
float d = sqrt(dx*dx + dy*dy); 
// fac is how far along that line between desired and current will you move 
float fac = d/speed; 

// mx is the component of the dx line proportional to the size of fac : d 
// which means it's how far in the x direction you'll move 
float mx = dx * fac; 
float my = dy * fac; 

// the new postition is the old position plus the move value 
float newPositionX = dx + mx; 
float newPositionY = dy + my; 
+0

感謝您的回覆!我有當前的位置和速度,我希望所需的位置來自鼠標的用戶輸入。我不知道如何從鼠標用戶輸入中獲得。我得到了picuter,但是我不會在這裏瞭解你的代碼和數學......(我對這一切真的很陌生)在這個例子中,你設置了分散的位置,然後從當前的速度轉移到期望的分解速度?爲什麼dx the desiredx會使用desiredx? sqrt和fac是什麼?抱歉!如果你不想要的話,你不需要把它全部都放下!我想明白,但我知道我在這裏沒有深度。 – Steph 2011-02-17 05:37:25

2

人們在一個非常低的水平回答你的問題。有時它有助於在更高的層面上考慮問題。

你需要的是一種狀態管理。花哨的計算機科學術語是一個有限狀態機。但不要打擾現在看。它起初相當乾燥和困惑:)

你的角色目前有一個狀態 - 「站立」。您需要添加並處理「步行到目的地」狀態。

從我讀過的其他移動鼠標輸入,我想我需要某種形式的循環

的你需要一個循環,稱爲遊戲循環。如果你使用XNA,你已經有了一個。但是你在正確的軌道上。

每次通過遊戲循環時,都應該處理當前狀態,並檢查所謂的狀態轉換。那就是當你將你的世界中的某些東西從一個狀態改變到另一個狀態時。例如,當你點擊鼠標時,你希望這個人開始移動。

在您的遊戲循環中,檢查是否發生了鼠標點擊。如果確實如此,則設置一些數據(移動到哪裏),並通過將他的狀態設置爲「步行到目的地」來讓他開始步行。下一次更新,您將改爲處理該狀態。

當你的角色處於「步行到desintation」狀態時,你需要根據自上次遊戲更新以來所經過的時間更新自己的位置。在XNA中,這是爲你計算的。如果你不使用XNA,那麼你必須檢查自己。您可能可以使用類似Stopwatch類的內容,並檢查Elapsed字段。

如果角色在目的地,您需要將其切換回「站立」狀態。

如果您再收到一次鼠標點擊,如果您希望「步行到目的地」狀態關注它,則取決於您。如果您確實注意了它,則可以設置與從「站立」狀態轉換時相同的數據類型。

所以,你需要這些變量:

  • 定時器,找出自上次遊戲循環所經過的時間(XNA把它交給你)
  • 當前玩家狀態(可能的enum
  • 當前玩家位置(矢量)
  • 播放器(浮子,可能),在單位測量的步行速度每秒(或毫秒)
  • 數據爲「行走到desti國家」的狀態 - 目標位置(另一矢量)
  • 與用戶輸入相關的數據(自上次更新發生的鼠標事件,這些點擊的位置,等等)

字符特定的數據將是不同你遊戲中的每個角色,所以你需要每個角色的新副本。你可能想把它放在一個班級裏。其餘的部分更全球化,所以你可以保持它的獨立性,或使其成爲你的遊戲,遊戲循環,輸入類等的一部分(然而你選擇組織它)。

我不會介紹矢量數學如何真正計算部分運動的東西,因爲其他人已經覆蓋了這一點。沒有意義重複這些答案。它基本歸結爲在當前位置和目標位置之間創建矢量,並將其與您的步行速度相乘/分割(將其切割爲單次更新中移動的距離)。

0

我發現這個代碼是最有用的......此外,我添加了一對額外的幾行以防止發生某些情況。例如,有些時候方向是0.83,速度可能已經被諸如地形/天氣等等的遊戲因素所改變......如果速度低於1,那麼精靈可能根本不會移動,甚至不會沿錯誤的方向移動!

if (Vector2.Distance(Position, TargetPosition) > 2.0f) 
{ 
    velocity = Vector2.Subtract(TargetPosition, Position); 
    velocity.Normalize(); 
    /// Now no matter which direction we are going we are always moving @ sprite.Speed 
    /// at velocity or speed below 1 - problems occur where the unit may not move at all!! 
    if(current_Speed < 1) 
    { 
     Vector2 temp = (velocity * 10) * (current_Speed * 10); 
     Position += temp/10; 
    } 
    else 
    { 
     Vector2 temp = velocity * current_Speed; 
     Position += temp; 
    } 
    //convert to int to render sprite to pixel perfect.. 
    Position = new Vector2((int)Position.X, (int)Position.Y); 
}