Làm cách nào để tôi truy cập các biến trong lớp Game1 từ một lớp khác trong XNA?


8

Tôi đang cố gắng viết một SpriteManagerlớp trong XNA, nhưng tôi cần truy cập vào các Gamebiến. Ví dụ, thuộc Game.Contenttính sẽ rất hữu ích trong việc tải họa tiết và Game.GraphicsDevice.Viewportsẽ hữu ích trong việc lấy kích thước cửa sổ.

Hiện tại, tôi có lớp sau:

public MainGame : DrawableGameComponent
{
    public SpriteManager<Enemy> EnemyManager { get; get; }
    public SpriteManager<Powerup> PowerupManager { get; set; }
    ...
}

Tôi có thể nghĩ ra ba cách để có quyền truy cập vào các biến này trong SpriteManagerlớp:

  1. Làm cho lớp quản lý sprite của tôi xuất phát từ GameComponent. Điều này sẽ là lý tưởng, ngoại trừ trình quản lý sprite của tôi được sử dụng MainGame, đó là a GameComponent.

  2. Sử dụng ((Game) Game1)để truy cập các biến. Tuy nhiên, làm loại diễn viên này là xấu xí và phá vỡ đóng gói.

  3. Vượt qua mọi thứ từ MainGame. Ví dụ, EnemyManagercần tải một loại kẻ thù ngẫu nhiên mỗi lần nó sinh ra kẻ thù, vì vậy thay vì tải họa tiết vào MainGame, hãy chuyển EnemyManagerthuộc Game.Contenttính và để nó xử lý tải kết cấu. Tuy nhiên, tôi không chắc đây có phải là cách xử lý tình huống tốt nhất hay không. Tôi không thể đặt ngón tay của mình lên nó, nhưng có vẻ như 'sai' theo một cách nào đó.

Tôi có thể sử dụng một số lời khuyên về cách tốt nhất để đạt được điều này.

Câu trả lời:


3

Đừng làm điều đó - làm cho trình quản lý sprite thay thế.


Cảm ơn, đây là lần đầu tiên tôi nghe nói về dịch vụ trò chơi. Nó trông giống như tiêm phụ thuộc, nhưng tôi chỉ hơi quen với nó.
Daniel T.

@Daniel: Container phụ thuộc và container dịch vụ là hai loại Inversion of Control . Xem câu trả lời này để biết thêm chi tiết.
BlueRaja - Daniel Pflughoeft

1
Mọi người đều rất nhanh để biến nó thành một dịch vụ trò chơi. Nó không phải là xấu để làm cho nó công khai. Bạn chỉ có 1 phiên bản trò chơi ..
Setheron

2

Trên thực tế # 2 không phải là quá xấu (Tôi sẽ cho rằng bạn có nghĩa là để xuống đúc từ Gameđến Game1). Bạn có thể thực thi kiểu đang có Game1trong hàm tạo của mình như vậy:

public MainGame : DrawableGameComponent
{
    public MainGame(Game1 game) : base(game) { }
}

Bạn thậm chí có thể làm cho một tài sản thuận tiện tốt đẹp như thế này. Nó sẽ luôn được an toàn, cung cấp bên dưới DrawableGameComponentkhông làm bất cứ điều gì không có giấy tờ.

public Game1 Game1 { get { return (Game1)Game; } }

Hoặc nếu bạn muốn cực kỳ hậu môn về việc không casting (và thực sự không cần phải như vậy), bạn có thể làm điều này:

public MainGame : DrawableGameComponent
{
    public MainGame(Game1 game) : base(game) { this.Game1 = game; }

    public Game1 Game1 { get; private set; }
}
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.