2015-10-30 3 views
1

Так что я довольно новичок в программировании, но я знаю основы 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]); это просто имя строки в массиве.

+0

Задержка видима в самом начале игры, но вы можете увидеть движение (очень небольшое движение) и очень быстро растет. Игра замерзает через ~ 5 секунд. – Jelle

+0

Я не знаю достаточно, чтобы опубликовать ответ, но что 'Load ()' call выглядит ужасно подозрительно. Я надеюсь, что это не перезагрузка текстуры с диска для каждого объекта в каждом кадре ... –

+0

Эта загрузка Jelle

ответ

3

Есть некоторые странности с вашим кодом, но я думаю, что главным виновником является player.children.Add(playerDeux). Как сейчас, вы добавляете playerDeux в список детей каждое обновление, а затем обновляете playerDeux один раз за каждый раз, когда Update уже запущен. Похоже, вы хотите переместить эту строку кода в свои методы Initialize или LoadContent.

Кроме того, вы должны, вероятно, загрузить текстуру только один раз в методе LoadContent и ссылаться только на текстуру в памяти в методе Update. Это не главная причина, по которой игра настолько лагги, но это лишние накладные расходы.

+0

Спасибо! Я ошибся некоторое время назад и не мог использовать эту строку в Loadcontent, поэтому временно помещал ее в метод Update, но забыл вернуть ее в метод Loadcontent(). – Jelle