Estoy haciendo un juego XNA de arriba hacia abajo. Los mapas son creados por mosaicos. Un problema que noté recientemente es una "cuadrícula" de líneas entre los mosaicos. Solo aparece a veces y solo según la posición de la cámara. Dejo que XNA maneje el posicionamiento, ¿por qué aparecen estas líneas?
Aquí hay una foto con las líneas:
Sin embargo, después de mover mi cámara un poco, mágicamente regresa a cómo se supone que debe aparecer:
¡Gracias por cualquier ayuda!
EDITAR:
Esto es lo mejor que puedo hacer para el código fuente, este es un proyecto extremadamente grande y la representación se realiza en múltiples áreas:
Main Render Loop Para elementos dinámicos como mosaicos:
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
Clase:
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
Mi investigación:
He investigado un poco y esto es lo que he encontrado:
- Este problema se llama desgarro (¿creo?)
- Es comúnmente causado por el uso de un tipo de datos de punto flotante para mantener la posición del mosaico (estoy usando,
Integer
así que esto no debería ser un problema, ¿verdad?)
fuente
Respuestas:
Supongo que aunque sus posiciones de mosaico están definidas en enteros, la posición de su cámara puede no serlo. Entonces, si está tratando de representar posiciones perfectas en píxeles desde una posición no perfecta en píxeles, entonces el muestreo puede estar desactivado y causar líneas entre los mosaicos. En sus
SpriteBatch.Draw
llamadas, sugeriría cambiar el SamplerState paraPointClamp
asegurarse de que las texturas se muestrean por puntos y que se eliminen esas líneas adicionales.Su código revisado:
fuente
Tuve un problema similar con DirectX 11 y esto funcionó para mí:
Cambié el modo de dirección de textura en la descripción del estado del muestreador. El modo de dirección de textura se usa para controlar lo que Direct3D hace con coordenadas de textura fuera del rango (en DirectX 11, esto es
[0.0f, 1.0f]
). He cambiado elADDRESS_U
,ADDRESS_V
,ADDRESS_W
miembros aD3D11_TEXTURE_ADDRESS_CLAMP
que sujeta los valores fuera de la gama de coordenadas de textura en la gama.Si hay un parámetro análogo en su código, esto podría ayudar.
fuente
También tuve un problema similar con las líneas que aparecían entre mis mosaicos, pero cambiar el estado del muestreador a Point Clamp no solucionó el problema.
En cambio, descubrí que desactivar el muestreo múltiple y sincronizar la traza vertical solucionó el problema. Esto está en XNA 4.0:
Espero que esto ayude a alguien por ahí!
fuente