2011-09-27 35 views
2

我決定我的最後一年C#項目將是'Monster Dash'類似的遊戲,我會用C#和XNA開發它,它將成爲PC的目標,我是使用Microsoft Visual Studio 2010和XNA Game Studio 4.0。遊戲將是2D遊戲,而不是3D。創建AC#&XNA'怪物短跑'就像遊戲

在發展過程中的思考,有幾個問題上升:

首先,我需要創建一個「排序中的平臺」,玩家將在運行並在它們之間具有孔和縫隙(這將隨機出現),我不知道該怎麼做!我發現的唯一一個可能的解釋是,這是一個示例代碼,名爲'Platformer',來自微軟,我不明白(這可能是很好的一個人可以解釋他們在那裏使用的方法,或更好/更簡單的方法)。我需要玩家跳轉(爲了避免間隙和漏洞,並繼續運行),我不知道如何處理該功能的物理部分,如果有人可以提供一種處理方法,或者指向一段有用的代碼。

謝謝你,iLyrical。

+0

這個問題可能產生的http://gamedev.stackexchange.com/ –

+0

爲什麼不更好的答案從簡單的事情開始?嘗試創建類似Monster Dash的遊戲:[Canabalt](http://www.adamatomic.com/canabalt/)。爲了使事情更容易,其iOS端口的源代碼已公開發布(https://github.com/ericjohnson/canabalt-ios)。 – Elideb

+0

哇,謝謝!我不知道它的代碼是公開發布的!我想過Canabalt之類的東西,但需要代碼......我一定會檢查一下! – Itamar

回答

3

毫無疑問,僅僅因爲它是二維平臺,平臺遊戲並不是一件容易的事。所以我建議你使用任何第三方庫的幫助,使用XNA和C#已經是一個很好的起點。接下來的事情是,這是你的問題進入的地方,如何解決物理?你可以自己寫,這是一個很好的學習經歷,但如果時間很關鍵,這可能會很困難和令人沮喪。所以我建議使用第三方庫,如Farseer。也許this小教程派上用場。

但是,這絕對不是一件容易的事。根據你的技能,我當然不知道,我會建議一個更簡單的遊戲,如果它一定是一款遊戲。遊戲是你可以想象的最困難的編程任務。同時處理多個子系統(圖形,AI,聲音,輸入,物理);讓他們一起工作已經是一項艱鉅的任務,但擁有內容(Sprites,Wavs,Music,Menu gfx等)是另一個獨一無二的野獸。

最後的建議是,如果你不瞭解Platformer代碼;再讀一次,再一次;如果你不理解某些部分,直到你理解它們。如果你對C#有問題,請先學習它,並永不停止學習它。還請閱讀許多有關遊戲的教程和代碼。瞭解其他人如何以及爲什麼以他們的方式解決問題很重要。

+0

+1「如果你不懂平臺代碼,請再讀一遍......」MS樣本非常非常好。 –

2

微軟網站上的一些成熟的例子是一個很好的開始。

基於這個例子,我做了一些類似的事情。它是一個基於平鋪的方法,你有一個2維的「瓦片」列表(瓦片列表列表>>)爲瓦片設置一個靜態尺寸(比如說16x16像素),那麼這只是一個循環遍歷列表的問題繪製/執行碰撞檢測等等。只需要思考一下,如果我想到它,我可以稍後發佈一些代碼,如果你想,它在家中。

我通常接近運動物理的一個簡單方法就是使用3個Vector2對象,一個用於位置,一個用於速度,另一個用於加速。如果您熟悉簡單物理學,position = velocity * deltaTime,velocity = acceleration * deltaTime。當玩家跳躍,你只是增加了球員的加速度,然後在更新循環,計算位置:

// On Jump 
player.acceleration += someConstant 

// On Update 
this.velocity += this.acceleration * deltaTime 
this.position += this.velocity * deltaTime 

同樣,我將在稍後發佈一些實際的代碼。

希望這有助於讓你開始

編輯:

下面是一些移動代碼

public override void Update(GameTime gameTime) 
    { 
     float deltaTime = ((float)gameTime.ElapsedGameTime.Milliseconds)/1000f; 
     currentState = Keyboard.GetState(); 

     if (canMove) 
     { 

      // Input 
      if (currentState.IsKeyDown(Keys.Left)) 
       Acceleration.X -= 1000; 
      if (currentState.IsKeyDown(Keys.Right)) 
       Acceleration.X += 1000; 
      if (!airbourne && currentState.IsKeyDown(Keys.Space) && previousState.IsKeyUp(Keys.Space)) 
      { 
       Acceleration.Y -= 25000; 
       airbourne = true; 
      } 

      // Friction in X to limit sliding 
      if (Velocity.X > 0) 
      { 
       Velocity.X -= X_FRICTION; 
       if (Velocity.X < 0) 
        Velocity.X = 0; 
      } 
      else 
      { 
       Velocity.X += X_FRICTION; 
       if (Velocity.X > 0) 
        Velocity.X = 0; 
      } 

      // Gravity 
      Acceleration.Y += 500; 
     } 

     Velocity += Acceleration * deltaTime; 
     if (Velocity.X > 0) 
      Velocity.X += speedMod; 
     else if (Velocity.X < 0) 
      Velocity.X -= speedMod; 

     // Move and check collisions in X 
     Position.X += Velocity.X * deltaTime; 
     if (game.checkCollisions(boundingBox())) 
     { 
      Position.X -= Velocity.X * deltaTime; 
      Velocity.X = 0; 
     } 

     // Move and check collisions in Y 
     Position.Y += Velocity.Y * deltaTime; 
     movingUp = Velocity.Y < 0; 
     if (game.checkCollisions(boundingBox())) 
     { 
      // If moving downwards, player not airbourne 
      if (Velocity.Y >= 0) 
      { 
       airbourne = false; 
       Position.Y = game.getCollisionDistance(boundingBox()) - 32; 
      } 
      else 
      { 
       Position.Y = game.getCollisionDistance(boundingBox()) + 32; 
      } 

      Velocity.Y = 0; 
     } 
     else 
      airbourne = true; 

     movingUp = false; 

     // Reset acceleration 
     Acceleration = Vector2.Zero; 
     previousState = currentState; 

    }