Tiled Object Layer Position 绘制到错误的位置

Tiled Object Layer Position drawing to the wrong spot

我知道这个问题对于既熟悉平铺游戏又熟悉单人游戏的人来说非常具体,所以我会尽量做到全面。我已经在这个问题上工作了 15 个多小时,我很绝望。

我正在尝试使用 Tiled 的 object 层将精灵绘制到屏幕上。我创建了一个新的 object 图层,在其上绘制了一些矩形,并添加了一个我在 LoadContent 方法中引用的自定义 属性。

这是我的 LoadContent 方法:

protected override void LoadContent()
    {
        // Create a new SpriteBatch, which can be used to draw textures.
        spriteBatch = new SpriteBatch(GraphicsDevice);

        mymap = Content.Load<TiledMap>("Misc/newmap");
        enemyShip = Content.Load<Texture2D>("Enemies/enemyship");

        //TiledMapObject[] islands = mymap.GetLayer<TiledMapObjectLayer>("Islands").Objects;
        ship_sprite = Content.Load<Texture2D>("character/wooden_ship");

        Texture2D texture = Content.Load<Texture2D>("character/anima2");
        animatedSprite = new AnimatedSprite(texture, 1, 2);

        font = Content.Load<SpriteFont>("Misc/londrinasolid");

        Song song = Content.Load<Song>("Music/Chad_Crouch_-_Stellars_Jay");
        MediaPlayer.Volume = 0.7F;
        MediaPlayer.Play(song);

        TiledMapObject[] littleBoats = mymap.GetLayer<TiledMapObjectLayer>("SmallBoats").Objects;
        foreach (var en in littleBoats)
        {
         string type;
            en.Properties.TryGetValue("type", out type);
            if (type == "smallboat")
            {                    
                Enemy.enemies.Add(new SmallBoat(en.Position));                    
            }                
        }

        // TODO: use this.Content to load your game content here
    }

我创建了一个 TiledMapObject 数组,它从 tiledmap object 层获取项目。它还会检查自定义 属性 名称。如果它是 "type",您可以在瓦片地图图片的左下角看到它的标记,它会采用 object 并将其添加到瓦片地图上位置的数组(至少它应该).

在 draw 方法中,我创建了一个临时的 Texture2D 变量,它引用了前面提到的敌人列表(现在用平铺地图中的两个元素填充)。如果键入 Smallboat,它就会绘制我想要绘制的精灵,它确实在错误的位置绘制。下面是相关的绘制方法:

foreach (Enemy en in Enemy.enemies)
{
    Texture2D spritetoDraw;
    int rad;

    if (en.GetType() == typeof(SmallBoat))
    {
        rad = 16;
        spritetoDraw = enemyShip;
    }
    else
    {
        rad = 30;
        spritetoDraw = ship_sprite;                        
    }
    spriteBatch.Draw(spritetoDraw, new Vector2(en.Position.X - rad, en.Position.Y - rad), Color.White);
}

这是敌船的起始位置,一旦我 运行,它与原点 0,0 略有偏移,因为在绘制方法中我减去半径:

这是我的 Enemy class,底部是 SmallBoat child class。我已经创建了一个新列表,一旦它们被添加到我的主文件的 LoadContent 方法中,它应该包含来自平铺层的 objects。我已经检查过 objects 是通过使用 Enemy.Remove() 添加的,它们是,所以我知道至少程序识别了平铺文件中的 objects。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace my_first_game
{
    class Enemy
    {
        private Vector2 position;
        protected int radius;

        float circle = MathHelper.Pi * 2;
        public float rotationAngle;    

        protected int health;
        public static List<Enemy> enemies = new List<Enemy>();
        public int Radius { get { return radius; } }
        public Vector2 Position { get { return position; }}
        public int Health { get { return health; } set { value = health; } }

        public Enemy(Vector2 newpos)
        {
            newpos = position;
        }

        public void Update(GameTime gametime, Vector2 playerPos)
        {
            rotationAngle = circle % 2;

            double dt = gametime.ElapsedGameTime.TotalSeconds;
            Vector2 direction = new Vector2((float)Math.Cos(rotationAngle), (float)Math.Sin(rotationAngle)); 

            Vector2 movedir = Position - playerPos;
            movedir.Normalize();
            position -= movedir;    
        }
    }

    class SmallBoat : Enemy
    {
        public SmallBoat(Vector2 newpos) : base(newpos)
        {          
            //radius = 50;
        }
    }
}

我尝试过的:
1).注释掉所有更新方法和运行,除了船不动之外没有任何变化。
2).绘制新矩形,擦除旧矩形,删除并创建 object 层。
3).如果我从 object 图层中删除一个矩形,那么一旦游戏 运行 宁,就会有更少的船被绘制到屏幕上。因此我知道敌人被吸引到屏幕上,只是不在正确的位置。
4).在绘图方法中将坐标更改为硬编码的固定数字,而不是 en.position.X 和 en.position.Y。这会将起始位置更改为所需位置,但它是硬编码的,无法解决问题。
5). Rear运行ged元素在loadcontent方法和draw方法中,无果。

似乎该列表已被正确引用,问题是由于某种原因,平铺地图上的坐标未运行转移。我的大部分代码都基于 Udemy Monogame 教程,loadcontent 方法和 draw 方法基本相同。

热烈欢迎任何帮助。如果我可以提供任何其他信息,请告诉我。

编辑:这是整个绘制方法。

protected override void Draw(GameTime gameTime)
    {
        controller.controller_update(gameTime);

        spriteBatch.Begin();

        if (controller.ingame == false)
        {
            spriteBatch.DrawString(font, "Welcome to Thallasaphobia. \n press Enter to Begin", new Vector2(100, 100), Color.White);
        }
        spriteBatch.End();

        if (controller.ingame == true)
        {
            GraphicsDevice.Clear(Color.Black);
            mapRenderer.Draw(mymap, cam.GetViewMatrix());

            spriteBatch.Begin(transformMatrix: cam.GetViewMatrix());   

            animatedSprite.Draw(spriteBatch, new Vector2(480, 350));  

            //create a new rectangle around the ship_sprite
            Rectangle ship_rectangle = new Rectangle(0, 0, ship_sprite.Width, ship_sprite.Height);
            Vector2 origin = new Vector2(ship_sprite.Width / 2, ship_sprite.Height + 15);

            foreach (Enemy en in Enemy.enemies)
            {
                Texture2D spritetoDraw;
                int rad;

                if (en.GetType() == typeof(SmallBoat))
                {
                    rad = 16;
                    spritetoDraw = enemyShip;
                }
                else
                {
                    rad = 30;
                    spritetoDraw = ship_sprite;                        
                }
                spriteBatch.Draw(spritetoDraw, new Vector2(en.Position.X - rad, en.Position.Y - rad), Color.White);
            }

            spriteBatch.Draw(ship_sprite, ship.Position, ship_rectangle, Color.White, ship.rotationAngle + MathHelper.Pi/2, origin, 1.0f, SpriteEffects.None, 1);
        }
        spriteBatch.End();   
        base.Draw(gameTime);
    }

虽然我真的没有办法对此进行测试,但我相信问题出在您的构造函数中。您目前拥有此代码:

public Enemy(Vector2 newpos)
{
   newpos = position;
}

你实际上应该有:

public Enemy(Vector2 newpos)
{
   position = newpos;
}

因为 "position" 是敌人 class 的 属性,那是我们要更新的值,而不是 newpos,它只是一个参数。这样就可以解释为什么你的敌人从原点开始,因为它的位置从来没有被初始设置。