У меня проблема с отображением спрайта, где швы текстуры должны быть правильно загружены (по крайней мере, я не получаю никаких сообщений об ошибках даже при удалении условия 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() (внутри вашего класса сущности):
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 можно использовать, например. в сочетании с атласом текстур (несколько спрайтов в одной большой текстуре) или листом спрайтов (кадры анимации спрайтов в одной большой текстуре)
Дайте мне знать, если это помогло!
Пробовали ли вы различные методы SpriteBatch.Draw? Может, начать с самых простых? Иногда это может помочь увидеть, действительно ли спрайт существует.