2012-12-26 3 views
1

회전하는 배경에서 타원을 회전시켜야하는 상대적으로 간단한 애니메이션을 만들려고합니다. 나는 회전하려고 노력하고있는 표면을 가지고 놀기 위해 pygame.transform.rotate을 얻기 위해 약간의 속임수에 의지해야만했다. 즉, 내가 파이 게임의 회전 기능에서 얻은 새로운 RECT를 recenters이 기능을했습니다 :왜 내 표면에 그려진 타원이 보이지 않습니까?

def recenter(orig_rect, rotated_surf): 
    oldcenter = orig_rect.center 

    rotRect = rotated_surf.get_rect() 
    rotRect.center = oldcenter 

    screen.blit(rotated_surf, rotRect) 

functionning 상당히 자기 설명이다. 원래의 (회전하지 않은) 표면이 디스플레이 위에 블리치 된 채로 남아 있다는 것을 알았지 만 실제로 문제가되지는 않습니다. 그것에 대해 걱정하지 마십시오.

상기 함수는 다음과 같은 회전 기능 (배경 & 타원)에 의해 사용된다 :

# width, height, screen are globals 
def rotate_background(surf, speed, t0): 
    new_angle = ((pygame.time.get_ticks() - t0) * (speed/1000)) % 360 

    w, h = surf.get_size() 
    blittedRect = screen.blit(surf, (width/2 - w/2, height/2 - h/2)) 
    recenter(blittedRect, pygame.transform.rotate(surf, new_angle)) 

    return surf 


def rotate_ellipse(surf, coords, speed, t0): 
    new_angle = ((pygame.time.get_ticks() - t0) * (speed/1000)) % 360 
    if new_angle > 90: 
     new_angle = 90 # limit rotation 

    w, h = surf.get_size() 
    x, y = coords 
    blittedRect = screen.blit(surf, (width/2 - w/2 + x, height/2 - h/2 + y)) 
    recenter(blittedRect, pygame.transform.rotate(surf, new_angle)) 

이 회전 기능이 각각의 프레임에 대해 하나라고한다.

다음은 내 게임 루프의 단순화 된 버전입니다. 이는 실제 생산 코드 아니지만 ( 코드베이스로부터 직접 촬영) 상기 요소를 함께 묶는 방법의 예시로서 기능 참고 :

ellipse = create_ellipse() # returns a surf 
background = create_background() # returns a surf 

while True: 
    rotate_background() 
    rotate_ellipse() 
    pygame.display.flip() 

backgroundellipse 변수에 대한 단어 위. 두 변수 모두 상황이 그려진 pygame.Surface 인스턴스를 포함합니다. 그것이 잘 작동하고 있기 때문에 나는 background에 대해 자세히 설명하지 않을 것이다. create_ellipse에서, 타원은 pygame.draw.ellipse에 의해 황색의 ellipse 표면 상에 묘화되었다. 그 전에는 ellipse.fill(GREEN)이 호출되었습니다. ellipse의 컬러 키도 GREEN으로 설정되어 전체 표면이 투명 이도록 노란색 타원을 그렸습니다.

문제점 : 나는 타원이 제대로 소총탄되었는지 확인하기 위해 밖으로 ellipse.set_colorkey 주석 타원

를 확인할 수 없습니다. 그것은. 타원이 회전하면서 치수가 변하는 녹색 정육 표시가 나타납니다. 이로 인해 나는 회전 할 수 있기 때문에 실제로 타원이 그려지는 것을 추론하게되었습니다.

무엇을 제공합니까? 유용 할 수 있다면 전체 코드를 제공 할 수 있습니다. 모든 것은 대략 200 라인이지만, 위의 설명으로 충분하다고 생각합니다. 나는 우리가 지역에서 시작해서 바깥에서 일해야한다고 생각했다. =)

대단히 감사드립니다.

답변

0

에 해당합니다.

pygame.draw.ellipse에 대한 rect 인수가 center_x_coordinate, center_y_coordinate, width, height 인 것으로 착각했습니다.

내 전화를 pygame.draw.ellipse으로 변경했으며 모든 것이 이제는 아름답게 작동하고 있습니다.

0
while True: 
    rotate_background() 
    rotate_ellipse 
    pygame.display.flip() 

rotate_elipse() 호출되지 않고 인수가 없습니다. 오타가있는 경우, 인쇄물을 사용하여 elipse가 원하는 위치로 블리치하고 있는지 확인하십시오. 아마 수학이 옳지 않을까요? 문제는 내 자신의 무서운 어리 석음에서 유래 있도록 width/2 같은

당신은 일을 단순화 할 수

은 좋아 rect.centerx

+0

아, 지나치게 단순화 ** 및 ** 오타를 만들었습니다. 미안 해요! 마지막 코드는 문자 그대로 받아 들여지는 것이 아니라 모든 것이 어떻게 연결되는지를 보여줍니다. 본문에서 언급했듯이, 나는 회전하는 타원 (표면의 rect의 크기 조정)의 증거를 보았지만 실제 타원은 보이지 않습니다. rotate_ellipse가 올바르게 호출되고 있다고 가정하십시오! – blz

관련 문제