회전하는 배경에서 타원을 회전시켜야하는 상대적으로 간단한 애니메이션을 만들려고합니다. 나는 회전하려고 노력하고있는 표면을 가지고 놀기 위해 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()
background
및 ellipse
변수에 대한 단어 위. 두 변수 모두 상황이 그려진 pygame.Surface
인스턴스를 포함합니다. 그것이 잘 작동하고 있기 때문에 나는 background
에 대해 자세히 설명하지 않을 것이다. create_ellipse
에서, 타원은 pygame.draw.ellipse
에 의해 황색의 ellipse
표면 상에 묘화되었다. 그 전에는 ellipse.fill(GREEN)
이 호출되었습니다. ellipse
의 컬러 키도 GREEN
으로 설정되어 전체 표면이 투명 이도록 노란색 타원을 그렸습니다.
문제점 : 나는 타원이 제대로 소총탄되었는지 확인하기 위해 밖으로 ellipse.set_colorkey
주석 타원
를 확인할 수 없습니다. 그것은. 타원이 회전하면서 치수가 변하는 녹색 정육 표시가 나타납니다. 이로 인해 나는 회전 할 수 있기 때문에 실제로 타원이 그려지는 것을 추론하게되었습니다.
무엇을 제공합니까? 유용 할 수 있다면 전체 코드를 제공 할 수 있습니다. 모든 것은 대략 200 라인이지만, 위의 설명으로 충분하다고 생각합니다. 나는 우리가 지역에서 시작해서 바깥에서 일해야한다고 생각했다. =)
대단히 감사드립니다.
아, 지나치게 단순화 ** 및 ** 오타를 만들었습니다. 미안 해요! 마지막 코드는 문자 그대로 받아 들여지는 것이 아니라 모든 것이 어떻게 연결되는지를 보여줍니다. 본문에서 언급했듯이, 나는 회전하는 타원 (표면의 rect의 크기 조정)의 증거를 보았지만 실제 타원은 보이지 않습니다. rotate_ellipse가 올바르게 호출되고 있다고 가정하십시오! – blz