Monogame.Глубина уровня в различных функциях рисования? - PullRequest
0 голосов
/ 02 июля 2019

В animatedSprite.cs у меня есть:

public void Draw(SpriteBatch spriteBatch, Vector2 location)
    {
        int width = Texture.Width / Columns;
        int height = Texture.Height / Rows;
        int row = (int)((float)currentFrame / (float)Columns);
        int column = currentFrame % Columns;
         Rectangle sourceRectangle = new Rectangle(width * column, height * row, width, height);
     Rectangle  destinationRectangle = new Rectangle((int)location.X, (int)location.Y, 120, 140);
        if (Game1.przelacznik_w_bezruchu == true) { sourceRectangle = new Rectangle(0, 0, width, height); }
        spriteBatch.Begin();
        spriteBatch.Draw(Texture, destinationRectangle, sourceRectangle, Color.White);
        spriteBatch.End();}

В GameScene.cs

 private void DrawGame(){
    spriteBatch.Begin();
    spriteBatch.Draw(floor1, rec_floor1, color1);
    spriteBatch.Draw(floor2, rec_floor2, color1);
    spriteBatch.Draw(house1, rec_house1,color1);
    spriteBatch.End();}

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

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Существует перегрузка для функции Draw SpriteBatch, которая позволяет вам указывать layerDepth.

Вы должны использовать следующее при вызове Draw для animatedSprite.cs:

spriteBatch.Draw(Texture, destinationRectangle, sourceRectangle, Color.White, 0.0f, Vector2.Zero, SpriteEffects.None, layerDepth);

layerDepthбыть значением с плавающей точкой, которое позволяет вам контролировать порядок сортировки для ваших спрайтов.Это может быть передано из вашего GameScene.cs как параметр с плавающей запятой, или вы можете изменить параметр местоположения на Vector3 и использовать его переменную Z.

Что касается других параметров:

  • 0.0f - это значение поворота (по оси Z) для спрайта
  • Vector2.Zero - это параметр «origin», который позволяет вам контролировать точку поворота для вашего спрайта.Это полезно для поворота вокруг точки, отличной от верхнего левого угла (обычно в центре)
  • SpriteEffects.None. При этом ваш вызов отрисовки остается таким же, как и в исходном сообщении.Различные значения SpriteEffect позволяют выполнять такие действия, как переворачивание текстуры по горизонтали или по вертикали.
0 голосов
/ 04 июля 2019

Проблема в том, что у вас есть несколько пакетов, определенных как код между spriteBatch.Begin() и spriteBatch.End().

По умолчанию spriteBatch.Begin() вызывается без параметров, все спрайты отрисовываются в порядке их вызова: первый вызов отрисовки является фоновым. Второй розыгрыш будет поверх первого ...

Как сказал @ProfessionalKent в своем ответе, используйте параметр layerDepth:

spriteBatch.Draw(Texture, destinationRectangle, sourceRectangle, Color.White, 0.0f, Vector2.Zero, SpriteEffects.None, layerDepth);

layerDepth принимает любое значение float (по умолчанию 0), Нижние значения отображаются поверх более высоких значений . Все идентичные значения выполняются в указанном порядке.

Этот параметр также относится к spriteBatch.DrawString()

Однако layerDepth действителен только в пределах одного и того же пакета. После вызова End() пакет сортируется, выравнивается и отображается в буфере кадров.

Решение

Запишите необходимую глубину для всех нарисованных объектов. Замените числа layerDepth в следующем коде, чтобы отразить ваш анализ.

Удалите все строки spriteBatch.Begin() и spriteBatch.End() во всем проекте. Если spriteBatch.Begin() не имеет по умолчанию (строки 81 и 91-100) параметров.

В Game1.cs открыть spriteBatch как можно раньше после GraphicsDevice.Clear:

protected override void Draw(GameTime gameTime)
{
   GraphicsDevice.Clear(Color.CornflowerBlue);

   spriteBatch.Begin();

   // Your existing code here.

   spriteBatch.End();

   //oprozniony, nothing should be here
}

В GameScene.cs:

private void DrawGame()
{
// The ,, is for the null source rectangle, 
    spriteBatch.Draw(floor1, rec_floor1,, color1, 0.0f, Vector2.Zero, SpriteEffects.None, 2);
    spriteBatch.Draw(floor2, rec_floor2,, color1, 0.0f, Vector2.Zero, SpriteEffects.None, 3);
    spriteBatch.Draw(house1, rec_house1,,color1, 0.0f, Vector2.Zero, SpriteEffects.None, 1);

// example of a table the animatedSprite(at a depth of 0) will walk or move behind(note the negative depth):
//    spriteBatch.Draw(stol, rec_stol, , color1, 0.0f , Vector2.Zero, SpriteEffects.None, -1);

}

In AnimatedSprite.cs

public void Draw(SpriteBatch spriteBatch, Vector2 location)
    {
        // unless the width and height can change when the game is running, they should be class variables set in the constructor
        int width = Texture.Width / Columns;
        int height = Texture.Height / Rows;

        // removed unnecessary casts:(unless currentFrame is not an int)
        int row = currentFrame / Columns;
        int column = currentFrame % Columns;
        Rectangle sourceRectangle = new Rectangle(width * column, height * row, width, height);
        Rectangle destinationRectangle = new Rectangle((int)location.X, (int)location.Y, 120, 140);
        if (Game1.przelacznik_w_bezruchu == true) sourceRectangle = new Rectangle(0, 0, width, height);

// Place the sprite at Depth of 0.
        spriteBatch.Draw(Texture, destinationRectangle, sourceRectangle, Color.White, 0.0f, Vector2.Zero, SpriteEffects.None, 0);        
}

Есть ситуации, которые требуют нескольких партий. Если это так, разделите партии по порядку глубины вручную.

...