Использование SpriteBatch.Begin () в других SpriteBatch.Begin () - PullRequest
1 голос
/ 14 марта 2011

Эй, ребята, я пытаюсь использовать следующую логику рисования:

Class Game
{
    Character x;

    public Draw(...)
    {
        spriteBatch.Begin(transformation1);
        x.Draw();
        spriteBatch.End();

        spriteBatch.Begin(transformation2);
        otherThing.Draw();
        spriteBatch.End();
    }
}

Class Character
{
    Animation[] animations;
    int currentAnimation;

    public Draw(...)
    {
        this.animations[this.currentAnimation].Draw();
    }
}

Class Animation
{
    Frame[] frames;
    int currentFrame;

    public Draw(...)
    {
        this.frames[this.currentFrame].Draw();
    }
}
Class Frame
{
    Texture2D texture;
    Texture2D shadow;

    public Draw(...)
    {
        spriteBatch.Begin(sub_transformation1);
        spriteBatch.Draw(texture1, ...);
        spriteBatch.End();

        spriteBatch.Begin(sub_transformation2);
        spriteBatch.Draw(shadow, ...);
        spriteBatch.End();
    }
}

Если я попробую эту логику, я получу «Begin не может быть вызван снова, пока End не будет успешно вызван».ошибка.Поэтому я спрашиваю, возможна ли эта логика / имеет ли смысл?Я использую Begin () в Begin (), чтобы сделать аддитивные преобразования.Если у меня есть символ на x = 100 и y = 100, и я хочу, чтобы текстура и тень рамки и все остальное, что я хочу (ограничивающие рамки и т. Д.), Были нарисованы с использованием этого перевода 100 100, плюс -Xscale или + Xscaleперевернуть по горизонтали символ (я знаю, что я мог бы использовать SpriteEffects.FlipHorizontally в .Draw, но я хотел что-то, что автоматически применяется к нижним уровням (анимация и рамка)), и, наконец, на уровне кадра текстура имеет преобразованиеверхняя часть от персонажа, а тень имеет еще одну.Не знаю, хорошо ли я объяснил, но спросите, есть ли у вас какие-либо сомнения.

Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 14 марта 2011

Я вроде понимаю, откуда ты, но это просто невозможно.SpriteBatch не может быть иерархическим, как вы хотите.Ваши объекты, однако, могут.

Отредактировано немного, чтобы ответить на ваш вопрос ниже:

Class Frame
{
    // World - parent transformation to build from, passed 
    // from animation, from character, on up the chain...
    // localTransform - local coordinates
    // shadowTransform - maybe not needed?
    public Draw(Matrix world, Matrix localTransform, Matrix shadowTransform)
    {
        spriteBatch.Begin();
        spriteBatch.Draw(
            texture1, 
            ..., 
            Matrix.Transform(world * localTransform),
            ...);

        spriteBatch.Draw(
            shadowTexture, 
            ..., 
            Matrix.Transform(world * localTransform * shadowTransform), 
            ...);

        spriteBatch.End();
    }
}

Вам не нужно передавать всю информацию о персонаже или объекте в кадр - просто нужнопреобразование, которое будет установлено родителем кадра.Ваш исходный код уже получал преобразование (sub_transformation1 и 2) откуда-то - здесь мы просто передаем это значение в функцию Draw.Вы также можете сделать переменную класса localTransform, установить ее для экземпляра.

Класс Animation будет иметь аналогичную сигнатуру Draw (Matrix world ...).Я думаю, что он достигает того, что вы ищете, и в некотором роде похож на то, как OpenGL обрабатывает вещи - просто больше руководства (из того, что я помню об этом много лет назад).gamedev.stackexchange.com и по вопросам, связанным с игрой.

0 голосов
/ 15 марта 2011

Если вы думаете о SpriteBatch с точки зрения традиционной модели преобразования World / View / Project:

Вы должны выполнить преобразование "World" в вызове Draw.То есть, если ваш спрайт на position, вы должны нарисовать его на position.Если у него есть тень на position + 100, нарисуйте ее там же.

Вы должны выполнить преобразование вида (и проекта, если вам это нравится) - это ваше преобразование "камеры" - вBegin call.

(Есть несколько ситуаций, когда вы можете получить преобразование мира только с помощью матрицы, но это довольно необычно.)

Вы не можете "складывать" преобразованияв SpriteBatch вам придется реализовывать это внешне.

...