Рисовать прозрачные дуги, а не изображения, в J2ME? - PullRequest
2 голосов
/ 03 августа 2009

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

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

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

Ответы [ 3 ]

2 голосов
/ 03 августа 2009

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

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

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

Далее вам нужно построить круги в этом массиве. Найдите алгоритм рисования окружностей Брезенхама и переделайте его, чтобы построить в массив пикселей 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. */

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

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

1 голос
/ 07 августа 2009

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

1 голос
/ 03 августа 2009

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

...