2012-02-03 2 views
3

저는 파이썬과 파이 게임으로 게임을 만들고 있어요. 이를 위해 그래픽은 NES와 같은 오래된 비디오 게임 콘솔 스타일입니다. 따라서 그래픽은 2 비트 (4 색) 이미지가있는 단일 타일셋 파일로 구성되며로드 할 때 이러한 이미지에 임의의 4 색 팔레트를 할당 할 수 있기를 원합니다.팔레트 된 이미지에 다른 팔레트 인덱스 지정

내가하고 싶은 것은 8 색 (256 색) 팔레트 모드를 사용하는 것이다.이 모드는 내가 4 색의 64 색 하위 팔레트로 나눈 팔레트와 함께 사용된다. 2 비트 그래픽 파일에서 16x16 타일을로드 할 때마다 이러한 가상 4 색 팔레트 중 하나를 할당하려고합니다. 따라서 원시 타일 세트 파일에서 팔레트 색인은 2 비트 색인 파일이므로 0-3이됩니다. 이 파일의 타일을 메모리에로드하고 함수를 사용하여 0-3의 팔레트 색인을 선택하여 원하는 팔레트 오프셋으로 재지 정하여 화면에 blit 할 때 색상이 4 색으로 표시되도록합니다. 팔레트 - NES 하드웨어와 매우 유사합니다. 이 설명하기 조금 털이 도착, 그래서 어쩌면이 그림은 조금 더 명확하게 : 나는 파이 게임과 PIL의 매뉴얼을 둘러 보았다 날이 같은 팔레트 파일을 조작 할 수 있습니다 아무것도 발견되지 않은

enter image description here

. 조사 할 다른 libs가 있습니까, 아니면 내가 보지 못하는 더 간단한 해결책이 있습니까? 나는 개인적으로 이런 짓을하지 않았지만

+0

트루 컬러 모드에서 게임을 실행하면 해결 방법으로 Pygame의 PixelArray.replace를 사용할 수있는 것으로 나타났습니다. 이것은 아마도 효과가있을 것입니다. 그러나 이것을 더 우아하게 할 수 있다면 여전히 방법을 알고 싶습니다. – egj

답변

0

당신은 pygame.Surface.set_palette_at()이 작업을 수행 할 수 있습니다. 귀하의 경우에는, 당신이 그렇게 특정 블록을 recolour에하는 예순넷 블록에 대한 네 가지 색상을 가지고, 당신은 사용할 수 있습니다 :

for n, newRGBA in enumerate(fourNewColours): # where fourNewColours are the RGBA tuples you want to plop into the palette. 
    GameSurface.set_palette_at(palette_offset + n, newRGBA) # where palette_offset is the number of the first palette index you want to replace (adding n to increment your way through the new colours). 

이것은 당신이 네 가지 색상의 개별 블록을 교체하는 방법입니다. 모든 팔레트를 게임 표면에 밀어 넣는 것은 더 복잡 할 수 있습니다. 왜냐하면 파이 게임이 blit'd 이미지의 팔레트와 비슷하기 때문에 대상 표면의 색인을 직접 바꾸는 대신에. 중복 색인 RGBA 값을 사용하여 픽셀을 다시 칠하는 방법을 알지 못하기 때문에 더 복잡합니다. 예를 들어 팔레트 14/2와 팔레트 40/1이 모두 (90,91,200,255) 인 경우, 파이 게임이 RGBA 값을 가진 모든 픽셀을 팔레트 인덱스 57 (Pal14/2에서)로 할당 할 것인지, idx 160에서 Pal40/1에 대해 아무 것도, 또는 두 개가 구별되는 경우 이미지를 즉석에서 다시 색칠하려는 경우 문제가 될 수 있습니다. 약간 긴 경로를 사용하고 게임 팔레트를 변경하면 안정적으로 작동해야합니다. 필요에 따라 다음 블럭 전송 (또는 재 블리트는) 나중에 관련 새로운 팔레트로 표면. (이 두 가지 이상 잘 그리고 반 년이 지난 지금에도 불구하고) 유용

희망을!

당신이보고 싶다면 이 답변의 긴 형식 버전은 체크 아웃 this link.