单机游戏儿童更新方法滞后

本文关键字:新方法 滞后 更新 单机游戏 | 更新日期: 2023-09-27 18:19:51

所以我对计算机编程很陌生,但我知道C#的基础知识。

我正在做一个Monogame项目,并为我的精灵制作了一个更新方法。由于我的精灵是基于地形的(我的意思是每个精灵都是不同的身体部位),我做了一个儿童列表。在这个列表中,我放置了所有的身体精灵,并将列表附加到一个父对象(玩家的中心精灵)。

这是我的基本精灵更新方法:(不仅适用于玩家)

public virtual void Update(GameTime gameTime, Rectangle clientBounds)
{
    timeSinceLastFrame += gameTime.ElapsedGameTime.Milliseconds;
    if (timeSinceLastFrame > millisecondsPerFrame)
    {
        timeSinceLastFrame = 0;
        ++currentFrame.X;
        if (currentFrame.X >= sheetSize.X)
        {
            currentFrame.X = 0;
            ++currentFrame.Y;
            if (currentFrame.Y >= sheetSize.Y)
            {
                currentFrame.Y = 0;
            }
        }
    }
}

这是我在另一个类中的玩家精灵更新方法:

public override void Update(GameTime gameTime, Rectangle clientBounds)
{
    position += direction;
    // If sprite moves off screen
    if (position.X < 0)
    {
        position.X = 0;
    }
    if (position.Y < 0)
    {
        position.Y = 0;
    }
    if (position.X > clientBounds.Width - frameSize.X)
    {
        position.X = clientBounds.Width - frameSize.X;
    }
    if (position.Y > clientBounds.Height - frameSize.Y)
    {
        position.Y = clientBounds.Height - frameSize.Y;
    } 
    // Continue base update method 
    base.Update(gameTime, clientBounds);
}

这就是绘制方法,效果很好:

public override void Draw(GameTime gameTime)
{
    spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.PointClamp, DepthStencilState.Default, RasterizerState.CullCounterClockwise);
    player.Draw(gameTime, spriteBatch);
    player.children.ForEach(c => c.Draw(gameTime, spriteBatch));
    spriteBatch.End();
    base.Draw(gameTime);
}

但更新方法滞后:

public override void Update(GameTime gameTime)
{
    player.children.Add(playerDeux);
    float millisecondsRunning = 30;
    float millisecondsWalking = millisecondsRunning  * 2f;
    if (player.running == true)
    {
        player.millisecondsPerFrame = millisecondsRunning;
    }
    else if (player.running == false)
    {
        player.millisecondsPerFrame = 65;
        playerDeux.millisecondsPerFrame = 30;
    }
    if (player.walking == false)
    {
        player.textureImage = Game.Content.Load<Texture2D>(@"Images/" + s1[1]);
    }
    player.Update(gameTime, Game.Window.ClientBounds);
    player.children.ForEach(c => c.Update(gameTime, Game.Window.ClientBounds));
    base.Update(gameTime);
}

因此,当我在所有子对象上调用draw方法时,它工作得很好,但当我在子对象上使用Update方法时,会滞后很多,程序甚至停止工作。

有更好的方法吗?

编辑:还需要注意的是,这个类还没有完成,它只是一个测试,我绘制了2个精灵并更新(动画播放)它们。+player.textureImage=Game.Content.Load中的s1[1](@"Images/"+1[1]);只是数组中的字符串名称。

单机游戏儿童更新方法滞后

您的代码有一些奇怪之处,但我认为罪魁祸首是player.children.Add(playerDeux)。按照现在的方式,每次更新都要将playerDeux添加到子列表中,然后在每次Update运行时更新playerDeux一次。看起来您想要将这行代码移动到InitializeLoadContent方法中。

此外,您可能应该在LoadContent方法中只加载一次纹理,而在Update方法中只引用内存中的纹理。这不是比赛如此落后的主要原因,但这是一个不必要的开销。