Fayanslarım arasında neden çizgiler var?


14

Yukarıdan aşağıya bir XNA oyunu yapıyorum. Haritalar karolar tarafından oluşturulur. Son zamanlarda fark ettiğim bir sorun, fayanslar arasındaki çizgilerden oluşan bir 'ızgara'. Yalnızca bazen ve yalnızca kamera konumuna bağlı olarak görünür. XNA'nın konumlandırmayı yapmasına izin verdim, neden bu çizgiler görünüyor?

İşte çizgileri olan bir resim:

resim açıklamasını buraya girin

Ancak, kameramı biraz hareket ettirdikten sonra, sihirli bir şekilde nasıl görünmesi gerektiğine geri dönüyor:

resim açıklamasını buraya girin

Herhangi bir yardım için teşekkürler!

DÜZENLE:

Bu, kaynak kodu için yapabileceğim en iyi şey, bu son derece büyük bir proje ve renderleme birden fazla alanda yapılır:

Ana İşleme Döngüsü Döşeme gibi dinamik öğeler için:

    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 Sınıf:

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

Araştırmam:

Biraz arama yaptım ve buldum:

  • Bu soruna yırtılma denir (sanırım?)
  • Genellikle karo konumunu tutmak için bir kayan nokta veri türü kullanarak oluşur ( Integerbu yüzden bu bir sorun olmamalı değil mi?)

Fayanslarınızı nasıl çiziyorsunuz? Çizim kodunuzu ve diğer tüm ilgili kodları yapıştırın, ciddi şekilde daha fazla bilgiye ihtiyacımız var :) Sorun muhtemelen yuvarlama hataları / kesinlik ile ilgili bir şey olabilir .

@JaakkoLipsanen, Orada, bazı kodlar ekledim :)
Freesnöw

1
Orada bir soru sadece son zamanlarda çok okunmaya değer olabilir benzer bir konu üzerine.
Andrew Russell

Hatları ile ilgili soru ederken arasında senin çini cevap olmuştur, ben hatları da vardır fark üzerinde sizin çinileri (yani kötü çim dokusu). Bunu da düzeltmek istiyorsanız, şunu okuyun: gas13.ru/v3/tutorials/sywtbapa_almighty_grass_tile.php
Dan

Yanıtlar:


19

Döşeme konumlarınız tamsayı olarak tanımlansa da, kamera konumunuzun olmayabilir. Dolayısıyla, piksel mükemmel olmayan bir konumdan piksel mükemmel konumlar oluşturmaya çalışıyorsanız , örnekleme kapalı olabilir ve karolar arasında çizgiler oluşturabilir. Senin içinde SpriteBatch.Drawaramalarda, ben değişen düşündüren ediyorum SamplerState için PointClampdokular bir nokta bazında örneklenmiş emin olmak için ve bu ekstra satırları kaldırmak gerekir.

Kodunuz revize edildi:

spriteBatch.Begin(
    SpriteSortMode.Deferred, 
    Nothing, 
    SamplerState.PointClamp, 
    Nothing, 
    Nothing, 
    Nothing, 
    Matrix.CreateTranslation(CameraX, CameraY, 0))

1

DirectX 11 ile benzer bir sorun yaşadım ve bu benim için çalıştı:

Örnekleyici durumu açıklamasında doku adresi modunu değiştirdim. Doku adresi modu, Direct3D'nin aralık dışındaki doku koordinatları ile ne yaptığını kontrol etmek için kullanılır (DirectX 11'de budur [0.0f, 1.0f]). I değiştirildi ADDRESS_U, ADDRESS_V, ADDRESS_Wüyeler D3D11_TEXTURE_ADDRESS_CLAMPolan aralığı içine doku koordinatları üzerinden aralık değerleri sıkıştırır.

Kodunuzda buna benzer bir parametre varsa bu yardımcı olabilir.


0

Ben de benim fayans arasında gösterilen çizgiler ile benzer bir sorun vardı, ama örnekleyici durumunu Nokta Kelepçe olarak değiştirmek sorunu çözmedi.

Bunun yerine, çoklu örneklemeyi kapatmanın ve dikey izi senkronize etmenin sorunu çözdüğünü buldum. Bu XNA 4.0'da:

public GraphicsDeviceManager _graphics;

_graphics = new GraphicsDeviceManager(this);
_graphics.PreferMultiSampling = false;
_graphics.SynchronizeWithVerticalRetrace = true;

Umarım bu birisine yardım eder!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.