Tại sao có các đường ở giữa gạch của tôi?


14

Tôi đang tạo một trò chơi XNA từ trên xuống. Các bản đồ được tạo ra bởi gạch. Một vấn đề gần đây tôi nhận thấy là một 'lưới' các đường giữa các ô. Nó chỉ hiển thị đôi khi và chỉ phụ thuộc vào vị trí máy ảnh. Tôi để XNA xử lý định vị, tại sao các dòng này hiển thị?

Dưới đây là một hình ảnh với các dòng:

nhập mô tả hình ảnh ở đây

Tuy nhiên, sau khi di chuyển máy ảnh của tôi chỉ một chút, nó kỳ diệu quay trở lại cách nó được xuất hiện:

nhập mô tả hình ảnh ở đây

Cảm ơn vì bất kì sự giúp đỡ!

BIÊN TẬP:

Đây là điều tốt nhất tôi có thể làm cho mã nguồn, đây là một dự án cực kỳ lớn và việc kết xuất được thực hiện ở nhiều lĩnh vực:

Vòng lặp kết xuất chính Đối với các yếu tố động như gạch:

    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 Lớp học:

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

Nghiên cứu của tôi:

Tôi đã thực hiện một số tìm kiếm vào nó và đây là tôi đã tìm thấy:

  • Vấn đề này được gọi là rách (tôi tin?)
  • Điều này thường xảy ra do sử dụng loại dữ liệu dấu phẩy động để giữ vị trí ô xếp (Tôi đang sử dụng Integervì vậy đây không phải là vấn đề phải không?)

Làm thế nào để bạn vẽ gạch của bạn? Dán mã bản vẽ của bạn và tất cả các mã có liên quan khác, chúng tôi thực sự cần thêm thông tin :) Vấn đề có thể có liên quan đến lỗi làm tròn / độ chính xác.

@JaakkoLipsanen, Ở đó, tôi đã thêm một số mã :)
Freesnöw

1
chỉ thời gian gần đây một câu hỏi về một chủ đề tương tự mà có thể có giá trị đọc quá.
Andrew Russell

Trong khi câu hỏi về các đường giữa các gạch của bạn đã được trả lời, tôi nhận thấy cũng có các đường trên gạch của bạn (tức là kết cấu cỏ xấu). Nếu bạn cũng muốn sửa nó, hãy đọc nó: gas13.ru/v3/tutorials/sywtbapa_almighty_grass_tile.php
Dan

Câu trả lời:


19

Tôi giả sử rằng mặc dù vị trí ô của bạn được xác định theo số nguyên, vị trí camera của bạn có thể không. Vì vậy, nếu bạn đang cố gắng hiển thị các vị trí hoàn hảo pixel từ vị trí không hoàn hảo pixel thì việc lấy mẫu có thể bị tắt và gây ra các đường giữa các ô. Trong các SpriteBatch.Drawcuộc gọi của bạn , tôi khuyên bạn nên thay đổi SamplerState để PointClampđảm bảo rằng các kết cấu được lấy mẫu trên cơ sở điểm và nó sẽ loại bỏ các dòng bổ sung đó.

Mã của bạn được sửa đổi:

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

1

Tôi gặp vấn đề tương tự với DirectX 11 và điều này hiệu quả với tôi:

Tôi đã thay đổi chế độ địa chỉ kết cấu trong mô tả trạng thái lấy mẫu. Chế độ địa chỉ họa tiết được sử dụng để kiểm soát Direct3D làm gì với tọa độ kết cấu ngoài phạm vi (trong DirectX 11, đây là [0.0f, 1.0f]). Tôi đã thay đổi ADDRESS_U, ADDRESS_V, ADDRESS_Wcác thành viên D3D11_TEXTURE_ADDRESS_CLAMPtrong đó kẹp out-of-phạm vi giá trị của tọa độ texture này vào phạm vi.

Nếu có một tham số tương tự trong mã của bạn thì điều này có thể giúp ích.


0

Tôi cũng gặp vấn đề tương tự với các dòng hiển thị giữa các ô của mình, nhưng việc thay đổi trạng thái bộ lấy mẫu thành Điểm kẹp không khắc phục được sự cố.

Thay vào đó, tôi thấy rằng việc tắt đa lấy mẫu và đồng bộ hóa dấu vết dọc đã khắc phục sự cố. Đây là trong XNA 4.0:

public GraphicsDeviceManager _graphics;

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

Hy vọng điều này sẽ giúp ai đó ngoài kia!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.