2013-04-30 71 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(); 
... 
相关问题