2010-10-08 45 views
5

Tôi thường tìm kiếm sự trợ giúp trên diễn đàn XNA nhưng hiện tại họ đang xuống, vì vậy tôi đã đến đây.Lớp người chơi với trò chơi C# XNA của tôi

Tôi đang tạo trò chơi XNA mới và tôi muốn có một lớp người chơi. Hiện tại tôi có một lớp trò chơi chính được gọi là Dots. Điều này đại diện cho trò chơi chính. Đây là cách lớp Player tôi được đặt ra vào lúc này:

namespace Dots 
{ 
    class Player : Microsoft.Xna.Framework.Game 
    { 
     Texture2D PlayerTexture; 
     Vector2 PlayerPosition; 

     public Player() 
     { 
      Content.RootDirectory = "Content"; 
      PlayerTexture = Content.Load<Texture2D>("Player"); 
      PlayerPosition = Vector2.Zero; 
     } 

     public void Update() 
     { 

     } 

     public void Draw(SpriteBatch SpriteBatch) 
     { 

     } 
    } 
} 

Nhưng tôi nhận được một lỗi mà tôi không thể làm việc ra làm thế nào để giải quyết. Lỗi này là:

Lỗi khi tải "Trình phát". Không tìm thấy thành phần GraphicsDevice .

Nó ném nó ở dòng này: PlayerTexture = Content.Load<Texture2D>("Player");.

Tôi thấy trong lớp trò chơi chính có dòng này: Graphics = new GraphicsDeviceManager(this); nhưng tôi không biết phải làm gì với nó. Tôi có chuyển nó đến lớp học Player hay không?

Bất kỳ trợ giúp nào được đánh giá cao, cảm ơn.

+0

Không quen thuộc với XNA, nhưng [bài đăng này] (http://social.msdn.microsoft.com/forums/en-US/xnagamestudioexpress/thread/c2f6b8be-845d-4701-b383-7a0e3cde69f8) ngụ ý rằng bạn không nên ' t tải nội dung trong một hàm tạo. –

+0

Arg. Tôi không có ý tưởng làm thế nào để làm đúng những gì tôi muốn làm. Tôi sẽ phải đợi cho đến khi diễn đàn XNA được mở lại và xem xét cách họ khuyên bạn nên làm. – Wen

+0

Tại sao không hỏi ở đây? Lập trình viên XNA là ... những người lập trình um ... đó là những gì StackOverflow dành cho. – WernerCD

Trả lời

2

CẬP NHẬT: Câu trả lời này có vẻ đúng cho các phiên bản cũ hơn của XNA. Xem Andrew Russell's answer cho những gì đang được sử dụng hiện tại.

Hãy thử ghi đè phương thức LoadGraphicsContent để tải nội dung của bạn. Như được hiển thị trong this tutorial.

protected override void LoadGraphicsContent(bool loadAllContent) 
    { 
     if (loadAllContent) 
     { 
      spriteBatch = new SpriteBatch(graphics.GraphicsDevice); 
      // TODO: Load any ResourceManagementMode.Automatic content 
      t2dMap = content.Load<Texture2D>(@"content\textures\map_display"); 
      t2dColorKey = content.Load<Texture2D>(@"content\textures\map_colorkey"); 
     } 
     // TODO: Load any ResourceManagementMode.Manual content 
    } 
+0

'LoadGraphicsContent' đã lỗi thời trong một thời gian rất dài. –

+1

@Andrew Russell: Cảm ơn, Andrew. Tôi đã cố gắng để giúp các OP cùng mặc dù tôi không quen với XNA. Tôi sẽ để lại câu trả lời ở đây trong trường hợp người khác tình cờ gặp nó. Điều đó, cùng với nhận xét và câu trả lời của bạn cho câu hỏi này, sẽ giúp chỉ đạo mọi người đi đúng hướng trong tương lai. –

-2

Hãy nghĩ rằng tôi đã gặp lỗi tương tự một lần.

Nhấp chuột phải vào Giải pháp trong Solution Explorer.

Chuyển đến Thuộc tính.

Nếu hồ sơ trò chơi là "Hi Def" .. thay đổi thành "Reach".

Soạn thảo và chạy.

+1

Câu trả lời này không đúng. –

6

Trước hết bạn dường như thiếu hiểu biết về cách hoạt động của lớp (và không gian tên). Tôi muốn đề nghị (như tôi cũng đã thực hiện trong một bình luận về câu hỏi khác của bạn) làm việc trên một trò chơi đơn giản mà không cần các lớp học, đầu tiên.

Bây giờ để nói về những vấn đề trong mã của bạn:

Trước hết, để tải nội dung, đồ họa thiết bị cần phải được khởi tạo. Nó không được khởi tạo cho đến khi LoadContent được gọi trong Microsoft.Xna.Framework.Game. Đây là explained in the documentation:

Phương pháp này được gọi là Khởi tạo. Ngoài ra, nó được gọi là bất cứ lúc nào nội dung trò chơi cần phải được tải lại, chẳng hạn như khi sự kiện DeviceReset xảy ra. Bạn không nên truy cập vào GraphicsDevice cho đến khi LoadContent được gọi.

Vì vậy, di chuyển mã nạp của bạn:

protected override void LoadContent() 
{ 
    PlayerTexture = Content.Load<Texture2D>("Player"); 
    PlayerPosition = Vector2.Zero; 
    base.LoadContent(); 
} 

Thông báo nó như thế nào là một override (của một phương pháp bảo vệ).Tôi không thực sự muốn giải thích về ý nghĩa của điều này ở đây, nhưng tôi đề nghị bạn nên tìm hiểu.

Ngoài ra, bạn sẽ thấy rằng DrawUpdate được cho là tương tự như được ghi đè, vì chúng sẽ được gọi từ XNA.

Bây giờ, đây là bit quan trọng: Những gì tôi vừa nói với bạn áp dụng nếu bạn đang kế thừa của bạn trò chơi lớp từ lớp XNA Game. Bằng cách gọi nó là "Người chơi", bạn chỉ ra một sự hiểu lầm về cách thức hoạt động của các lớp.

Nếu bạn đang tạo lớp "Người chơi", hãy xem những gì bạn được kể trong câu trả lời cho your other question.

Bạn cũng có thể tìm thấy giá trị this recent question đáng đọc.

1

Gần đây trong XNA, bạn có thể nhấp chuột phải vào một số tùy chọn nhất định và yêu cầu Intellisense sửa chữa nó cho bạn. Vì vậy, bằng cách nhấp chuột phải vào Texture2D và Rectangle khi bạn đang khai báo bạn sẽ có thể chọn "Giải quyết" và nó sẽ yêu cầu bạn chọn "sử dụng" một số thư viện khác để nó có thể biên dịch sau đó. Xem liệu điều đó có khắc phục được sự cố của bạn hay không. Nhưng, nói chung với các lớp học đặc biệt là tôi sử dụng này và nó hoạt động tốt.

0

Một danh sách kiểm tra về những gì làm việc cho tôi:

  • Hãy thử đặt font trong thư mục gốc của dự án nội dung của bạn
  • Hãy chắc chắn rằng Build Action được thiết lập để Compile
  • Xác minh nội dung của .spritefont tệp (sử dụng câu hỏi này làm tài liệu tham khảo)
  • Đảm bảo bạn đang ở LoadContent hoặc mới hơn trong vòng đời
Các vấn đề liên quan