Я делаю игру 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
так что это не должно быть проблемой, верно?)
источник
Ответы:
Я предполагаю, что, хотя ваши позиции плитки определены в целых числах, ваша позиция камеры может не быть. Так что, если вы пытаетесь визуализировать идеальные по пикселям позиции из не идеальных по пикселям, тогда выборка может быть отключена, что приведет к появлению линий между плитками. В ваших
SpriteBatch.Draw
звонках я бы предложил изменить SamplerState, чтобыPointClamp
обеспечить выборку текстур по точкам и удалить лишние линии.Ваш код исправлен:
источник
У меня была похожая проблема с DirectX 11, и это сработало для меня:
Я изменил режим адреса текстуры в описании состояния сэмплера. Режим адресации текстуры используется для управления действиями Direct3D с координатами текстуры вне диапазона (в DirectX 11 это так
[0.0f, 1.0f]
). Я изменилADDRESS_U
,ADDRESS_V
,ADDRESS_W
членыD3D11_TEXTURE_ADDRESS_CLAMP
которой зажимы из- за границами диапазона значений координат текстуры в диапазон.Если в вашем коде есть аналогичный параметр, это может помочь.
источник
У меня была похожая проблема с линиями, появляющимися между моими тайлами, но изменение состояния сэмплера на Point Clamp не решило проблему.
Вместо этого я обнаружил, что отключение мультисэмплинга и синхронизация вертикальной трассы устранили проблему. Это в XNA 4.0:
Надеюсь, это поможет кому-то там!
источник