Так что я довольно новичок в программировании, но я знаю основы C#.Monogame children update method lag
Я работаю над проектом 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 для детей, он очень сильно отстает, и программа даже перестает работать.
Есть ли лучший способ сделать это?
EDIT: также обратите внимание, что этот класс еще не закончен, это всего лишь тест, где я рисую 2 спрайта и обновляю их (анимация). + s1 [1] в player.textureImage = Game.Content.Load (@ "Images /" + s1 [1]); это просто имя строки в массиве.
Задержка видима в самом начале игры, но вы можете увидеть движение (очень небольшое движение) и очень быстро растет. Игра замерзает через ~ 5 секунд. – Jelle
Я не знаю достаточно, чтобы опубликовать ответ, но что 'Load()' call выглядит ужасно подозрительно. Я надеюсь, что это не перезагрузка текстуры с диска для каждого объекта в каждом кадре ... –
Эта загрузка
Jelle