2009-08-02 3 views
2

즐겁게 재미있는 오픈 소스 게임을 코딩했지만 Graphics.setColor()이 0xAARRGGBB를 이해하지 못한다는 사실을 깨달았습니다. 좀 더 투명한 색을 원한다. 나는 원호를 그린다. 내 목표는이 이미지에서 서로를 서로 빛나게하는 것이 었습니다.J2ME에서 이미지가 아닌 투명 호를 그립니까?

투명도 조작은 이미지 (getRGB 등)에서 가능하지만 크기가 많은 게임의 경우 매우 느립니다. 투명성이 바뀝니다.

JSR 184 또는 JSR-226을 사용하지 않고 J2ME에서 투명한 확장 가능한 디스크를 그릴 수있는 방법이 있습니까? 나는 지금 그것을 다루는 "좋은"방법이 있다는 것을 두려워하며 나는이 효과가없이 계속 진행할 것이다. 그러나 도움이 필요할 때 왜 묻지 않느냐?

답변

2

투명성을 유지하고 아주 오래된 핸드셋에서 멀리 떨어져있는 한 투명 용지는 느릴 필요가 없습니다. 일부 구현에서는 알파가 무시되는 경우가 종종 있고, 때로는 못생긴 수준으로 양자화되는 경우도 있습니다 (일부 모토로라 휴대 전화는 알파 값을 가장 가까운 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

그래픽 클래스만을 사용하여 비교적 효율적인 방법으로 그런 일을 할 수 있는지 확실하지 않습니다. MIDP JSR 239 용 OpenGL ES 사양을 사용해 보시지 않겠습니까?

1

대신 이미지를 createRGBImage()와 각 프레임을 만드는 당신은 getRGB를()와 drawRGB()를 사용하여 시도 할 수 있습니다

관련 문제