Заказать объекты в Monogame

1

У меня довольно простой вопрос о разработке игр в Monogame. Скажем, у меня есть НЛО как объект, который может двигаться. Время от времени мой НЛО порождает дыру в земле (фиолетовый круг) прямо под местом, где он стоит.

После этого НЛО снова может свободно летать. Однако, когда я хочу лететь над дырой, которую я только что породил, я заметил, что круг выше моего НЛО. Он не летает над отверстием, а вместо этого просто поджимает под ним.

Есть ли способ сделать объект НЛО всегда на переднем плане или, возможно, порождать отверстия за НЛО?

Основная игра, которая добавляет дыру:

Components.Add(new Hole(this, holeTexture,
                   hero.HolePosition));

Функция рисования объекта отверстия:

public override void Draw(GameTime gameTime)
    {
        SpriteBatch sBatch =
            (SpriteBatch)Game.Services.GetService(typeof(SpriteBatch));
        sBatch.Draw(texture, position, Color.White);
        base.Draw(gameTime);
    }

Функция в объекте герой (НЛО), где я определяю местоположение отверстия:

public Vector2 HolePosition //nodig om gaten te graven (startpos.)
        {
            get { return new Vector2(position.X + (WIDTH / 2), position.Y + HEIGHT); }
        }

Изображения проблемы: Изображение 174551Изображение 174551

Теги:
monogame
xna

4 ответа

1
Лучший ответ

Если Hole и UFO являются объектами DrawableGameComponent, то они, как представляется, имеют встроенный порядок рисования:

http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.drawablegamecomponent.draworder.aspx

public int DrawOrder { get; set; } 

Порядок, в котором компонент должен быть нарисован.

Таким образом, ваш исходный код станет примерно таким:

Hole MyHole = new Hole(this, holeTexture, hero.HolePosition);
MyHole.DrawOrder = 1; 
Components.Add(MyHole);

Просто убедитесь, что вы делаете то же самое, когда создаете свой НЛО и даете ему значение DrawOrder, которое рисует его поверх черной дыры (я не уверен, должно ли оно быть больше или меньше, чем MyHole.DrawOrder, просто попробуйте оба, чтобы увидеть, какие работает).

  • 1
    Большое спасибо! Это действительно большая помощь.
4

Хотя другие ответы верны, вы можете просто использовать другой SpriteSortMode. Как объясняется joppiesaus, по умолчанию SpriteSortMode является "Отложенным", что означает, что спрайты будут рисоваться в том порядке, в котором они были нарисованы.

То, что вы, скорее всего, захотите использовать, в вашем случае - SpriteSortMode.BackToFront.

В этом режиме вы можете указать слой ничьей для каждого элемента, который, скорее всего, предоставит вам функциональность, которую вы искали.

SpriteBatch.Begin(SpriteSortMode.BackToFront, null);

Затем при рисовании не забудьте установить значение вашего слоя:

SpriteBatch.Draw(texture, position, null, Color.White, 0, Vector2.Zero, SpriteEffects.None, 0.1f);

Значение слоя или значение глубины слоя идет от 0 до 1 (float), 0 - самый передний слой, а 1 - самый задний.

  • 1
    это должен быть принятый ответ. Он использует внутреннюю архитектуру фреймворка.
1

Чтобы добавить к joppiesaus ответ, если у вас есть призывы Draw на ваши объекты, такие как дыра и ufo, вы также можете дать им значение Z и базовый класс/интерфейс, такой как IDrawable. Затем вы можете сохранить список в коде, отвечающем за рендеринг. Если вы это сделаете, вам просто нужно сортировать по Z, а затем выполнить ничью.

1

Вам нужно нарисовать ufo после черной дыры. XNA рисует в порядке, когда выполняется вызов рисования (или если он определен, но это значение по умолчанию, и я предлагаю вам придерживаться значения по умолчанию). У вас, вероятно, есть НЛО перед отверстием, поэтому НЛО вытягивается над отверстием.

Это хорошее решение (в классе Game):

protected override void Draw(GameTime gameTime)
{
   spriteBatch.Begin();
   hole.Draw();
   ufo.Draw();
   spriteBatch.End();
}
  • 0
    Спасибо за совет: у меня теперь есть быстрое решение для этого. Я снова нарисую своего героя после базы. Таким образом, я дважды нарисую героя, но, по крайней мере, он на вершине. В настоящее время нет ограничений на количество отверстий на экране, поэтому я пока не знаю, как вызывать рисование отверстий для каждого отдельно без base.Draw ().

Ещё вопросы

Сообщество Overcoder
Наверх
Меню