У меня довольно простой вопрос о разработке игр в 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); }
}
Изображения проблемы:
Если 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, просто попробуйте оба, чтобы увидеть, какие работает).
Хотя другие ответы верны, вы можете просто использовать другой 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 - самый задний.
Чтобы добавить к joppiesaus ответ, если у вас есть призывы Draw на ваши объекты, такие как дыра и ufo, вы также можете дать им значение Z и базовый класс/интерфейс, такой как IDrawable. Затем вы можете сохранить список в коде, отвечающем за рендеринг. Если вы это сделаете, вам просто нужно сортировать по Z, а затем выполнить ничью.
Вам нужно нарисовать ufo после черной дыры. XNA рисует в порядке, когда выполняется вызов рисования (или если он определен, но это значение по умолчанию, и я предлагаю вам придерживаться значения по умолчанию). У вас, вероятно, есть НЛО перед отверстием, поэтому НЛО вытягивается над отверстием.
Это хорошее решение (в классе Game):
protected override void Draw(GameTime gameTime)
{
spriteBatch.Begin();
hole.Draw();
ufo.Draw();
spriteBatch.End();
}