Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xna 有没有办法判断是否对特定的SpriteBatch对象调用了SpriteBatch.Begin?_Xna - Fatal编程技术网

Xna 有没有办法判断是否对特定的SpriteBatch对象调用了SpriteBatch.Begin?

Xna 有没有办法判断是否对特定的SpriteBatch对象调用了SpriteBatch.Begin?,xna,Xna,我最近刚开始和XNA打交道,在网上找不到关于这个问题的任何信息。有没有办法判断是否对特定的SpriteBatch对象调用了SpriteBatch.Begin(反之亦然End) 目前,我只为系统使用一个基本上是全局的SpriteBatch对象,主要是因为这似乎是我阅读的文章中的首选方法。我假设为每个对象创建一个SpriteBatch实例会导致太多的开销。无论如何,我在保持SpriteBatch.Begin/End同步方面遇到问题。特别是当图形对象可以包含其他图形对象时。如果我可以测试是否调用了Be

我最近刚开始和XNA打交道,在网上找不到关于这个问题的任何信息。有没有办法判断是否对特定的SpriteBatch对象调用了SpriteBatch.Begin(反之亦然End)

目前,我只为系统使用一个基本上是全局的SpriteBatch对象,主要是因为这似乎是我阅读的文章中的首选方法。我假设为每个对象创建一个SpriteBatch实例会导致太多的开销。无论如何,我在保持SpriteBatch.Begin/End同步方面遇到问题。特别是当图形对象可以包含其他图形对象时。如果我可以测试是否调用了Begin/End,那么我的问题就会消失。我想我可以尝试像子类化SpriteBatch类这样的方法,但在我看来,这个操作非常基本,必须有一个内置的方法来判断。我只是不知道怎么做


感谢您提供的任何见解

如果您查看此链接,我想它会回答您的问题,如果此链接与您使用的版本不同,则表示抱歉:

由开发人员决定他们正在编写的代码是否在开始和结束阶段。你要确保你“持有”所有你需要画的东西,直到你称之为“开始”,然后再画

此外,您可能想看看一些关于“游戏循环”的文章,它们是如何操作的,这将有助于您更好地理解如何以一种不应该出现此问题的方式编写代码

希望这有帮助!:-)

例如,创建一个接口,您可以从该接口继承一个Draw()方法。然后回到游戏循环中,确保循环所有要绘制的对象(从该接口继承),并在开始-结束线内调用它们的绘制方法。每个对象内的代码都可以具有图形细节,但您知道,当其假定为。也许这会澄清一点

我假设为每个对象创建一个SpriteBatch实例会导致太多的开销

顾名思义,SpriteBatch用于组织一批精灵,并在缓冲区中以特定方式绘制它们。调用SpriteBatch.End()时,添加到SpriteBatch.End()中的精灵将使用特定的混合模式和在SpriteBatch.End()之前指定的其他选项进行排序(或不排序)并写入缓冲区(例如:屏幕)

调用SpriteBatch.Begin()时,必须先调用SpriteBatch.End(),然后才能再次调用SpriteBatch.Begin()(使用相同的SpriteBatch对象)

所以这个代码是错误的:

class Main
{
    private Ship ship;
    private SpriteBatch spriteBatch;

    //logic to create the ship/spriteBatch

    public override void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Begin();
        ship.Draw(spriteBatch);
        spriteBatch.End();
    }
}

class Ship
{
    private Texture2D image;

    //logic to create the image

    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Begin();
        spriteBatch.Draw(image, Vector2.Zero, Color.White);
        spriteBatch.End();
    }
}
因为spriteBatch.Begin调用了两次。正确的方法是:

class Main
{
    private Ship ship;
    private SpriteBatch spriteBatch;

    //logic to create the ship/spriteBatch

    public override void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Begin();
        ship.Draw(spriteBatch);
        spriteBatch.End();
    }
}

class Ship
{
    private Texture2D image;

    //logic to create the image

    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(image, Vector2.Zero, Color.White);
    }
}

如果您找不到它,那么子类化SpriteBatch以添加一个“haseBeging”标志似乎是一个不错的选择。希望如此。我仍在试图理解每个对象是否应该调用Begin/End,或者它是否应该处于更高的级别。我的直觉告诉我,每个调用Begin/End的对象都更灵活。在这种情况下,我可能会在全局SpriteBatch对象周围放置一个包装器。否则,我想我不需要知道是否调用了Begin/End。使用更高级别的方法,我怀疑(但我还没有足够的XNA经验知道)它会限制我在绘制单个对象时所能做的一些选择。感谢找到该网站,我不知道为什么在谷歌搜索我能想到的所有变化时,它没有出现。我想,我仍然被“如果你正确设置了你的代码……你不需要知道”的评论弄糊涂了。我的意图是让每个对象都画自己,这样每个对象都会调用自己的开始/结束。当对象包含需要绘制的其他对象时,就会出现问题,因此它们在包含的对象上调用Draw。这似乎是一种非常容易理解和灵活的组织方式。这真的不是新华社世界的正确思维方式吗?是和否,很抱歉我的评论含糊不清。你是对的,但是绘图不应该发生在对象本身中。例如,你创建了很多对象,每一个都尽可能地进行逻辑设置,将其绘制到屏幕上。对于isntance位置、颜色、大小等,当您在游戏循环中从初始单次绘制方法调用该对象上的绘制方法时,它只需将自身打印出来。你知道它是从这两个标签中调用的,它会在我可以的时候执行。有什么要澄清的吗?我在下面的评论中问过:SpriteBatch.Begin语句有重载,允许您设置SpriteBlendMode和全局转换矩阵。我不知道我为什么想要或需要这些参数,但我不想写一堆代码,然后发现我确实需要处理这些参数。对于在开始/结束对之间绘制的所有精灵,这些参数是否设置为相同的值,或者可以在开始/结束调用中逐个精灵地更改这些参数。如果所有精灵都是用相同的值绘制的,那么在更高级别调用似乎不是正确的设计。如果我记得正确的话,在开始和结束时绘制的所有精灵都是相同的。你必须有一个单独的开始和结束来改变这些。如果您想这样做,您可能想创建一个单独的类来管理它。这就是为什么XNA有时会变得混乱,它的类要做更多类管理的事情,这些都是由一个类管理的;-)好的,您建议给SpriteBatch打一个顶级电话。开始和结束。如果您可能有很多对象要绘制,这是一个问题吗?还是不是一个问题?另外,调用SpriteBatch.Start是否会要求所有对象使用相同的SpriteBlendMode和转换矩阵,或者每个draw语句都可以更改。没有性能