मेरी टाइलों के बीच में लाइनें क्यों हैं?


14

मैं नीचे XNA खेल बना रहा हूं। नक्शे टाइल्स द्वारा बनाए गए हैं। एक समस्या जिसे मैंने हाल ही में देखा है वह टाइल्स के बीच की लाइनों का 'ग्रिड' है। यह केवल कभी-कभी और केवल कैमरे की स्थिति पर निर्भर करता है। मैंने XNA को स्थिति को संभालने दिया, ये लाइनें क्यों दिखाई दे रही हैं?

यहाँ लाइनों के साथ एक तस्वीर है:

यहाँ छवि विवरण दर्ज करें

हालाँकि, मेरे कैमरे को बस थोड़ा सा हिलाने के बाद, यह जादुई रूप से वापस आ जाता है कि इसे कैसे प्रदर्शित किया जाना चाहिए:

यहाँ छवि विवरण दर्ज करें

किसी भी मदद के लिए धन्यवाद!

संपादित करें:

यह स्रोत कोड के लिए सबसे अच्छा मैं कर सकता हूं, यह एक बहुत बड़ी परियोजना है और इसका प्रतिपादन कई क्षेत्रों में किया जाता है:

टाइल्स जैसे गतिशील तत्वों के लिए मुख्य रेंडर लूप :

    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 वर्ग:

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

मेरा शोध:

मैंने इसमें कुछ खोज की है और यह है कि मैंने पाया है:

  • इस समस्या को फाड़ कहा जाता है (मुझे विश्वास है?)
  • यह आमतौर पर एक अस्थायी बिंदु डेटा प्रकार का उपयोग करके टाइल की स्थिति को धारण करने के लिए होता है (मैं उपयोग कर रहा हूं Integerइसलिए यह एक समस्या सही नहीं होनी चाहिए?)

आप अपनी टाइलें कैसे खींचते हैं? अपना ड्राइंग कोड और अन्य सभी प्रासंगिक कोड पेस्ट करें, हमें गंभीरता से अधिक जानकारी की आवश्यकता है :) समस्या संभवतः गोल त्रुटियों / सटीकता के साथ कुछ कर सकती है।

@JaakkoLipsanen, वहाँ, मैंने कुछ कोड जोड़ा है :)
Freesnöw

1
थी अभी हाल ही में एक सवाल एक समान विषय पढ़ने लायक भी हो सकता है कि पर।
एंड्रयू रसेल

जबकि आपकी टाइलों के बीच की लाइनों के बारे में सवाल का जवाब दिया गया है, मैंने देखा कि आपकी टाइलों (यानी खराब घास की बनावट) पर भी लाइनें हैं । यदि आप उसे भी ठीक करना चाहते हैं, तो इसे पढ़ें: gas13.ru/v3/tutorials/sywtbapa_almighty_grass_tile.php
Dan

जवाबों:


19

मुझे लगता है कि यद्यपि आपकी टाइल की स्थिति पूर्णांक में परिभाषित की गई है, तो आपकी कैमरा स्थिति नहीं हो सकती है। इसलिए यदि आप पिक्सेल-परफेक्ट पोज़िशन को नॉन -पिक्सल-परफेक्ट पोज़िशन से रेंडर करने की कोशिश कर रहे हैं तो सैंपलिंग बंद हो सकती है और टाइल्स के बीच में लाइनें बन सकती हैं। आपकी SpriteBatch.Drawकॉल्स में, मैं यह सुनिश्चित करने के लिए सैम्पलरस्टेट को बदलने का सुझाव दूंगाPointClamp कि बनावट को एक बिंदु के आधार पर सैंपल किया जाए और यह उन अतिरिक्त लाइनों को हटा दे।

आपका कोड संशोधित:

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

1

मुझे DirectX 11 के साथ ऐसी ही समस्या थी और यह मेरे लिए काम कर रहा था:

मैंने नमूना स्थिति विवरण में बनावट पता मोड को बदल दिया। बनावट पता मोड का उपयोग यह नियंत्रित करने के लिए किया जाता है कि Direct3D सीमा के बाहर बनावट के निर्देशांक के साथ क्या करता है (DirectX 11 में, यह है [0.0f, 1.0f])। मैं बदल गया ADDRESS_U, ADDRESS_V, ADDRESS_Wके लिए सदस्यों को D3D11_TEXTURE_ADDRESS_CLAMPजो श्रेणी में बनावट निर्देशांक के बाहर के रेंज मूल्यों clamps।

यदि आपके कोड में एक अनुरूप पैरामीटर है तो इससे मदद मिल सकती है।


0

मुझे अपनी टाइलों के बीच की रेखाओं के साथ भी ऐसी ही समस्या थी, लेकिन सैंपलर स्टेट को प्वाइंट क्लैंप में बदलने से समस्या ठीक नहीं हुई।

इसके बजाय मैंने पाया कि बहु-नमूनाकरण को बंद करना और ऊर्ध्वाधर ट्रेस को सिंक्रनाइज़ करना समस्या को निर्धारित करता है। यह XNA 4.0 में है:

public GraphicsDeviceManager _graphics;

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

उम्मीद है कि इससे वहां किसी को मदद मिलेगी!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.