Отображение "сломанных" спрайтов? - PullRequest
3 голосов
/ 10 марта 2010

Я совершенно новичок в мире 2D-двигателей. Я понял, как загружать изображения и отображать их в виде спрайтов и прочего, но есть один вопрос, который меня беспокоит. Например, когда «ракета» поражает объект, он наносит ему урон и оставляет кратер позади. Я хотел бы показать кратер на этом объекте. Это потребует «пропуска» некоторых пикселей изображения при рендеринге, не так ли? Мой вопрос, как бы вы сделали такую ​​вещь? Какую структуру данных вы бы использовали, чтобы сохранить это? Как отобразить «сломанный» спрайт?

Ответы [ 6 ]

3 голосов
/ 10 марта 2010

Создать лист спрайтов .

Это будет содержать все духи вашего объекта, в данном случае ракеты. Некоторые из этих изображений были бы о том, как ракета разбилась на множество кусков, огонь и т. Д ...

Затем, когда ваш объект попадает, вы проигрываете анимацию столкновения. Ваш метод технически сработает, но это излишне. Использовать спрайт-лист просто, вместо того, чтобы рисовать массивное изображение, вы просто рисуете часть листа и воспроизводите приращение анимации по оси X и Y листа. Это естественно требует, чтобы лист был выложен ровно, но это не слишком много работы.

2 голосов
/ 10 марта 2010

В некоторых ситуациях вы можете просто нарисовать другой спрайт поверх исходного спрайта. Кроме того, вы можете переключаться между различными спрайтами в зависимости от состояния объекта.

1 голос
/ 12 марта 2010
1 голос
/ 12 марта 2010

Я вижу, что вы пометили это XNA, поэтому предположим, что это ваш API (хотя этот ответ вполне может быть применен к любому подходу OpenGL / D3d с соответствующими вызовами). Если вы хотите сделать это элегантно, я предлагаю использовать временную RenderState. Вы бы переключились на новый RenderState и нарисовали исходную текстуру фона, а затем нарисовали спрайты кратера сверху (вы можете изменить свойства AlphaSourceBlend и AlphaDestinationBlend RenderState, чтобы создать искомый вычитающий эффект). *

Как только вы закончите рисовать, вы можете легко извлечь RenderState как текстуру, используя функцию GetTexture().

Имейте в виду, что если вы изменяете режимы наложения, ваш SpriteBatch должен работать в «немедленном» режиме (я забыл термин XNA, но тот, где он не выполняет упорядочение спрайтов для эффективности), иначе будет сброшен неожиданно.

0 голосов
/ 12 марта 2010

Я работал над чем-то вроде этого в мобильной Java-игре, клоне червей / выжженной земли (на самом деле основан на GunBound).

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

Для создания кратера я использовал алгоритм заполнения круга и заполнил «зону взрыва» фоном или прозрачным цветом.

Так что, когда вы проводите тестирование, вы должны сделать это дважды. Тест на скорость для ограничивающего прямоугольника, затем для каждого пикселя, когда ограничивающие прямоугольники перекрываются.

0 голосов
/ 11 марта 2010

Медленно, но, вероятно, достаточно быстро.

public static void Fill(this Texture2D t, Func<int, int, Color> perPixel)
        {
            var data = new Color[t.Height * t.Width];
            for (int y = 0; y < t.Height; y++)
                for (int x = 0; x < t.Width; x++)
                {
                    data[x + (y * t.Width)] = perPixel(x, y);
                }
            t.SetData(data);
        }
...