2011-10-01 31 views
8

Vấn đề của tôi là tôi cần biểu diễn một tầng thay đổi độ dài bằng cách sử dụng Texture2D, có nghĩa là một tầng mà các cạnh có hình ảnh của các cạnh và ở giữa nó lặp lại cùng một 'giữa 'image, như vậy: enter image description hereTạo một Texture2D từ nhiều Texture2Ds

Để đạt được điều này, tôi nhận được' cạnh trái ', kết cấu' giữa 'và' cạnh phải ', vấn đề là tôi không biết cách hợp nhất chúng thành một texture2D,

Điều quan trọng là làm điều đó trong thời gian chạy vì chiều dài sàn thay đổi (theo chiều ngang), Tôi đọc bạn có thể làm điều đó bằng cách sử dụng SetData nhưng tôi không biết làm thế nào ...

Điều rất quan trọng đối với tôi là nó sẽ hoạt động như một kết cấu chứ không phải nhiều phần kết cấu bởi vì tôi đang sử dụng Công cụ Vật lý Farseer để di chuyển sàn và sử dụng nó.

Tôi đang sử dụng C# và XNA với Visual Studio 2010, Tôi là một C gần như kinh nghiệm # lập trình viên,

Cảm ơn bạn!

Trả lời

1

Trước tiên, hãy tạo Texture2D mới để làm kết cấu sàn của bạn, chỉ định chiều rộng và chiều cao thích hợp. Sau đó, lấy dữ liệu của ba họa tiết bạn muốn hợp nhất, sử dụng GetData method. Cuối cùng, sử dụng SetData method để đặt dữ liệu của kết cấu mới nếu thích hợp (kiểm tra liên kết, bạn có thể chỉ định chỉ mục bắt đầu).

Cảnh báo: Phương thức GetData và SetData chậm. Nếu bạn chỉ cần tạo texture này một lần cho mỗi game (ví dụ như lúc khởi tạo) thì nó không phải là một vấn đề.

+0

Nếu tôi cần tạo nhiều lần thì sao? – Itamar

+0

Sau đó, chiến lược được đề xuất trong câu trả lời dưới đây là tốt hơn. –

+0

@MajaRemic Mã ví dụ? – matrixugly

2

This answer có thể giúp bạn. Hoặc bạn nên sử dụng HLSL để lặp lại sàn của bạn hoặc bạn nên vẽ sàn của mình trên một RenderTarget và lưu nó dưới dạng Texture đơn. Thưởng thức.

+0

HLSL là gì và bạn có thể đưa ra ví dụ về giải pháp thứ 2 không? – Itamar

+2

Đây là một hướng dẫn nhỏ về [Render Target] (http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series3/Render_to_texture.php). Ngoài ra, nếu bạn kiểm tra trang đó nhiều hơn một chút, bạn sẽ tìm thấy nhiều hướng dẫn khác, bao gồm cả HLSL. –

+0

Không thực sự cần phải viết bóng đổ HLSL của riêng bạn cho điều này, vì bạn sẽ không làm bất cứ điều gì mà SpriteBatch không thể xử lý. –

1

Bạn đang sử dụng Farseer ... nhưng nó không cấm bạn sử dụng một cách tiếp cận ốp lát ...

Tôi không biết Farseer, nhưng tôi cho rằng nó cung cấp một ma trận chuyển đổi ...

làm:

Vector2 pos = Vector2.Zero; 
spriteBatch.Begin(...,....,...,..., Transform); 

spriteBatch.Draw(LeftTexture, pos, null, Color.White); 
pos.X += LeftTexture.Width; 
for (int i=0; i<floor_repeats; i++) 
{ 
    spriteBatch.Draw(MidleTexture, pos , null, Color.White); 
    pos.X += MiddleTexture.Width; 
} 
spriteBatch.Draw(RightTexture, pos , null, Color.White); 
Các vấn đề liên quan