Saya membuat game XNA top-down. Peta dibuat oleh ubin. Masalah yang baru-baru ini saya perhatikan adalah 'kisi' garis di antara ubin. Itu hanya muncul kadang-kadang dan hanya tergantung pada posisi kamera. Saya membiarkan XNA menangani penentuan posisi, mengapa garis-garis ini muncul?
Ini adalah gambar dengan garis:
Namun, setelah memindahkan kamera saya sedikit, secara ajaib kembali ke bagaimana seharusnya muncul:
Terima kasih atas bantuannya!
EDIT:
Ini adalah yang terbaik yang dapat saya lakukan untuk kode sumber, ini adalah proyek yang sangat besar dan rendering dilakukan di beberapa area:
Main Render Loop Untuk elemen dinamis seperti ubin:
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
Kelas:
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
Penelitian saya:
Saya telah melakukan beberapa pencarian ke dalamnya dan inilah yang saya temukan:
- Masalah ini disebut sobek (saya percaya?)
- Ini biasanya disebabkan oleh menggunakan tipe data floating point untuk menahan posisi ubin (saya menggunakan
Integer
jadi ini seharusnya tidak menjadi masalah kan?)
sumber
Jawaban:
Saya berasumsi bahwa meskipun posisi ubin Anda didefinisikan dalam bilangan bulat, posisi kamera Anda mungkin tidak. Jadi jika Anda mencoba membuat posisi piksel-sempurna dari posisi non -piksel-sempurna maka pengambilan sampel mungkin tidak aktif dan menyebabkan garis di antara ubin. Dalam
SpriteBatch.Draw
panggilan Anda , saya akan menyarankan untuk mengubah SamplerState untukPointClamp
memastikan bahwa tekstur diambil sampel berdasarkan titik dan harus menghapus garis-garis tambahan itu.Kode Anda direvisi:
sumber
Saya memiliki masalah serupa dengan DirectX 11 dan ini berhasil untuk saya:
Saya mengubah mode alamat tekstur dalam deskripsi status sampler. Mode alamat tekstur digunakan untuk mengontrol apa yang dilakukan Direct3D dengan koordinat tekstur di luar kisaran (dalam DirectX 11, ini
[0.0f, 1.0f]
). Saya mengubahADDRESS_U
,ADDRESS_V
,ADDRESS_W
anggota untukD3D11_TEXTURE_ADDRESS_CLAMP
yang klem out-of-range nilai koordinat tekstur ke dalam jangkauan.Jika ada parameter analog dalam kode Anda, ini mungkin membantu.
sumber
Saya memiliki masalah yang sama dengan garis muncul di antara ubin saya juga, tetapi mengubah keadaan sampler ke Point Clamp tidak memperbaiki masalah.
Sebaliknya saya menemukan bahwa mematikan multi-sampling dan menyinkronkan jejak vertikal memperbaiki masalah. Ini ada di XNA 4.0:
Semoga ini bisa membantu seseorang di luar sana!
sumber