【问题标题】:Changing class properties for all instances更改所有实例的类属性
【发布时间】:2013-06-06 13:02:14
【问题描述】:

我正在使用 Microsoft XNA 制作一个简单的游戏,我有一个 Enemy.cs 类,它包含一个属性 enemyMoveSpeed

public class Enemy
{
    float enemyMoveSpeed { get; set }
}

在更新部分的Game1.cs 中,我放置了一个计时器,它会不断更改以下属性。

protected override void Update(GameTime gameTime)
{
    float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;
    timer -= elapsed;
    if (timer < 0)
    {
        foreach (Enemy E in enemies)
        {
            E.enemyMoveSpeed += 1;
        }

        timer = TIMER; //Reset Timer
    }
}

更改后每个新的 Enemy 实例都会受到影响。有人可以告诉我如何实现这个吗?

【问题讨论】:

  • 你确定它是一个属性而不是一个字段或属性?
  • 对不起,我是一个初学者,仍然对这些关键字感到困惑。你肯定是对的。
  • 能否提供源代码示例?
  • 我有一个 Enemy 类,它包含一个浮动的enemyMoveSpeed。然后在 Initialize 方法中的类中使用 3.0f 的值对其进行初始化。我使用的计时器看起来像这样,发生在 Game1.cs 更新方法中。
  • float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;计时器 -= 已过; if (timer

标签: c# class properties xna


【解决方案1】:

创建一个列表

List<Enemy> MyEnemyList;
//of course you will have to add Enemies to this list somehow. Probably you already have a list or an array, wich behaves the same for this purpose.

foreach (Enemy E in MyEnemyList)
{
    E.enemyMoveSpeed += 1; //if you are incrementing the speed of everyone by 1.
    //or any other option you think is better
}

【讨论】:

  • 您可能需要将其与时间同步。更新循环尝试以 1/16 秒的速度运行。
  • 感谢您提供此代码,但我收到一条消息说该属性无法访问。
  • @user2459750 您需要将属性设为publicpublic int enemyMoveSpeed { get; set; }.
  • 这只会影响当前的敌人,不会影响新的敌人。 OP 似乎只想影响新的敌人。
  • 它会影响列表中的所有敌人。当然,他需要将新的敌人添加到“AllEnemies”列表中。
【解决方案2】:

为新速度使用静态属性,在您的 Enemy 构造函数中,您可以设置实例属性以匹配此属性。

类似

class Enemy
{
    public static int NewEnemySpeed { get; set;}

    public int Speed {get; set;}

    public Enemy()
    {
        Speed = NewEnemySpeed;
    }

}

从您的 Game1.Update 中,您可以执行此操作

Enemy.NewEnemySpeed = ..//some new speed

【讨论】:

  • 这只会影响新实例。如果您希望这适用于当前和新敌人,请将此答案与丹尼尔的答案结合起来。
  • 感谢您的回答。这不会给我任何错误,但不会更改属性。我知道你很难判断我写这个的方式,我主要是按照 XNA 2D 游戏教程。
【解决方案3】:

也许这样的事情会对你有所帮助。

public class Enemy
{
    public Enemy()
    {
        EnemyState = new EnemyState { IsDirty = true, Position = Vector2.Zero };
        Speed = 3.0f;
    }

    public EnemyState State { get; set }
    public float Speed { get; set; }
}

public class EnemyState
{
    public bool IsDirty { get; set }
    public Vector2 Position { get; set; }
}

protected override void Update(GameTime gameTime)
{
    float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;

    // If should spawn enemy
    // var enemy = new Enemy();
    // enemy.State.Position = // TODO insert starting position
    // enemies.Add(enemy);
    // Find all enemies that should be moved
    // Set IsDirty = true;

    // Move each enemy that IsDirty
    timer -= elapsed;
    if (timer < 0)
    {
        foreach (Enemy enemy in enemies.Where(e => e.State.IsDirty))
        {
            enemy.State.Position.X += enemy.Speed;
            enemy.State.IsDirty = false;
        }

        timer = TIMER; //Reset Timer
    }
}

【讨论】:

  • 感谢您的宝贵时间,每当我开始提问时,我都会自己想出答案。
猜你喜欢
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多