2014-03-28 2 views
2

Хорошо, поэтому я делаю 2-я стреляющую игру в XNA и немного ударил. Я пытаюсь создать класс врагов, который позволит мне разворачивать врага с экрана каждые 10 секунд, а затем перемещать его случайным образом вверх, вправо или влево. Проведя большую часть 4 часов чистки Интернета, все, что я нашел, является примером того, как враг перемещается в одном направлении, появляется из одной точки и так далее.XNA: Нужна помощь, порождающая врагов на любой стороне, по таймеру, а затем их перемещение случайным образом.

Любая помощь была бы высоко оценена, мой класс врагов - это немного беспорядок в минуту от перетаскивания большого количества кода, чтобы попытаться заставить его работать. Здесь, как он стоит:

using Microsoft.Xna.Framework; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Shark_Wars_2 
{ 
    class Enemy 
    { 
     List<Vector2> sharkPosition = new List<Vector2>(); //is there a better way for having more than one of the same enemy? 
     public Vector2 sharkDirection; 

     public int sharkWidth; 
     public int sharkHeight; 

     public int sharkSpeed; 

     float sharkSpawnProbability; 

     public Random randomSharkPosition; 
     public Random direction; 

     double timer = 0; 
     float interval = 1000; 
     int speed = 1; 

     public Enemy() 
     { 
      sharkPosition = new Vector2(0, 0); //brings up error - see above 

      sharkWidth = 64; 
      sharkHeight = 44; 

      sharkSpeed = 3; 

      sharkSpawnProbability = 1/10000f; 

      randomSharkPosition = new Random(3); //left, right, up, down 
      direction = new Random(3); 

     } 

     public void update(GameTime gameTime) 
     { 
      //enemy movement 
      for (int i = 0; i < sharkPosition.Count; i++) 
      { 
       //enemy position increases by speed 
       sharkPosition[i] = new Vector2(sharkPosition[i].X + sharkDirection.X, sharkPosition[i].Y + sharkDirection.Y); 
      } 

      timer += gameTime.ElapsedGameTime.TotalMilliseconds; 

      //aniamtion 
      if (timer >= interval/speed) 
      { 
       timer = 0; 
      } 

      //spawn new enemy 
      if (randomSharkPosition.NextDouble() < sharkSpawnProbability) 
      { 
       float spawn = (float)randomSharkPosition.NextDouble() * (1280 - sharkHeight); sharkPosition.Add(new Vector2(sharkDirection.X, sharkDirection.Y)); 
      } 
     } 

     // ill worry about drawing after spawning and movement, should be no problem 
     public void draw()//(SpriteBatch spritebatch, Texture2D wave) 
     { 
      for (int i = 0; i < sharkPosition.Count; i++) 
      { 
       //spritebatch.Draw(shark, new Rectangle((int)sharkPosition[i].X, (int)sharkPosition[i].Y, sharkWidth, sharkHeight); 
      } 
     } 
    } 
} 

моя голова действительно заблокирована, я потратил много времени, работая, как сделать перемещение фоновых объектов и список пуль.

Я бы очень хотел упростить это, так что, если вы знаете, что проще делать вещи, я все уши!

Заранее благодарен!

+0

Ваш sharkPosition = новый Vector2 (0, 0); Должен отображаться ошибка. Это список, поэтому вам нужно это сделать. sharkPosition.Add (новый Vector2 (0, 0)); Что касается нереста. Выберите случайное значение x и y. Проверьте, не находятся ли они за пределами границ. Поместите блок. Проверьте, не меньше ли единицы. Если он затем перемещается вправо. Повторите проверку, если оно меньше 0. Двигайтесь вниз. Повторите проверку, если она больше ширины границ карты. Двигай влево. Повторите проверку, если она больше, чем высота границ карты. Двигайтесь вверх. Проверка приведет к тому, что юниты переместятся из пределов в границы. – deathismyfriend

ответ

0

Ваша основная проблема заключается в том, что вы не отделили свой курс управления/логики от объектов экземпляра. Вы хотите больше разделения, как это:

public class EnemyManager 
{ 
    List<Shark> activeSharks = new List<Shark>(); 
    Timer spawnTimer; 

    //Just one random instance per class, this is considered best practice to improve 
    //the randomness of the generated numbers 
    Random rng = new Random(); //Don't use a specific seed, that reduces randomness! 

    public EnemyManager() 
    { 
     //Min/max time for the next enemy to appear, in milliseconds 
     spawnTimer = new Timer(rng.Next(500, 2000)); 
     spawnTimer.Elapsed += SpawnShark; 
     spawnTimer.Start(); 
    } 

    public void SpawnShark(object sender, ElapasedEventArgs e) 
    { 
     Vector2 newSharkPosition = Vector2.Zero; 
     newSharkPosition.X = rng.Next(0, 1280); //Whatever parameters you want  
     newSharkPosition.Y = rng.Next(0, 1280); //Whatever parameters you want  

     Vector2 newSharkDirection.... //Repeat above for direction 

     Shark spawnedShark = new Shark(newSharkPosition, newSharkDirection); 
     activeSharks.Add(spawnedShark); 

     //Min/max time for the next enemy to appear, in milliseconds 
     spawnTimer = new Timer(rng.Next(500, 2000)); 
    } 

    public void update(GameTime gameTime) 
    { 
     foreach(Shark s in activeSharks) 
     s.Update(gameTime); 
    } 

    public void draw(SpriteBatch spritebatch, Texture2D wave) 
    { 
     foreach(Shark s in activeSharks) 
     s.Draw(spritebatch, wave) 
    } 
} 

public class Shark 
{ 
    Vector2 position; 
    Vector2 direction; 
    const float speed = 3; 
    const int height = 44; 
    const int width = 64; 

    public Shark(Vector3 initPosition, Vector3 direction) 
    { 
     position = initPosition; 
     this.direction = direction; 
    } 

    //Draw/Update using the local variables. 
} 

Очевидно, что я не писал весь код, но это должно вам начать работу. Сначала я взял все «конкретные» данные и поместил их в свой собственный объект, затем «менеджер» просто держит и управляет коллекцией этих объектов. Я также реорганизовал ГСЧ, чтобы иметь только один экземпляр (наилучшая практика) и использовать начальное время по умолчанию. Само по себе это приведет к тому, что числа будут выдаваться одинаково каждый раз, когда вы запускаете программу (возможно, не то, что вы собираетесь делать :)).

Сообщите мне, если вы что-то не поняли или я могу оказать любую дополнительную помощь!

+0

Вау, большое вам спасибо, что действительно прояснил ситуацию и сделал прогресс намного более плавным. Надеюсь, я смогу справиться с этим, но я обязательно спрошу, есть ли у меня какие-то дальнейшие проблемы! большое спасибо :) – FJLyons

+0

Рад, что я смог помочь! Когда вы почувствуете, что на ваш вопрос был дан ответ, не забудьте «проверить» ответ, который, по вашему мнению, был лучшим. Упрощение полезных ответов (когда у вас есть репутация) также отличный способ сказать «Спасибо!» людям, которые помогли. Не делать этого жалобщикам очень грустно :(;). И добро пожаловать в StackOveflow, у вас был очень хороший первый вопрос! – BradleyDotNET

Смежные вопросы