【问题标题】:Initializing a non-static class with a texture2d variable使用 texture2d 变量初始化非静态类
【发布时间】:2013-04-15 20:13:56
【问题描述】:

我正在学习 XNA(和一般的 C#),在尝试编写自己的小横向滚动条以用于学习目的时,我偶然发现了以下问题。

关卡是从瓦片构建的,由于我不想在每次实例化时都将纹理传递给瓦片(例如return new Tile(positionVector2, TEXTURE)),因此默认情况下应该使用此纹理构建类。

现在我无法让它工作,我尝试使用这样的构造函数:

public Tile(Vector2 position)
{
   this.texture = Platformer03.Texture;  
}

其中Platformer03 是游戏类,Texture 是加载的平铺纹理的属性。 现在由于Platformer03 是类而不是实例(它不是静态的),这显然不起作用,但我什至找不到Platformer03 的实例(它称为game1,但超出范围)。

所以我确定我做错了,但是如何让 Tile 类在每次实例化时使用特定的 texture2d?

请保持温和,尽管您可能无法想象一个更愚蠢的问题,但我可以向您保证,在过去的几个小时里,我已经像疯子一样在谷歌上搜索和阅读以弄清楚这一点。

【问题讨论】:

    标签: c# constructor initialization xna-4.0 texture2d


    【解决方案1】:

    如果您将Platformer03 下的Texture 变量设置为static 变量,则无需Platformer03 类本身的实例即可访问它(前提是它未标记为私有或受保护)。

    如果您找不到 Platformer03 类,可能是您没有在正确的命名空间中查找?

    【讨论】:

    • 嘿,将 texture2d 变量及其属性设为静态确实有效,非常感谢!关于 Platformer03 类:我找到了类,但它不是静态的。因此,我想找到名为“游戏”的类的实例。 program.cs 的 Main 方法如下所示:using (Platformer03 game = new Platformer03()) { game.Run(); } 现在根据 MSDN,使用“定义一个范围,将在该范围之外释放一个或多个对象”。这就是为什么我不能在其他类中“看到” Platformer03 的“游戏”实例? (命名空间到处都是一样的)如果是这样,我可以改变使用吗?
    • 类本身不应该是静态的,只有变量。然后,您可以在不知道类的实例的情况下访问静态变量(因为它是静态的,这意味着它在类的所有实例之间共享)。如果你传递一个对象的实例(在这种情况下,你的 game 变量),你只能“看到”一个对象的实例。
    • 直到现在我只在静态类中使用静态变量,感谢你拓宽了我的视野(如果那是一个短语的话)!! :D 现在一切都很好,再次感谢!
    【解决方案2】:

    我不确定我是否理解您的问题,但如果在您的Platformer03 构造函数中您已经在加载所需的纹理,您可以实例化一个新的Platformer03 并获取它。 像这样:

    public Tile(Vector2 position)
    {
        Texture = new Platformer03().Texture;
    }
    

    或者,如果在您的Plataformer03 中,您将只在Texture 中为Platformer03 的所有不同对象使用一个值,您可以在非静态类中拥有一个静态成员,如下所示:

    class Platformer03
    {
        public static Texture2D Texture = ... ;
    }
    class Tile
    {
        public Tile(Vector2 position)
        {
            this.texture = Platformer03.Texture;
        }
    }
    

    对不起我的英语。

    【讨论】:

    • 是的,我也想到了第一个,但是由于“platformer03”是游戏,基本上,我不想要第二个(现在),我想它不会是干净的解决方案来创建一个全新的游戏实例以“输出”纹理。你的第二个建议是我现在选择的,据我了解,是威廉邓肯建议的,对吧?最后一个问题,与我的主要问题完全无关:你使用“this.texture”,虽然我理解你为什么使用它,但有必要吗?关于你的英语:我也是“外国人”,所以不用担心!只要我们都互相理解,一切都很好。
    • 我们通常使用this 来表示一个类的当前对象(更重要的是保持代码清晰和美观,并且因为您可以创建一个Texture 到类,另一个到方法,在这种情况下,要调用类的 Texture,您将需要 this)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 2020-12-09
    • 2011-08-22
    • 2010-12-22
    • 2018-12-19
    • 1970-01-01
    • 2015-12-09
    相关资源
    最近更新 更多