본문 바로가기
[ CODING STUDY ]/》파이썬 코드실습

파이썬 - [pygame, 충돌감지_1, 스프라이트, collide]

by MRG 2021. 5. 26.
728x90
반응형

▣ 이번장에서는 pygame에 이미지를 서로 충돌하는 코드를 작성하도록 하겠습니다. 

방법이 많이 있습니다. 

밑에 있는 pygame메뉴얼을 참고해주시고, 저는 간단한 방법 몇가지만 공부해보도록 하겠습니다.

https://www.pygame.org/docs/ref/sprite.html

 

pygame.sprite — pygame v2.0.1.dev1 documentation

The first point of collision between the masks is returned. The collision point is offset from sprite1's mask's topleft corner (which is always (0, 0)). The collision point is a position within the mask and is not related to the actual screen position of s

www.pygame.org

 

▣ 우선 먼저 플레이어와 아이템을 화면에 배치해주세요.

그리고 플레이어를 방향키로 움직이게 코드를 진행해주세요.

혹시 모르시는 분은 파이썬 pygame 챕터를 참고하셔서 코드를 진행해주세요.

여기서 중요한건 is_itemCrach 상태에 대한 변수를 만들어주었습니다.

이걸 통해 플레이어와 아이템이 충돌할지에 대한 상태를 설정해줄겁니다.

 

▣ 그리고 while True: 부분에서 if is_itemCrach == False: 닿지 않았을 경우에만 item 이미지를 그리게 

코드를 작성해주세요. 

그럼 is_itemCrach = True가 되면 아이템을 그리지 않기 때문에 우리가 아이템을 획득한 효과를 만들 수 있습니다.

 

▣ 그럼 우선 이렇게 아이템과 캐릭터가 잘 그려지는걸 확인할 수 있습니다.

아이템에 위치는 여러분들이 원하는 위치에 넣어주세요.

 

▣ 그리고 item_posX - player_posX 에 값을 빼주세요. 

그럼 두 포지션에 대한 거리가 나오게 됩니다. 

서로에 크기도 생각하셔서 print함수로 값을 확인하신 후에 조건문을 만들어주세요.

저는 or 논리연산자로 둘중에 하나라도 가까워지면 True로 하게 했습니다. 

 

▣ 그리고 캐릭터가 움직이는 코드에서 screen.fill((0,0,0)) 검은색으로 채우게 해주었습니다. 

그리고 확인해보면 

 

▣ 이렇게 아이템에 닿이면 is_item 상태가 True가 되고 더 이상 그리지 않고 검은색으로 채워지기 때문에 

사라지는걸 볼 수 있습니다.

그런데 좌표로 하게 되면 조금 한개가 있습니다.

그렇기 때문에 pygame에서는 sprite에 collide로 충돌을 감지는 코드를 지원합니다.

 

▣ 우선 클래스로 플레이어와 아이템을 스프라이트로 만들어주고 그려줘야 합니다. 

class Player(pygame.sprite.Sprite):로 선언해주세요. 

def __init__(self)로 클래스를 초기화합니다. 이건 클래스를 선언해서 사용하면 바로 실행되는 함수라고 생각하시면 됩니다.

pygame.sprite.Sprite.__init__(self) 스프라이트를 초기화해주시고,

self로 클래스에 멤버를 선언해줍니다. pygame.image.load() 로 이미지를 불러오고 pygame.transform.scale() 함수로 

이미지에 크기를 지정해줍니다. 

그리고 여기서 부터가 중요한데  self.rect = self.image.get_rect()값으로 스프라이트를 그려줍니다. 

그리고 rect.centerx 이미지에 중심에 값을 지정해줍니다. 

중심에 값은 이미지를 기준으로 좌표를 지정하신다고 생각하시면 됩니다. 

이걸 해주지 않으면 collide()함수로 사용할 수 없습니다. 

 

▣ 그리고 item, player에 클래스를 정의해줍니다. 

그럼 item, player이름에 아까 클래스를 선언했던 걸 메모리에 인스턴스화 시키는 겁니다. 

변수이름으로 사용할 수 있다라는 이야기입니다.

 

▣ 그리고 if pygame.sprite.collide_rect(player, item) 으로 충돌을 감지합니다. collde_rect()함수는 이미지스프라이트에 네모 영역으로 충돌을 체크합니다. 그리고 충돌을 하게 되면 값을 반환합니다.

 

▣ collide_circle(player,item) 이건 원의 영역으로 충돌을 체크하여 반환합니다.

둘다 한번씩 사용해서 확인하면 충돌이 잘되는걸 확인할 수 있습니다. 

 

▣ 이거 외에 다른 여러 충돌 방법들이 있습니다.

 

https://www.pygame.org/docs/ref/sprite.html 

 

pygame.sprite — pygame v2.0.1.dev1 documentation

The first point of collision between the masks is returned. The collision point is offset from sprite1's mask's topleft corner (which is always (0, 0)). The collision point is a position within the mask and is not related to the actual screen position of s

www.pygame.org

 

https://www.youtube.com/watch?v=Dspz3kaTKUg&t=595s 

▣ 위에 있는 자료들을 참고하시면서 다른 방법으로 충돌하는 방법을 익혀보세요.

728x90
반응형

댓글