python으로 게임 만들기/pygame

[pygame] 8. 간단한 충돌처리

bay07 2024. 2. 24. 11:48

 

피카츄가 몬스터 볼과 만나면 5초간 잠시 멈춰있다가 프로그램이 꺼지는 코드를 작성해보자.

 

우선 부딪치는 2개의 물체에 대한 정보를 입력해줘야한다. pygame에서 제공해주는 get_rect() / A_rect.left / A_rect.top 등의 함수를 활용하면 편하다.  

    # 충돌 처리를 위한 character rect 정보 업데이트 
    # pygame에서 get_rect()는 직사각형에 대한 정보를 가져오는 함수이다.
    # 그리고 여기서 left와 top 정보를 현 위치로 업데이트 해줘야한다.
    character_rect = character.get_rect()
    character_rect.left = character_x_pos
    character_rect.top = character_y_pos
    
    # ball에서도 마찬가지의 처리를 해줘야한다.
    # ball자체가 움직이지는 않지만, 이 위치정보를 셋팅해주지 않으면 작동하지 않는다
    ball_rect = ball.get_rect()
    ball_rect.left = ball_x_pos
    ball_rect.top = ball_y_pos

 

그리고 2가지의 물체가 서로 충돌하지는 않는지, pygame에서 제공해주는 A_rect.colliderect(B_rect) 함수를 통해서 체크해줄 수 있다.

    # 충돌 체크
    if character_rect.colliderect(ball_rect):
        print("충돌 _ 잡았다 피카츄")
        # 5초간 잠시 멈춤
        time.sleep(5)
        # 만약 running이 False가 되면 while문을 빠져나가게 된다. 
        running = False

 

우리가 원하는 결과를 천천히 보기 위해서 time.sleep(5)를 사용한다. 5초 동안 잠깐 멈춰있겠다는 뜻이다. 

import time

time.sleep(5)

 


▷ 시연 영상


▷ 전체 코드 

더보기
#8. 간단한 충돌처리 

import pygame
# sleep을 쓰기 위해서 time을 import한다. 
import time

pygame.init()
screen_width = 480
screen_height = 640
screen = pygame.display.set_mode((screen_width, screen_height))

clock = pygame.time.Clock()

pygame.display.set_caption("Let's make game")
background = pygame.image.load("C:/Users/Soyoung/Desktop/pygame/background.png")
character = pygame.image.load("C:/Users/Soyoung/Desktop/pygame/pika2.jpg")
character_size = character.get_rect().size
character_width = character_size[0]
character_height = character_size[1]
character_x_pos = (screen_width/2) - (character_width/2)
character_y_pos = screen_height - character_height

ball = pygame.image.load("C:/Users/Soyoung/Desktop/pygame/ball.jpg")
ball_size = ball.get_rect().size
ball_width = ball_size[0]
ball_height = ball_size[1]
ball_x_pos = (screen_width/2) - (ball_width/2)
ball_y_pos = (screen_height/2) - (ball_height/2)

to_x =0
to_y = 0 

character_speed = 0.5

running = True
while running:
    FPS = 60
    dt = clock.tick(FPS)
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
             running = False
                
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                to_x -= character_speed
            elif event.key == pygame.K_RIGHT:
                to_x += character_speed
            elif event.key == pygame.K_UP:
                to_y -= character_speed
            elif event.key == pygame.K_DOWN:
                to_y += character_speed

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                to_x = 0
            elif event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                to_y = 0

    character_x_pos += to_x * dt
    character_y_pos += to_y * dt

    if character_x_pos < 0:
        character_x_pos = 0
    elif character_x_pos > screen_width - character_width:
        character_x_pos = screen_width - character_width
    if character_y_pos < 0:
        character_y_pos = 0    
    elif character_y_pos > screen_height - character_height:
        character_y_pos = screen_height - character_height       
    
    # 충돌 처리를 위한 character rect 정보 업데이트 
    # pygame에서 get_rect()는 직사각형에 대한 정보를 가져오는 함수이다.
    character_rect = character.get_rect()
    # 그리고 여기서 left와 top 정보를 현 위치로 업데이트 해줘야한다.
    character_rect.left = character_x_pos
    character_rect.top = character_y_pos
    
    # ball에서도 마찬가지의 처리를 해줘야한다.
    ball_rect = ball.get_rect()
    # ball자체가 움직이지는 않지만, 이 위치정보를 셋팅해주지 않으면 작동하지 않는다
    ball_rect.left = ball_x_pos
    ball_rect.top = ball_y_pos      
    
    # 충돌 체크
    if character_rect.colliderect(ball_rect):
        print("충돌 _ 잡았다 피카츄")
        # 5초간 잠시 멈춤
        time.sleep(5)
        # 만약 running이 False가 되면 while문을 빠져나가게 된다. 
        running = False
    
    screen.blit(background, (0,0))
    screen.blit(character,(character_x_pos, character_y_pos))
    screen.blit(ball,(ball_x_pos, ball_y_pos))
    pygame.display.update()
# 그리고 이 명령어에 의해서 pygame이 끝난다. 
pygame.quit()

 

▷ 참고자료 

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

나도 코딩 : https://www.youtube.com/watch?v=Dkx8Pl6QKW0

그런 날도 있더라고 : https://www.youtube.com/watch?v=Ci6MwnyQ-Yo

 

'python으로 게임 만들기 > pygame' 카테고리의 다른 글

[pygame] 10. 타이머 만들기  (0) 2024.02.24
[pygame] 9. 텍스트 글자 삽입  (0) 2024.02.24
[pygame] 7. 충돌 처리를 위한 준비  (0) 2024.02.24
[pygame] 6. FPS 설정2  (0) 2024.02.24
[pygame] 5. FPS 설정1  (0) 2024.02.24