Pergunta

Eu estive feliz de codificação um jogo opensource para se divertir, mas eu só percebi que Graphics.setColor() não entende 0xAARRGGBB. Eu quero pegar uma cor mais e mais transparente, em que eu tirar algumas arcos (discos). Meu objetivo era fazê-los brilhar embora uns aos outros como nesta imagem: http://kenai.com/projects/xplode (o logotipo lá)

Eu sei que a manipulação transparência é possível com imagens (getRGB etc) ainda esta prova muito lento para um jogo com lotes de tamanho e transparência alterações.

Existe alguma maneira eu poderia desenhar discos escaláveis ??transparentes em J2ME, sem usar JSR 184 ou JSR-226? Temo que agora há "boa" maneira de lidar com isso e eu só vou continuar sem estes efeitos, mas por que não perguntar quando em necessidade?

Foi útil?

Solução

material

A transparência não precisa ser lenta enquanto você mantê-lo ao mínimo e ficar longe de aparelhos muito antigos. Você também deve observar que alpha, por vezes, é ignorado em algumas implementações e às vezes quantizado para níveis feias (Alguns telefones Motorola tirar alfa valores para o valor de 2 bits mais próxima. Bleh).

eu estaria tentado a abordar esta como uma única camada transparente sobrepostos na tela. Mantenha um array int o tamanho da tela em que você irá traçar os seus pixels transparentes (int [width height *]). Em cada quadro, fazer uma chamada para Image.createRGBImage e desenhar a imagem na tela.

Como uma experiência, você pode primeiro quer ter certeza de que o processamento alfa não vai te atrapalhar, preenchendo essa matriz com um valor constante e traçando que para a tela. Por exemplo. 0x80FF0000 deve misturar uma tonalidade vermelha na tela e você pode ver facilmente se este negócio alfa vai ser viável em seu aparelho escolhido, ou seja, você pode medir como ele afeta sua taxa de quadros.

Em seguida, você precisa círculos enredo para esta matriz. Procure círculo de Bresenham desenho algoritmo e refazê-la para traçar em uma matriz de pixels int. Você pode querer manter uma tabela de pesquisa que tem um pré-calculada raio / sqrt (2) para cada raio que você quer ser capaz de enredo.

Em seguida é como misturar cores para levá-los a se sobrepor. O mais simples seria apenas para traçar um valor de cor com alfa para o pixel. Você não iria ficar a mistura de cores com círculos já plotadas mas seria barato e os círculos se misturar com o fundo.

Outro método seria ignorar a mistura de cores, mas para fazer um simples merge na alfa. Por exemplo.

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. */

A cor do círculo sobrepondo iria dominar o subjacente, mas o alfa se tornaria mais opaca onde eles se sobrepõem que, pelo menos, permitir que o jogador para ver todos os círculos corretamente.

Se você queria fazer uma mistura de cores precisa, em seguida, os cálculos são muito mais complicado, especialmente se você está misturando um valor com alpha para outro com alpha desde as contribuições de cor de cada pixel variam de acordo com a proporção de alfa em cada cor. Não é impossível, mas tornando-se eficiente é uma dor. Eu estaria tentado a ir para uma opção mais barata.

Outras dicas

Eu não tenho certeza se você pode fazer uma coisa dessas de forma razoavelmente eficiente usando a classe Graphics sozinho. Por que você não tenta OpenGL ES Especificação para MIDP JSR 239?

Em vez de criar imagens de cada quadro com createRGBImage () você pode tentar usar getRGB () e drawRGB ()

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top