更新所有列表项

updating all list items

请注意,我对编程还很陌生。

所以我为游戏中 parent 精灵的所有 children 精灵制作了一个列表 (children) 并且我制作了另一个列表 (childrenSpeed)它存储来自 children 精灵的每个 millisecondsPerFrame 浮点值,也附加到 parent 精灵。

问题是:如果我需要更新(例如)playerHead 的 millisecondsPerFrame 值,那么我需要输入:

playerHead.millisecondsPerFrame = (value);

但我想做到这一点,这样我就可以使用一行代码来更新所有 children.

的 children 速度列表中的所有值

我尝试使用

player.childrenSpeed.ForEach(...)

为此,但我似乎无法让它发挥作用。

这是我的 LoadContent 方法:(playermovement 中的最后一个浮点数是 millisecondsPerFrame 值)

protected override void LoadContent()
{
    spriteBatch = new SpriteBatch(Game.GraphicsDevice);

    // Player sprite
    player = new PlayerMovement(Game.Content.Load<Texture2D>(@"Images/" + s1[0]), new Vector2(150, 150), new Point(20, 35), 0, new Point(0, 0), new Point(1, 11), 1.5f, 1.75f, 65f);
    playerHead = new PlayerMovement(Game.Content.Load<Texture2D>(@"Images/" + s1[2]), new Vector2(150, 150), new Point(20, 35), 0, new Point(0, 0), new Point(1, 11), 1.5f, 1.75f, 65f);
    // playerHead is stored in the children list attached to player
    player.children.Add(playerHead);
    // the millisecondsPerFrame value from playerHead is stored in the childrenSpeed list attached to player
    player.childrenSpeed.Add(playerHead.millisecondsPerFrame);

    // Base loadcontent method
    base.LoadContent();
}

这是我的更新方法:

public override void Update(GameTime gameTime)
{

    if (player.running == true)
    {
        Console.WriteLine("Lopen");
        player.millisecondsPerFrame = 30;
        // I need my childrenSpeed code for millisecondsPerFrame here
    }

    else if (player.running == false)
    {
        Console.WriteLine("gestopt");
        player.millisecondsPerFrame = 65;
        // I need my childrenSpeed code for millisecondsPerFrame here
    }

    if (player.walking == false)
    {
        // not done yet
    }

    player.Update(gameTime, Game.Window.ClientBounds);
    player.children.ForEach(c => c.Update(gameTime, Game.Window.ClientBounds));
    base.Update(gameTime);
}

所以我需要这样的东西:

public override void Update() 
{
    if (player.bool == ...)
    {   
        player.milliSecondsPerFrame = (value);
        // Each element in the player.childrenSpeed list = (value) (same as player)
    }
}

我正在展示您的代码的简化版本,您可以 运行 并进行测试。
Playerclass

class Player
{
    public float milliSecondsPerFrame { get; set; }
    public bool running { get; set; }
    public List<float> childrenSpeed { get; set; }
}

Update 方法(注意,我们实际上是在分配一个新列表)

public override void Update(Player player, float value)
{
    if (player.running) // == true not required
    {   
        player.milliSecondsPerFrame = value;
        player.childrenSpeed = player.childrenSpeed.Select(s => value).ToList();
    }
}

用法

var player = new Player { running = true, milliSecondsPerFrame = 1.5F, childrenSpeed = new List<float> { 2.5F, -3.5F } };

Update(player, 1.25F); //=> milliSecondsPerFrame = 1.25F, childrenSpeed = { 1.25F, 1.25F }

它通过在 Update 方法中使用 foreach 循环来工作:

foreach (Sprite children in player.children) // player.children is the sprite list
{
    children.millisecondsPerFrame = value; // I assign the millisecondsPerFrame float value
}

但是谢谢你的回答。