2011-09-12 2 views
1

나는 화면을 새로 고침 할 때마다 여러 레이어를 겹쳐서 표시하는 python/pygame을 사용하여 2D 게임을 작성하려고합니다. 표면 (투명하지 않은) 나머지 파이 게임 알파 레이어를 어떻게 효율적으로 지울 수 있습니까?

  • 중경과 다른 속도로 스크롤 :

    • 배경 : 내 기본 설정은 (아래에서 위로)입니다 (정적) SRCALPHA 투명 표면
    • 플레이어/스프라이트/적 : 스프라이트 그룹
    • 를 forground : SRCALPHA 투명 표면 (정적)

    는 지금, 나는이 4 개 개의 레이어 다른 모든 화면의 상단에 하나를 블리 팅하고 있습니다. 배경이 다른 세 개의 레이어와 다른 속도로 스크롤됩니다. 그 이유는 내가 midground와 분리되어 있기 때문입니다. 지금 게임을 구성 했으므로 60fps의 꽤 겸손한 노트북에서 실행됩니다.

    -BUT- 스프라이트 그룹에 문제가 있습니다. 스프라이트 그룹은 화면에 직접 블로깅합니다. 현재 뷰포트에 따라 모든 스프라이트에 대해 rect를 조정해야하는 것은 프로그램을 작성하는 추악한 방법처럼 보입니다.보다 세련된 솔루션을 원합니다.

    나는 스프라이트를 내가 관리 할 수있는 또 다른 투명 표면에 블리트하고 싶다. 그러나 Therin은 내 문제에 속한다. 나는 내 성능의 반이 아닌 투명한 레이어를 지우는 방법을 찾을 수 없다. 내가 해봤 설정의 일부 :

    • 나는 혼합 모드 rgba_sub 흰색 표면에 층을 작성하려고했습니다 (surf.fill ((255,255,255,255)을, 지역, BLEND_RGBA_SUB는)) -이, 슈퍼입니다 super slow
    • 나는 공백 표면의 surface.copy()를 시도했다. 이것은 더 빠르지 만 여전히 내 fps를 반으로 줄인다.
    • 나는 중간층과 스프라이트를 결합하고 pygame.sprite.LayeredUpdates를 사용하여 스프라이트를 업데이트하십시오. 이것은 성능에는 영향을주지 않지만 midground가 투명한 곳에서는 작동하지 않습니다. 배경 레이어 위에 스프라이트의 흔적이 있습니다.

    내가 지금까지 찾은 최고의 해결책은 화면에 직접 스프라이트를 그리는 나의 현재 설정입니다. 그것은 훌륭하게 보이고, 빠르게 움직이지만, 관리 할 고통입니다. 각 스프라이트의 rect는 모든 프레임의 뷰포트에 따라 조정되어야합니다. 또한 충돌 감지를 어렵게 만듭니다.

    파이 게임 투명 표면을 지우는 또 다른 빠른 방법이 있습니까? 빠른 속도로 초당 60 회 이상 수행 할 수 있습니까? 또는 동일한 효과를 여전히 얻을 수있는 레이어가 설치되어 있습니까?

  • 답변

    1

    나는 레이어에 선택적으로 베드로의 솔루션을 적용하여 전용 투명 A 층 스프라이트를 삭제하는 빠른 방법 알아 낸 : (모든 각 프레임을 삭제)이 벌금을 작동하는 것 같군

    for s in self.level.sprites: 
        spritelayer.fill((0), s.rect) 
    

    을 여전히 초당 60 프레임에서 실행 .

    1

    Surface.fill()은 모든 R, G, B 및 A 값을 지 웁니다.

    >>> img = pygame.image.load("hasalpha.png") 
    >>> print img.get_at((300, 300)) 
    (238, 240, 239, 255) 
    >>> surface.fill(0) 
    >>> print img.get_at((300, 300)) 
    (0, 0, 0, 0) 
    

    설명하는대로 수행됩니다. 알파 값에 더 특정한 것을하려는 경우, pygame.surfarray.pixel 함수는 직접 편집 가능한 값을 줄 수 있습니다. 그렇게되면 빠를 수 있지만 의존성으로 numpy가 필요합니다.

    +0

    이것은 surf.fill ((255,255,255,255), area, BLEND_RGBA_SUB)보다 빠르게 실행되는 것처럼 보이지만 전체 레이어에서 실행할 때 여전히 성능이 절반으로 떨어집니다. – drinkdecaf

    +0

    아하! 하지만 스프라이트 직사각형에만 적용하면 빠릅니다. D 감사합니다! – drinkdecaf