Je fais un jeu XNA de haut en bas. Les cartes sont créées par des tuiles. Un problème que j'ai récemment remarqué est une «grille» de lignes entre les carreaux. Il n'apparaît que parfois et uniquement en fonction de la position de la caméra. Je laisse XNA gérer le positionnement, pourquoi ces lignes apparaissent-elles?
Voici une image avec les lignes:
Cependant, après avoir légèrement bougé mon appareil photo, cela revient magiquement à la façon dont il est censé apparaître:
Merci pour toute aide!
ÉDITER:
C'est le mieux que je puisse faire pour le code source, c'est un projet extrêmement volumineux et le rendu se fait sur plusieurs zones:
Boucle de rendu principale Pour les éléments dynamiques tels que les tuiles:
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
Classe:
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
Ma recherche:
J'ai fait quelques recherches et c'est là que j'ai trouvé:
- Ce problème est appelé déchirure (je crois?)
- Cela est généralement causé par l'utilisation d'un type de données à virgule flottante pour maintenir la position de la tuile (j'utilise
Integer
donc cela ne devrait pas poser de problème, non?)
la source
Réponses:
Je suppose que bien que vos positions de tuile soient définies en nombres entiers, la position de votre caméra peut ne pas l'être. Donc, si vous essayez de rendre des positions parfaites en pixels à partir d'une position non parfaite en pixels, l'échantillonnage peut être désactivé et provoquer des lignes entre les carreaux. Dans vos
SpriteBatch.Draw
appels, je suggérerais de changer le SamplerState pourPointClamp
s'assurer que les textures sont échantillonnées sur une base de points et que cela devrait supprimer ces lignes supplémentaires.Votre code révisé:
la source
J'ai eu un problème similaire avec DirectX 11 et cela a fonctionné pour moi:
J'ai changé le mode d'adresse de texture dans la description de l'état de l'échantillonneur. Le mode d'adresse de texture est utilisé pour contrôler ce que Direct3D fait avec les coordonnées de texture en dehors de la plage (dans DirectX 11, c'est le cas
[0.0f, 1.0f]
). J'ai changéADDRESS_U
,ADDRESS_V
,ADDRESS_W
membresD3D11_TEXTURE_ADDRESS_CLAMP
qui serre hors de portée des valeurs de coordonnées de texture dans la gamme.S'il y a un paramètre analogue dans votre code, cela pourrait vous aider.
la source
J'ai également eu un problème similaire avec des lignes apparaissant entre mes carreaux, mais le changement de l'état de l'échantillonneur en Point Clamp n'a pas résolu le problème.
Au lieu de cela, j'ai constaté que la désactivation du multi-échantillonnage et la synchronisation de la trace verticale résolvaient le problème. C'est dans XNA 4.0:
J'espère que cela aide quelqu'un là-bas!
la source