2013-04-30 108 views
0

我已經開始了一個新的XNA項目,並且在類之間有一些問題進行通信。基本上,我正在爲基於磁貼的平臺遊戲設置框架,目前有兩個非常簡單的類。c#無法訪問解決方案中的其他類

一個類,Tile(Tile.cs)包含和枚舉,命名爲TileCollision和一個名爲Tile的結構。

其他,Level(Level.cs)。任何時候我嘗試引用TileCollision或嘗試創建Tile時,都會說它在當前上下文中不存在。

還有什麼我需要做的,讓這兩個班談?它們位於相同的命名空間中,不需要添加引用,因爲它們不是編譯DLL的或任何東西。不知道我錯過了什麼。

下面是Tile.cs代碼:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Graphics; 

namespace PoriPlatformer 
{ 
class Tile 
{ 
    // Controls the collision detection and response behavior of a tile. 
    enum TileCollision 
    { 
     // A passable tile is one which does not hinder player motion at all, Example: Air 
     Passable = 0, 

     // An impassible tile is one which does not allow the player to move through it at all 
     // It is completely solid. 
     Impassable = 1, 

     // A platform tile is one which behaves like a passable tile except when the player 
     // is above it. A player can jump up through the platform as well as move past it 
     // to the left and right, but can not fall through the top of it. 
     Platform = 2, 
    } 

    struct Tile 
    { 
     public Texture2D Texture; 
     public TileCollision Collision; 

     public const int Width = 40; 
     public const int Height = 32; 

     public static readonly Vector2 Size = new Vector2(Width, Height); 


     // Constructs a new tile 
     public Tile(Texture2D texture, TileCollision collision) 
     { 
      Texture = texture; 
      Collision = collision; 
     } 


    } 

} 
} 

下面是Level.cs違規代碼:

// Loads an individual tile's appearance and behavior. 
    private Tile LoadTile(char tileType, int x, int y) 
    { 
     switch (tileType) 
     { 
      // Blank space 
      case '.': 
       return new Tile(null, TileCollision.Passable); 

      // Passable platform 
      case '~': 
       return LoadTile("platform", TileCollision.Platform); 

      // Impassable block 
      case '#': 
       return LoadTile("block", TileCollision.Impassable); 

      case '_': 
       return LoadTile("ground", TileCollision.Impassable); 


      default: 
       throw new NotSupportedException(String.Format("Unsupported tile type character '{0}' at position {1}, {2}.", tileType, x, y)); 
     } 
    } 

在Level.cs下劃線部分是TileCollision

+0

我們展示你的代碼。那個錯誤信息說了別的。 – tnw 2013-04-30 19:49:21

+0

您錯誤地指出您正在嘗試訪問不存在的「Tile」。我們需要更多代碼才能完全幫助您。 – MyCodeSucks 2013-04-30 19:56:11

+3

Level.cs中有哪些命名空間? – joe 2013-04-30 19:56:35

回答

2

正如我在我的評論中,TileCollision是類Tile的成員。要訪問它,你必須有一個Tile的實例。

一個更好的辦法是移動枚舉聲明TileCollision外之類的,就像這樣:

public enum TileCollision 
{ 
     Passable = 0, 
     Impassable = 1, 
     Platform = 2, 
} 

class Tile { ... } 

然後,假設Level.cs是在同一個命名空間,之類的語句:

return new Tile(null, TileCollision.Passable); 

應該工作。

+0

你不需要'Tile'的實例,你只需要將它引用爲'Tile.TileCollision' – Cemafor 2013-04-30 20:04:23

+0

你完全正確。我從另一個項目中獲取了一些代碼,並將其直接粘貼到新創建的文件中,因此無意中將其添加到類中,而不是創建枚舉和結構。 – Eric 2013-04-30 20:04:54

+0

甚至不需要執行'Tile.TileCollision'。 'TileCollision'工作得很好。雖然從技術上講它並沒有受到傷害。 – Eric 2013-04-30 20:05:47

2

請參閱this post

您的Tile類中定義的枚舉和結構的默認範圍是私有的,所以它們只能從Tile類訪問。您需要將它們更改爲internal或public,以使它們可以從同一名稱空間中的另一個類中看到。

1

TileCollision和Tile(嵌套結構)需要公開才能在類之外看到。另外,你需要先用有外部類中引用它們:

... 
return LoadTile("block", Tile.TileCollision.Impassable); 
... 

... 
new Tile.Tile(); 
... 
相關問題