Проблема с цветом спрайтов C# MonoGame

У меня проблема с отображением спрайта, где швы текстуры должны быть правильно загружены (по крайней мере, я не получаю никаких сообщений об ошибках даже при удалении условия if), но когда я отображаю все это, я вижу квадрат цвета параметра Color, в то время как текстура застряла в верхнем левом углу, видимая только при наведении на нее курсора. Текстура PNG была правильно скопирована в папку «Содержимое» с помощью Content.mgcb.

    public class Entity
    {
        public Vector2 Position { get; set; }
        public Vector2 Diameters { get; set; }
        public float Angle { get; set; }
        public Texture2D EntityTexture { get; set; }
        public int EntityLayer { get; set; }

        public Entity(Vector2 position, Vector2 diameters, float angle, string spriteName, int entityTexture)
        {
            Position = position;
            Diameters = diameters;
            Angle = angle;
            EntityTexture = Holder.content.Load<Texture2D>(spriteName);
            EntityLayer = entityTexture;
        }

        public void DrawEntity()
        {
            if (EntityTexture != null)
            {
                Holder.spriteBatch.Draw(EntityTexture, Position, new Rectangle((int)(Position.X), (int)(Position.Y), (int)(Diameters.X), (int)(Diameters.Y)),
                    Color.White, Angle, new Vector2(EntityTexture.Bounds.Width/2, EntityTexture.Bounds.Height/2), Holder.scale, SpriteEffects.None, EntityLayer);
            }
        }
    }

LoadContent() в основном классе:

Holder.content = this.Content;
Holder.spriteBatch = new SpriteBatch(GraphicsDevice);

_player = new Player(new Vector2(300, 300), new Vector2(64, 64), 0.0f, "player", 1);

Обработка spriteBatch внутри Draw(GameTime gameTime) в основном классе:

            Holder.spriteBatch.Begin();

            _player.DrawEntity();

            Holder.spriteBatch.End();
            base.Draw(gameTime);

Оба Holder.spriteBatch и Holder.content находятся внутри class Holder:

namespace SpaceInvaderPlusPlus
{
    class Holder
    {
        public static SpriteBatch spriteBatch;
        public static ContentManager content;
        public static float scale = 1.0f;
    }
}

Я пробовал задать параметры Holder.spriteBatch.Begin()SpriteSortMode.Deferred, BlendState.AlphaBlend, изменить SpriteEffects.None на new SpriteEffects(), а также сделать прозрачный фон изображения текстуры и изменить Color.White -> Color.Transparent, но все, что он сделал, это изменил цвет визуализированного квадрата на прозрачный.

Пробовали ли вы различные методы SpriteBatch.Draw? Может, начать с самых простых? Иногда это может помочь увидеть, действительно ли спрайт существует.

Rafloka 04.05.2024 04:48

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

brd 07.05.2024 12:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, проблема связана с тем, как используется SpriteBatch.Draw() (внутри вашего класса сущности):

public void Draw(Texture2D texture, Vector2 position, Rectangle? sourceRectangle, Color color, float rotation, Vector2 origin, float scale, SpriteEffects effects, float layerDepth) {...}

Здесь позиция подразумевает позицию в игровом мире (как вы правильно сделали), но X и Y исходного прямоугольника подразумевают позицию спрайта/изображения/графики внутри исходной текстуры (если в исходной текстуре находится только один спрайт/изображение/графика). текстура, скорее всего это 0, 0). Вместо этого вы снова используете Entity.Position, что, вероятно, не предназначено.

Ширина и высота sourceRectangle, следовательно, являются шириной и высотой спрайта/изображения/графики внутри исходной текстуры.

sourceRectangle можно использовать, например. в сочетании с атласом текстур (несколько спрайтов в одной большой текстуре) или листом спрайтов (кадры анимации спрайтов в одной большой текстуре)

Дайте мне знать, если это помогло!

Другие вопросы по теме

Похожие вопросы

Рекомендуемые типы проектов для простой повторяющейся задачи, размещенной в Azure
Вызовите контроллер только один раз в поле зрения
Бета-версия C# Graph позволяет получить все типы назначений с их правилами обнаружения для всех Win32LobApps за один вызов
Пользовательский редактор Unity Изменение значения по умолчанию EditorGUI.PropertyField
Как автоматически преобразовать все утверждения «классической модели» в утверждения «модели ограничений» в NUnit?
HotChocolate И фильтрация в DateTime Enumerable
Как мне исправить мою игру «Монти Пайтон» (C#), чтобы спрятать приз за случайной дверью и сделать так, чтобы обнаруженная дверь была случайной, а не дверь с призом?
C# Сделайте автономный файл или поместите выходные файлы в подпапку
Обработка классов, наследующих один и тот же базовый класс в структуре mvvm
Чтение XML в формат LINQ для проверки данных файла журнала. Условия в формате списка. linq не получает преобразованный XML