Положение плиточного объекта не соответствует положению MonoGame - PullRequest
3 голосов
/ 09 октября 2019

У меня проблема при импорте плиточных карт со слоями объектов в проект MonoGame. Все в значительной степени работает отлично;Я могу импортировать плиточную карту в проект и визуализировать карту с использованием MonoGame.Extended.

Моя проблема начинается, когда я пытаюсь использовать объект из слоя объектов на плиточной карте. Я могу получить доступ к объекту, и я могу получить доступ к его свойствам (положение и т. Д.) Просто отлично. Фактически, при доступе к свойствам объекта они выводятся точно так, как должны. Ниже приведены поясняемые изображения:

Это изображение объекта в редакторе плиточной карты

А ниже приведен код, куда я импортирую карту, собираю объектинформацию и назначить эту информацию (в данном случае, позицию) другому объекту (игроку)

gameMaps.Add(MapBuilder.LoadTiledMap("TestMap"));

gameMapRenderer = new TiledMapRenderer(graphicsDevice);

var viewportAdapter = new BoxingViewportAdapter(GameInstance.Instance.Window, graphicsDevice, 1440 / 4, 810 / 4);
mainCamera = new Camera2D(viewportAdapter);

var player = new Player();
var playerStartPos = new Vector2();

foreach(var obj in gameMaps[0].ObjectLayers[0].Objects)
{
  if (obj.Name.Equals("PlayerStart"))
  {
    playerStartPos = obj.Position;
    break;
  }
}

player.position = playerStartPos;

entities.Add(player);

mainCamera.LookAt(player.position);

Но ниже изображение, демонстрирующее проблему:

Выпуск в виде изображения

Спрайт /персонаж - это объект игрока, которому назначена позиция, в случае, если неясно.

Объяснить: я могу получить позицию объекта и назначить ее моему объекту «Игрок», и мой игрокзатем в правильной позиции в соответствии с позицией объекта в редакторе плиточной карты. Однако сама мозаичная карта фактически отображается в неправильном положении, хотя я никогда не вносил никаких изменений в положение карты в целом.

Некоторые дополнительные сведения, которые могут помочь:

В редакторе плиточной карты позиция x0, y0 является самой верхней плиткой карты. Тем не менее, в MonoGame, если я пойду в ту же позицию, мозаичная карта будет визуализирована / размещена в некоторых измерениях ниже. Это означает, что расположение карты неверно относительно того, каким оно должно быть.

Ниже приведено изображение, показывающее, какова эта позиция в MonoGame и как она не соотносится с позицией в Tiled.

Скриншот MonoGame

1 Ответ

0 голосов
/ 19 октября 2019

Поговорив немного с создателем Monogame.Extended, мы сузили вопрос. На самом деле это были две вещи:

  1. В редакторе плиточных карт система сетки для изометрических карт отличается от системы сетки, которую Monogame использует для рендеринга всего. Сетка Tiled для изометрических карт - это нормальная сетка, но повернутая, чтобы соответствовать изометрическому виду, тогда как Monogames - просто нормальная сетка. Это приводит к тому, что позиция (x, y) объектов в Tiled импортируется в Monogame со значением позиции, которое не совпадает с тем, где оно должно быть в Monogame, что объясняет неправильную позицию на изображении выше. Создатель Monogame.Extended обратил внимание на ошибку, но сказал, что исправление не является точным, потому что для этого потребуется формула для преобразования изометрической позиции Tiled в позицию Monogame.

  2. Поскольку у моих спрайтов был дополнительный отступ в верхней части, это приводило к тому, что общая карта рендерилась на x пикселей больше, чем в том, что должно быть в правильной позиции 0. Это как-то связано с тем, что карта создается в Monogame через измерения спрайтов вместо карт. Честно говоря, это не гигантская проблема, так как обходной путь может быть сделан в пользовательской реализации TiledMapRenderer.

Я могу опубликовать ссылку на Monogame. Расширенное обсуждение позже.

...