인프런 커뮤니티 질문&답변

nini7302님의 프로필 이미지

작성한 질문수

파이썬 무료 강의 (활용편1) - 추억의 오락실 게임 만들기 (3시간)

충돌감지에서 궁금한점

작성

·

437

0

character_rect = character.get_rect()

character_rect.left = character_x_pos

character_rect.top = character_y_pos

enemy_rect = enemy.get_rect()

enemy_rect.left = enemy_x_pos

enemy_rect.top = enemy_y_pos

여기서 .left 랑 .top가 left인데 왜 오른쪽 충돌도 인식하는지 top도 왜 아래쪽 충돌도 인식하는지 궁금합니다.

그리고 양옆 충돌은 충돌로 인식안하고 위아래 충돌만 충돌이라고 인식하고 싶어서 위에 코드에서

character_rect = character.get_rect()

character_rect.top = character_y_pos

enemy_rect = enemy.get_rect() enemy_rect.top = enemy_y_pos

이렇게 두번째 줄을 지웠는데 창이 열리자마자 충돌로 인식하고 꺼지는건 왜그런건가요?



답변 1

1

애초에 코드를 이해를 잘못 하고 계신거 같네요. 

    character_rect = character.get_rect()

우선 이코드는 오른쪽의 캐릭터 이미지의 크기 정보를 가져와서, 왼쪽 변수에 저장하는 겁니다. 
즉, 이 케릭터 의 크기는 가로 얼마 세로 얼마 하는걸 저장하는거죠. 

   character_rect.left = character_x_pos

이 코드는 캐릭터의 x 좌표 를 이 사각형의 왼쪽으로 지정하는 거죠. 즉 캐릭터의 위치가 변할때마다. 이 사각형 자체도 따라서 움직이도록 해주는 역할에 불과합니다. 

    character_rect.top = character_y_pos

마찬가지로, 이 코드 역시 이 사각형의 위쪽 위치를 지정해줄뿐, 충돌과는 아무런 상관이 없습니다. 

즉, 이 세줄은 어떤 가로와 세로의 크기를 가진 이미지가 있는데, 이 이미지를 이동시켜라, 해당의 x좌표와 해당의 y좌표로 이동시켜라. 이 사각형의 기준점은 왼쪽 위이고, 이 점을 해당좌표로 이동시켜라. 라는 의미 일뿐. 

충돌과는 전혀 상관 없습니다. 

마찬가지로, 

enemy_rect = enemy.get_rect()

enemy_rect.left = enemy_x_pos

enemy_rect.top = enemy_y_pos

도 위치에 대한 정의 일뿐 충돌과는 상관 없습니다. 

따라서, 

character_rect = character.get_rect()

character_rect.top = character_y_pos

enemy_rect = enemy.get_rect() enemy_rect.top = enemy_y_pos

이코드를 분석해보면, 
캐릭터 그기 정의하고, 
위쪽을 정의 했는데, 오른쪽은 정의 되어 있지 않아서, 위치가 특정이 안되므로, 제멋대로 그려질 겁니다. 
아마  오른쪽이 0으로 그려질 가능성이 높죠.
세번쨰 줄 역시 오른쪽이 정의되어 있지 않아 위치가 특정이 안되어서, 제멋대로, 그려질거고, 
아마도 캐릭터와 같은 위치에 생성이 되겟죠. 

그럼 당연히 시작하자마자 충돌하고 꺼지겟죠. 


충돌과 전혀 상관 없는 코드입니다. 해당코드는 해당 이미지가 어떤 크기이며 어느 위치에 위치하는가 를 정의할뿐입니다. 

충돌 체크는 

 if character_rect.colliderect(enemy_rect):

해당 코드로 진행하며, 케릭터의 사각형 정보가 적의 사각형 정보가 겹치면, (충돌하면) 으로 체크 

좌우를 충돌 시키고 싶지 않다면, 해당 코드를 수정해야 합니다. 

nini7302님의 프로필 이미지
nini7302
질문자

감사합니다~ 이해 했습니다!

nini7302님의 프로필 이미지

작성한 질문수

질문하기