2014-11-20 2 views
0

Итак, я увидел несколько обучающих программ, используя прямоугольник в виде массива. Но их оккупанты не оживлены. Я использую spritesheet для моих захватчиков, и мне нужно, чтобы они все были анимированы ... Как это сделать?C# XNA - Создание массива космических захватчиков

Вот мой захватчик класс:

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Linq; 
using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Storage; 
using Microsoft.Xna.Framework.Audio; 
using Microsoft.Xna.Framework.Content; 
using Microsoft.Xna.Framework.GamerServices; 
using Microsoft.Xna.Framework.Graphics; 
using Microsoft.Xna.Framework.Input; 
using Microsoft.Xna.Framework.Media; 
using Microsoft.Xna.Framework.Net; 

namespace SpaceInvaders 
{ 
    class botInvaders 
    { 

     public botInvaders() 
     { 

     } 

     public static Texture2D BotInvaderTex; 
     Rectangle BotInvaderHitBox; 
     public static Vector2 BotInvaderPos = new Vector2(0, 28), BotInvaderOrigin; 

     int BotInvaderCurrentFrame = 1, BotInvaderFrameWidth = 52, BotInvaderFrameHeight = 88; 

     float Timer = 0f, Interval = 100f; 

     public void Initialize() 
     { 

     } 

     public void LoadContent(ContentManager Content) 
     { 
      BotInvaderTex = Content.Load<Texture2D>(".\\gameGraphics\\gameSprites\\botInvaders\\normalInvaders\\invaderShip1"); 
     } 

     public void Update(GameTime gameTime) 
     { 
      BotInvaderHitBox = new Rectangle(BotInvaderCurrentFrame * BotInvaderFrameWidth, 0, BotInvaderFrameWidth, BotInvaderFrameHeight); 
      BotInvaderOrigin = new Vector2(BotInvaderHitBox.X/2, BotInvaderHitBox.Y/2); 

      Timer += (float)gameTime.ElapsedGameTime.Milliseconds; 

      if (Timer > Interval) 
      { 
       BotInvaderCurrentFrame++; 
       Timer = 0f; 
      } 

      if (BotInvaderCurrentFrame == 2) 
      { 
       BotInvaderCurrentFrame = 0; 
      } 

      BotInvaderHitBox = new Rectangle(BotInvaderCurrentFrame * BotInvaderFrameWidth, 0, BotInvaderFrameWidth, BotInvaderFrameHeight); 
      BotInvaderOrigin = new Vector2(BotInvaderHitBox.Width/2, BotInvaderHitBox.Height/2); 
     } 

     public void Draw(SpriteBatch spriteBatch) 
     { 
      spriteBatch.Draw(BotInvaderTex, BotInvaderPos, BotInvaderHitBox, Color.White, 0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0);  
     } 
    } 
} 

Это показывает, как анимировать захватчикам. Могу ли я получить часть модифицированного кода, чтобы было 5 строк захватчиков и 10 колонок? Я могу сам сделать движение, мне нужен только массив. Заранее спасибо!

+0

Я знаю, как создать массив, но мне нужен код для добавления * анимированных * захватчиков к нему. – PowerUser

+1

Лучшим способом было бы инкапсулировать весь материал захватчика в свой класс. Скажем, вы называете это «Invader». Затем у вас будет 'Invader [] array = new Invader [10,5]', а в цикле обновления вы можете вызвать 'array [x, y] .Update (gameTime)' и в методе Draw() вы могли бы вызов 'array [x, y] .Draw (spriteBatch)' – itsme86

+0

@ itsme86 Вы должны опубликовать это как ответ ... – BradleyDotNET

ответ

1

Инкапсулируйте его! Вы можете использовать класс invader для создания массива космических захватчиков.

Invader[] InvaderArray = new Invader[x,y]; 

Вы тогда должны были бы назвать:

InvaderArray[x,y].Update(gameTime); 

, а затем в методе дро вам нужно сделать это.

InvaderArray[x,y].Draw(spriteBatch) 
3

Лучший способ добиться того, что вы хотите, - это инкапсулировать весь материал захватчика в свой класс. Предположим, вы называете его Invader. Это может выглядеть примерно так:

public class Invader 
{ 
    private Texture2D _texture; 

    public Invader(Texture2D texture) 
    { 
     _texture = texture; 
    } 

    public void Update(GameTime gameTime) 
    { 
     // Update logic for this individual invader goes here 
    } 

    public void Draw(SpriteBatch spriteBatch) 
    { 
     // Draw routine for this invidual invader goes here 
    } 
} 

Тогда, вы бы:

Invader[,] array = new Invader[columns,rows]; 

который вы бы инициализировать в начале игры. В методе Update() вы бы цикл через массив и вызвать Update() метод захватчика:

for (int y = 0;y < rows;++y) 
{ 
    for (int x = 0;x < columns;++x) 
    { 
     array[x,y].Update(gameTime); 
    } 
} 

и, аналогично, в методе Draw() вы могли бы сделать то же самое зацикливание и называют:

array[x,y].Draw(spriteBatch); 
+0

Хорошо, я получил первую часть, но в массиве я должен заменить 'columns, rows' моим номера? И вы не объявляли 'x' и' y', я знаю, вы имеете в виду, что это координаты, но да. – PowerUser

+0

@Charlie Вместо того, чтобы заменять столбцы и строки вашими числами, я бы сделал их переменными (или константами), поскольку значения будут делать вещи проще для циклов. Однако x и y должны ссылаться на индексы в многомерном массиве. Я добавил цикл для метода «Update()», так что это ясно. – itsme86

+0

Я думаю, что это должно быть 'botInvaders [,] Array = new botInvaders [10, 5];', иначе это вызовет ошибку. – PowerUser