Чому між моїми плитками є лінії?


14

Я роблю гру XNA зверху вниз. Карти створюються плитками. Нещодавно я помітив проблему - «сітка» ліній між плитками. Він відображається лише іноді та лише залежно від положення камери. Я дозволяю XNA обробляти позиціонування, чому ці рядки відображаються?

Ось малюнок з рядками:

введіть тут опис зображення

Однак після переміщення моєї камери трохи трохи повертається до того, як вона повинна з'являтися:

введіть тут опис зображення

Дякуємо за будь-яку допомогу!

Редагувати:

Це найкраще, що я можу зробити для вихідного коду, це надзвичайно великий проект, і візуалізація виконана у кількох областях:

Основний цикл візуалізації для динамічних елементів, таких як плитка:

    spriteBatch.Begin(SpriteSortMode.Deferred, Nothing, SamplerState.LinearClamp, Nothing, Nothing, Nothing, Matrix.CreateTranslation(CameraX, CameraY, 0))
    Mode.Render(spriteBatch, False)
    For Each j As [Delegate] In DynamicInjectionList
        j.DynamicInvoke(spriteBatch)
    Next
    DynamicInjectionList.Clear()
    spriteBatch.End()

Mode.Render:

For x As Integer = 0 To GRIDMAX - 1
    For y As Integer = 0 To GRIDMAX - 1
        For z As Integer = 0 To 2
            Dim ter As TiledTerrain = Terrain(x, y, z)
            If ter IsNot Nothing Then
                sb.Draw(CBaseClient.TextureLibrary("TileMap"), New Rectangle(x * GRIDSIZE, y * GRIDSIZE, GRIDSIZE, GRIDSIZE), New Rectangle(ter.Texture_X, ter.Texture_Y, GRIDSIZE, GRIDSIZE), Color.White)
            End If
        Next
    Next
Next

TiledTerrain.vb Клас:

Imports ProtoBuf

<ProtoContract()> _
Public Class TiledTerrain

    <ProtoMember(1)> _
    Public Property X As Integer
    <ProtoMember(2)> _
    Public Property Y As Integer
    <ProtoMember(3)> _
    Public Property Z As Integer

    <ProtoMember(4)> _
    Public Property Texture_X As Integer
    <ProtoMember(5)> _
    Public Property Texture_Y As Integer

End Class

Моє дослідження:

Я кілька пошукав його, і ось це я знайшов:

  • Ця проблема називається розривом (я вірю?)
  • Це зазвичай викликано використанням типу даних з плаваючою точкою для утримання позиції плитки (я використовую, Integerтому це не повинно бути проблемою, правда?)

Як ви малюєте свою плитку? Вставте свій малювальний код та всі інші відповідні коди, нам серйозно потрібна додаткова інформація :) Проблема, можливо, може мати щось спільне з помилками / точністю округлення.

@JaakkoLipsanen, там я додав код :)
Freesnöw

1
Був зовсім недавно питання на тему , що може бути варто читати теж.
Ендрю Рассел

Хоча на запитання про лінії між вашими плитками відповіли, я помітив, що є також рядки на ваших плитках (тобто погана текстура трави). Якщо ви хочете , щоб виправити це теж прочитати: gas13.ru/v3/tutorials/sywtbapa_almighty_grass_tile.php
Dan

Відповіді:


19

Я припускаю, що, хоча ваші позиції плитки визначені цілими числами, положення камери може не бути. Тож якщо ви намагаєтеся виводити піксельні позиції з а , НЕ -pixel ідеальної позиції , то вибірка може бути виключена і викликають лінії між плитками. У ваших SpriteBatch.Drawдзвінках я б запропонував змінити SamplerState, щоб PointClampгарантувати, що текстури відбираються в точковій основі, і він повинен видалити ці зайві рядки.

Ваш код переглянуто:

spriteBatch.Begin(
    SpriteSortMode.Deferred, 
    Nothing, 
    SamplerState.PointClamp, 
    Nothing, 
    Nothing, 
    Nothing, 
    Matrix.CreateTranslation(CameraX, CameraY, 0))

1

У мене була схожа проблема з DirectX 11, і це спрацювало для мене:

Я змінив режим тексту тексту в описі стану вибірки. Режим текстурної адреси використовується для контролю того, що Direct3D робить з координатами текстур поза межами діапазону (в DirectX 11 це [0.0f, 1.0f]). Я змінивADDRESS_U , ADDRESS_V,ADDRESS_W члени D3D11_TEXTURE_ADDRESS_CLAMPякої затискачі з- за межами діапазону значень координат текстури в діапазон.

Якщо в коді є аналогічний параметр, це може допомогти.


0

У мене була схожа проблема з лініями, що з'являються між плитками, але зміна стану вибірки на Point Clamp не усунула проблему.

Натомість я виявив, що вимкнення мультиплексування та синхронізація вертикального сліду вирішили проблему. Це в XNA 4.0:

public GraphicsDeviceManager _graphics;

_graphics = new GraphicsDeviceManager(this);
_graphics.PreferMultiSampling = false;
_graphics.SynchronizeWithVerticalRetrace = true;

Сподіваюся, це допомагає комусь там!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.