XNA:需要帮助生成敌人在任何一边,在一个计时器滴答,然后让他们随机移动

本文关键字:计时器 一个 滴答 然后 移动 随机 他们 帮助 敌人 XNA 任何一 | 更新日期: 2023-09-27 17:54:50

我在XNA制作一款2d射击游戏,遇到了一些问题。我正在尝试创造一个敌人职业,让我能够每10秒从屏幕上刷出一个敌人,然后让它随机向上、向左或向下移动。在花了4个小时的时间在网上搜索之后,我发现的都是一些让敌人朝着一个方向移动,从一个点刷出等等的例子。

任何帮助将是非常感激,我的敌人类是一个有点混乱的分钟从拖在一起这么多的代码,试图使其工作。现在是这样的:

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);
            }
        }
    }
}

我的头真的卡住了,我花了很多时间研究如何制作移动的背景对象和一个子弹列表。

我真的很想简化这个,所以如果你知道一个更简单的方法做事情,我洗耳恭听!

提前感谢!

XNA:需要帮助生成敌人在任何一边,在一个计时器滴答,然后让他们随机移动

你的基本问题是你没有把你的管理/逻辑类和你的实例对象分开。你想要更多的分隔,像这样:

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.
}

显然我没有写所有的代码,但这应该让你开始。首先,我将所有"实例"特定的数据放入它自己的对象中,然后"管理器"只是保存和管理这些对象的集合。我还重构了RNG,使其只有一个实例(最佳实践),并使用默认的基于时间的种子。您自己播种将导致每次运行程序时输出的数字相同(可能不是您想要的:))。

如果你有什么不明白的,请告诉我,或者我可以提供任何进一步的帮助!