c#无法访问解决方案中的其他类

时间:2013-04-30 19:48:07

标签: c# visual-studio-2010 class xna

我已经开始了一个新的XNA项目,并且在类之间进行通信时遇到了一些问题。从本质上讲,我正在为基于磁贴的平台游戏设置框架,目前有两个非常简单的类。

一个类,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.c中的

下划线部分为TileCollision

3 个答案:

答案 0 :(得分:2)

请参阅this post

在Tile类中定义的枚举和结构的默认范围是私有的,因此它们只能从Tile类访问。您需要将它们更改为内部或公共,以便从同一名称空间中的另一个类可以看到它们。

答案 1 :(得分:2)

在我发表评论时,TileCollision是班级Tile的成员。要访问它,您必须拥有Tile的实例。

更好的方法是将TileCollision的枚举声明移到课堂外,如下所示:

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

class Tile { ... }

然后,假设Level.cs在同一名称空间中,语句如:

return new Tile(null, TileCollision.Passable);

应该工作。

答案 2 :(得分:1)

TileCollision和Tile(嵌套结构)需要公开才能在类之外看到。此外,您需要首先使用外部类来引用它们:

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

...
new Tile.Tile();
...