【问题标题】:XNA drawing and creating an array of objectsXNA 绘制和创建对象数组
【发布时间】:2014-11-14 18:59:08
【问题描述】:

大家好,我正在尝试创建一个游戏,现在,我有一个气球类,我想通过一个数组创建一些气球类,然后绘制到游戏中。

但目前看来,它要么只创建一个气球实例,要么只绘制 1 个实例。我已经多次查看它,据我了解,它应该循环遍历整个数组大小(当前设置为 10)并创建那么多气球,然后更新和绘制那么多气球。

你不能用数组做我目前正在做的事情吗?我必须单独创建每个对象吗?

这是两个相关类的代码。

游戏级别: 创建和绘制对象的类。

        public partial class GameLevel : GameScreen
        {
            SpriteBatch spriteBatch;
            protected Game game;

            Texture2D balloonTexture;

            Balloon[] balloons = new Balloon[10];

            public GameLevel(Game game, SpriteBatch spriteBatch)
                : base(game, spriteBatch)
            {
                this.game = game;
                this.spriteBatch = spriteBatch;
            }

            public void LoadContent()
            {

                for (int i = 0; i < balloons.Length; i++)
                {



                    int colour;
                    Random random = new Random();


                    colour = random.Next(1, 6);

                    switch (colour)
                    {
                        case 1: balloonTexture = Game.Content.Load<Texture2D>("Images/BlueBalloon");
                            break;
                        case 2: balloonTexture = Game.Content.Load<Texture2D>("Images/RedBalloon");
                            break;
                        case 3: balloonTexture = Game.Content.Load<Texture2D>("Images/YellowBalloon");
                            break;
                        case 4: balloonTexture = Game.Content.Load<Texture2D>("Images/GreenBalloon");
                            break;
                        case 5: balloonTexture = Game.Content.Load<Texture2D>("Images/PurpleBalloon");
                            break;
                    }
                    balloons[i] = new Balloon(new Rectangle(0, 0, 1152, 648), balloonTexture);
                    balloons[i].SetStartPosition();
                }
            }

            public void Update()
            {

                for (int i = 0; i < balloons.Length; i++)
                {
                    balloons[i].Update();
                }


            }



            public override void Draw(GameTime gameTime)
            {
                for (int i = 0; i < balloons.Length; i++)
                {

                    balloons[i].Draw(spriteBatch);
                }

                base.Draw(gameTime);
            }
        }
    }

气球类:

    public class Balloon
    {

        Vector2 position;
        Vector2 motion;   
        Rectangle bounds;
        Rectangle screenBounds;
        public Texture2D texture;
        float balloonSpeed = 4;

        public Balloon(Rectangle screenBounds, Texture2D texture)     
        {       
            this.texture = texture;
            this.screenBounds = screenBounds;
        }

        public Rectangle Bounds
        {
            get
            {
                bounds.X = (int)position.X;
                bounds.Y = (int)position.Y;
                return bounds;
            }
        }


        public void Update()
        {
            position += motion * balloonSpeed;
        }

        private void CheckWallColision()
        {
            if (position.X < 0)
            {
                position.X = 0;
                motion.X *= -1;
            }

            if (position.X + texture.Width > screenBounds.Width)
            {
                position.X = screenBounds.Width - texture.Width;
                motion.X *= -1;
            }

            if (position.Y < 0)
            {
                position.Y = 0;
                motion.Y *= -1;
            }

            if (position.Y + texture.Height > screenBounds.Height)
            {

                position.Y = screenBounds.Height - texture.Height;
                motion.Y *= -1;
            }
        }

        public void SetStartPosition()
        {
            Random rand = new Random();

            motion = new Vector2(rand.Next(2, 6), -rand.Next(2, 6));
            motion.Normalize();

            position = new Vector2(rand.Next(100, 500), rand.Next(100, 500));

        }


        public void Draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(texture, position, Color.White);

        }
    }
}

【问题讨论】:

  • 查看您的代码,我最初的想法是它们都在彼此重叠,并且位置计算不正确。我还建议不要每次都创建Random 的新实例,而是保留一个实例。有可能得到相同的种子,因此得到相同的值。
  • @TyCobb 获得相同的种子实际上非常普遍 - 种子完全基于系统时钟,因此同时创建的一系列 Random 对象将返回完全相同的系列价值观。就个人而言,我认为这是一个巨大的设计缺陷。
  • 如果您希望在每次应用运行时多一点随机,请使用Random random = new Random((int) DateTime.Now.Ticks &amp; 0x0000FFFF);msdn.microsoft.com/en-us/library/ctssatww(v=vs.110).aspx

标签: c# arrays xna draw


【解决方案1】:

我认为发生这种情况的原因与Random 对象的工作方式有关。当一个被构造时,它使用系统时钟作为它的种子(它将从中生成所有值)。这意味着,如果您同时生成多个 Random 实例,它们中的每一个都将返回相同的一系列值。如果您将这些值用于位置,则您的每个对象都将具有相同的位置,并且将被相互绘制。在您的情况下,因为它们的大小都相同,所以看起来只绘制了一个。

要解决此问题,请创建 Random 的单个实例,并在需要新位置时在该单个实例上使用 Next()

就我个人而言,我认为这是一个非常重要的设计缺陷 - 同时创建的一系列 Random 对象将以完全相同的方式“随机”看起来并不令人惊讶。但是:这是一个很好的例子,说明由 C# 和任何其他语言创建的“随机”值实际上是 pseudo-random,当涉及到伪随机时,实现是非常重要。

【讨论】:

  • 我已经这样做了,将 random 更改为全局并在 forloops 中调用 next,但是我仍然遇到同样的问题。
  • @user1719605 此外,您是否将Random 的单个实例传递给您的气球类?这里的关键是Random 不是在SetStartPosition 中创建的。
  • 我在两个类中都将其设为全局,没有任何改变。所以我在 GameLevel 类中将它设为 public static 并在 Balloon 类中调用该版本,似乎可以解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 2020-04-20
  • 2016-06-15
  • 2018-07-03
  • 1970-01-01
相关资源
最近更新 更多