Ich mache ein Top-Down-XNA-Spiel. Die Karten werden durch Kacheln erstellt. Ein Problem, das mir kürzlich aufgefallen ist, ist ein Linienraster zwischen den Kacheln. Es erscheint nur manchmal und nur abhängig von der Kameraposition. Ich überlasse XNA die Positionierung. Warum werden diese Zeilen angezeigt?
Hier ist ein Bild mit den Linien:
Nachdem ich meine Kamera ein wenig bewegt habe, kehrt sie auf magische Weise zu dem zurück, was sie aussehen soll:
Danke für jede Hilfe!
BEARBEITEN:
Dies ist das Beste, was ich für Quellcode tun kann, dies ist ein extrem großes Projekt und das Rendern erfolgt in mehreren Bereichen:
Hauptrenderschleife Für dynamische Elemente wie Kacheln:
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
Klasse:
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
Meine Forschung:
Ich habe einige Nachforschungen angestellt und Folgendes gefunden:
- Dieses Problem nennt man Zerreißen (glaube ich?)
- Es wird häufig durch die Verwendung eines Gleitkomma-Datentyps zum Festhalten der Kachelposition verursacht (ich verwende,
Integer
also sollte dies kein Problem sein, oder?)
quelle
Antworten:
Ich gehe davon aus, dass Ihre Kachelpositionen zwar in ganzen Zahlen definiert sind, Ihre Kameraposition jedoch möglicherweise nicht. Wenn Sie also versuchen, pixelgenaue Positionen von einer nicht pixelgenauen Position zu rendern, ist die Abtastung möglicherweise deaktiviert und verursacht Linien zwischen den Kacheln. In Ihren
SpriteBatch.Draw
Anrufen würde ich vorschlagen, den SamplerState auf zu ändernPointClamp
um sicherzustellen, dass die Texturen punktuell abgetastet werden und diese zusätzlichen Linien entfernt werden.Ihr Code überarbeitet:
quelle
Ich hatte ein ähnliches Problem mit DirectX 11 und das hat bei mir funktioniert:
Ich habe den Texturadressmodus in der Beschreibung des Sampler-Status geändert. Der Texturadressmodus wird verwendet, um zu steuern, wie Direct3D mit Texturkoordinaten außerhalb des Bereichs umgeht (dies ist in DirectX 11 der Fall
[0.0f, 1.0f]
). Ich änderte dieADDRESS_U
,ADDRESS_V
,ADDRESS_W
MitgliederD3D11_TEXTURE_ADDRESS_CLAMP
dem klemmt out-of-range Werte der Texturkoordinaten in den Bereich.Wenn sich in Ihrem Code ein analoger Parameter befindet, kann dies hilfreich sein.
quelle
Ich hatte ein ähnliches Problem mit Linien, die auch zwischen meinen Kacheln auftauchten, aber das Ändern des Sampler-Status in Point Clamp behebte das Problem nicht.
Stattdessen stellte ich fest, dass das Deaktivieren der Mehrfachabtastung und das Synchronisieren der vertikalen Ablaufverfolgung das Problem behoben haben. Dies ist in XNA 4.0:
Hoffe das hilft jemandem da draußen!
quelle