2011-12-12 46 views
1

我正在爲我的XNA課程中的最終項目製作遊戲,這將是一個FPS。爲了生成敵人,我想我可以寫一個導入模型的類,並定義「敵人」的隨機大小和位置,以及他的動作和動作。然後我會從我的Game.cs文件中調用該類。不過,我在這方面遇到了一些困難。我正在做一個遊戲,可以/我應該創建一個「敵人」類嗎?

我的主要問題是,我不確定在遊戲文件中的哪裏/如何調用敵人(這是一個雪人)。

下面是我對Snowmen.cs(敵人)類

public class Snowmen : Microsoft.Xna.Framework.Game 
{ 
    private Camera cam = new Camera(); 

    Model snowMan; 
    Matrix[] snowManMatrix; 

    protected override void LoadContent() 
    { 
     snowMan = Content.Load<Model>("Models\\snowman"); 
     snowManMatrix = new Matrix[ snowMan.Bones.Count ]; 
     snowMan.CopyAbsoluteBoneTransformsTo(snowManMatrix); 
    } 

    public void DrawSnowMan(Model model, GameTime gameTime) 
    { 
     foreach (ModelMesh mesh in model.Meshes) 
     { 
      Matrix world, scale, translation; 

      scale = Matrix.CreateScale(0.02f, 0.02f, 0.02f); 
      translation = Matrix.CreateScale(0.0f, 0.7f, -4.0f); 

      world = scale * translation; 

     foreach (BasicEffect effect in mesh.Effects) 
     { 
      effect.World = snowManMatrix[mesh.ParentBone.Index] * world; 

      effect.View = cam.viewMatrix; 
      effect.Projection = cam.projectionMatrix; 
      effect.EnableDefaultLighting(); 
     } 

      mesh.Draw(); 
     } 
    } 

    protected override void Draw(GameTime gameTime) 
    { 
     DrawSnowMan(snowMan, gameTime); 
     base.Draw(gameTime); 
    } 
} 

截至目前,我Game1.cs文件是一個功能天空盒,還包含LoadContent()Draw()方法。敵人階級完全沒有必要嗎?

+3

你爲什麼繼承Game而不是GameObject? – asawyer

+0

你班上有多少雪人呢? 1?那麼它應該是'雪人',單數。 – MPelletier

+0

@asawyer我只是一種新的這一點,並沒有意識到不同之處。如果我繼承到GameObject,則會出現錯誤,指出「內容」在當前上下文中不存在。我也得到'對象'不包含'Draw'的定義。我看到GameObject更有意義,但我將如何實現? – Kyle

回答

0

如果你只有雪人,那就好了。當添加其他敵人或類似對象時,添加一個Parent類(如Enemy)在結構上是有用的,它允許您集中您的代碼並減少/消除重複的代碼。

+0

謝謝布倫特,這正是我所希望的。我打算採取Asawyer的和你的建議,並繼續堵塞 – Kyle

1

你可能會想使用DrawableGameObject

public class Snowman : DrawableGameObject 
{ 
    private Camera cam = new Camera(); 

    //Model snowMan; 
    //Matrix[] snowManMatrix; 

    public Model snowMan {get;set;}; 
    public Matrix[] snowManMatrix{get;set;}; 

    protected override void LoadContent() 
    { 
     //snowMan = Content.Load<Model>("Models\\snowman"); 
     snowManMatrix = new Matrix[ snowMan.Bones.Count ]; 
     snowMan.CopyAbsoluteBoneTransformsTo(snowManMatrix); 
    } 

    public void DrawSnowMan(Model model, GameTime gameTime) 
    { 
     foreach (ModelMesh mesh in model.Meshes) 
     { 
      Matrix world, scale, translation; 

      scale = Matrix.CreateScale(0.02f, 0.02f, 0.02f); 
      translation = Matrix.CreateScale(0.0f, 0.7f, -4.0f); 

      world = scale * translation; 

     foreach (BasicEffect effect in mesh.Effects) 
     { 
      effect.World = snowManMatrix[mesh.ParentBone.Index] * world; 

      effect.View = cam.viewMatrix; 
      effect.Projection = cam.projectionMatrix; 
      effect.EnableDefaultLighting(); 
     } 

      mesh.Draw(); 
     } 
    } 

    protected override void Draw(GameTime gameTime) 
    { 
     DrawSnowMan(snowMan, gameTime); 
    } 
} 

在Game1.cs

初始化

Snowman snowDude= new Snowman(); 
    Components.Add(snowDude); 

並移動

//snowDude = Content.Load<Model>("Models\\snowman"); 
    snowDude.snowMan = Content.Load<Model>("Models\\snowman"); 

加入Game1的LoadContent

添加到組件意味着snowDude的更新和繪製在Game1's時被調用。儘管如此,我並不是100%的。我相信負載內容也應該被調用,但我認爲這是更好的做法(至少在你學習的時候)將你所有的聲音/動畫/精靈導入同一個地方(在你的主文件中),以便你確切地知道什麼是被叫和何時。

而不是Components.Add(snowDude);

您可以在Game1的繪圖方法中調用snowDude.Draw(遊戲時間)。和Game1的Update方法中的snowDude.Update()。

否則我同意布倫特。如果只有雪人,那麼你應該罰款,只有一類,但如果你開始添加更多的會有很多重疊的,所以使敵人類

public class Enemy: DrawableGameObject{} 

和不斷變化的雪人

public class SnowMan:Enemy{} 

應該是合適的。

+0

哇謝謝你這麼多Reafexus!這絕對是我正在尋找的!但是,我確實遇到了一些錯誤,如果我將Snowman'snowDude'聲明爲初始化,snowDude.Content.Load ...在LoadContent中,我收到一個錯誤,指出'在此上下文中不存在對象'。將snowDude的聲明移到構造函數上方的代碼頂部將會消除該錯誤,但會帶來兩個(在重寫'public'繼承成員''和'不能隱式轉換類型'Microsoft.Xna時不能更改訪問修飾符。 Framework.Graphics.Model'到'FINALPROJECT.Snowman' – Kyle

+0

我做了一些改變,第一個是很好的練習,但我不是100%會修復第一個錯誤,但第二個幾乎可以肯定修復第二個錯誤。 。而不是snowDude,它應該是在LoadContent Line中的snowDude.snowMan。因爲snowMan是模型。SnowDude是實際的SnowMan。 我修正的第一件事是將'public'和getter和setter添加到你的變量中。允許更好地訪問它們。當一個變量沒有「公共」或「私人」時,它實際上是「默認」,這與工作起來有點時髦,特別是因爲你可能想要「公開」。 – Reafexus

相關問題