2009-08-02 1 views
2

Я счастливо кодировал игру с открытым исходным кодом для удовольствия, но я только понял, что Graphics.setColor() не понимает 0xAARRGGBB. Я хочу получить более прозрачный цвет, в котором я бы нарисовал несколько дуг (дисков). Моя цель состояла в том, чтобы заставить их сиять, как друг на друга, как на этом изображении: http://kenai.com/projects/xplode (логотип там)Нарисуйте прозрачные дуги, а не изображения, в J2ME?

Я знаю, что манипуляции с прозрачностью возможны с изображениями (getRGB и т. Д.), Но это очень медленно для игры с большим размером и изменения прозрачности.

Есть ли способ рисовать прозрачные масштабируемые диски в J2ME, без использования JSR 184 или JSR-226? Я боюсь, что теперь есть «хороший» способ справиться с этим, и я буду продолжать без этих эффектов, но почему бы не спросить, когда он нужен?

ответ

2

Прозрачный материал не должен быть медленным, пока вы держите его на минимуме и держитесь подальше от очень старых телефонов. Следует также отметить, что альфа иногда игнорируется в некоторых реализациях, а иногда и квантуется до уродливых уровней (некоторые телефоны Motorola привязывают альфа-значения к ближайшему 2-битовому значению. Bleh).

У меня возникнет соблазн приблизиться к этому как один прозрачный слой, наложенный на экран. Сохраняйте массив int размером вашего экрана, на котором вы будете строить свои прозрачные пиксели (int [width * height]). На каждом кадре сделайте вызов Image.createRGBImage и нарисуйте это изображение на экране.

В качестве эксперимента вы можете сначала убедиться, что альфа-обработка не замедлит вас, заполнив этот массив постоянным значением и построив его на экран. Например. 0x80FF0000 должен сочетать красный оттенок с экраном, и вы можете легко увидеть, будет ли этот альфа-бизнес работать на вашем выбранном телефоне, т. Е. Вы можете измерить, как он влияет на частоту кадров.

Далее вам нужно нарисовать круги в этом массиве. Ищите Bresenham's circle drawing algorithm и переработайте его, чтобы нарисовать в int массив пикселей. Возможно, вам понадобится поддерживать таблицу поиска, которая имеет предварительно рассчитанный радиус/sqrt (2) для каждого радиуса, который вы хотите построить.

Далее следует, как смешивать цвета, чтобы их совпадение. Простейшим было бы просто построить значение цвета с альфой в пиксель. Вы не получили бы цветное смешивание с уже нанесенными кругами, но это было бы дешево, и круги бы смешались с фоном.

Другим методом является игнорирование цветовой смеси, но для простого слияния с альфой. Например.

newColour = ((destColour & 0xFF000000) + 0x20000000) | srcColour; 
/* Where source colour is of the form 0x00RRGGBB. Note: Adding 0x20 to alpha each 
* time will only work for 7 overlapping circles. */ 

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

Если вы хотите сделать точную цветовую смесь, то вычисления намного сложнее, особенно если вы смешиваете одно значение с альфой на другом с альфой, поскольку цветные вклады от каждого пикселя варьируются в зависимости от доли альфы в каждый цвет. Это не невозможно, но сделать его эффективным - это боль. У меня возникнет соблазн пойти на более дешевый вариант.

+0

Отличная идея, спасибо!Я сразу же напишу несколько примеров кода, чтобы проверить, могут ли устройства обрабатывать такой подход. –

1

Я не уверен, что вы можете сделать такую ​​вещь достаточно эффективно, используя только класс Graphics. Почему бы вам не попробовать OpenGL ES Specification для MIDP JSR 239?

1

Вместо того, чтобы создавать изображения каждого кадра с createRGBImage(), вы можете попробовать использовать getRGB() и drawRGB()

Смежные вопросы