Được rồi, vì vậy, ở đây chúng tôi đi. Tôi đang cố gắng tạo một ứng dụng, sử dụng XNA làm cơ sở vì trình kết xuất của nó. Một trong những điều cần thiết trong dự án này là để mở một cửa sổ mới (như một hộp thoại), trong đó được nhúng một bảng điều khiển XNA riêng biệt. Tôi đang sử dụng điều này như một bảng điều khiển xem trước tương tác, vì vậy tôi hoàn toàn cần XNA để render trong đó. Tuy nhiên, có vẻ như XNA không được trang bị tốt để làm điều này. Tôi đã thử nhiều thứ khác nhau, nhưng không có kết quả (hoặc tạo lỗi và không hiển thị chính xác hoặc hiển thị sai tỷ lệ khung hình, v.v.). Thông thường, tôi sẽ đăng mã ở đây, nhưng vì tôi đã có ít may mắn như vậy, nên không có nhiều bài đăng. Ứng dụng của tôi hiện đang bao gồm một ứng dụng XNA được nhúng trong một Form, và tôi có một nút để mở bảng xem trước, trong đó lý thuyết sẽ bật lên như một hộp thoại Form, chứa XNA renderer, cho phép tôi vẽ xem trước. Tôi đã cố gắng này trong vài giờ, và không có nơi nào, vì vậy tôi yêu cầu một chút giúp đỡ ở đây.XNA với Windows Forms - Mở cửa sổ mới
Cảm ơn, dù sao đi nữa.
EDIT: OK, tôi đã thực hiện một chút tiến bộ, nhưng tôi có 2 vấn đề. Thứ nhất, bất kỳ kết cấu nào được vẽ bằng một lô sprite đều xuất hiện đúng kích thước, nhưng được tô đầy bằng màu đen. Ngoài ra, khi tôi mở hộp thoại, và sau đó đóng nó, và đóng ứng dụng, tôi nhận được một AccessViolationException. Tôi mạnh mẽ nghi ngờ hai lỗi được liên kết theo một cách nào đó.
Đây là mã của tôi khởi chạy hộp thoại xem trước. (a là một lớp tùy chỉnh về cơ bản bao gồm một LinkedList của các đối tượng Texture2D).
animPrev = new AnimationPreview(a);
animPrev.Show();
lớp AnimationPreview tôi là một phần mở rộng của lớp Form, và chứa một đối tượng PreviewControl, đó là một phần mở rộng của GraphicsDeviceControl tìm thấy trong các mẫu XNA Winforms. Lưu ý rằng biểu mẫu chính của tôi mở rộng lớp Trò chơi XNA, vì nhiều lý do khác nhau.
đối tượngCác PreviewControl được thiết lập như thế này:
protected override void Initialize()
{
sb = new SpriteBatch(GraphicsDevice);
Application.Idle += delegate { Invalidate(); };
}
Và phương thức Draw chứa:
protected override void Draw()
{
GraphicsDevice.Clear(Microsoft.Xna.Framework.Graphics.Color.Violet);
if (frame != null)
{
sb.Begin();
sb.Draw(Image, Vector2.Zero, Color.White);
sb.End();
}
}
này xóa nền của hình thức tím, như mong đợi, và vẽ một hộp đen có cùng kích thước với Hình ảnh. Điều này không được mong đợi. Hy vọng rằng ai đó có thể giúp tôi ở đây.
LƯU Ý: Một giải pháp thay thế có thể chấp nhận được là chuyển đổi các đối tượng XNA Texture2D thành đối tượng System.Drawing.Image. Tuy nhiên, tôi đang sử dụng XNA 3.1, vì vậy tôi không thể lưu kết cấu vào luồng và tải lại nó. Trên thực tế, sau khi đã thử điều này, nó có một chút tinh ranh, và rất chậm, vì vậy tôi không muốn làm theo cách này.
Bạn đang sử dụng [Mẫu XNA WinForms] (http://xbox.create.msdn.com/en-US/sample/winforms_series1)? (Bởi vì, nếu không, đó sẽ là bướC# 1.) –
Không, tôi sẽ cho nó một cái nhìn. – Hoeloe
Hmm ...dường như gần như những gì tôi đang tìm kiếm, nhưng có vấn đề là nó dường như không chứa một vòng lặp cập nhật. Biểu mẫu chính của tôi vào lúc này là một lớp Game, với xử lý được cast thành một đối tượng Form. Tôi cần sử dụng bản cập nhật và vẽ vòng trong cửa sổ mới này. – Hoeloe