본문 바로가기

Minding's Programming/Pygame

[Pygame] 07. 이미지 벽에 닿았을 때 튕기기

728x90
반응형

이 글은 아래 영상을 참고했다.

https://www.youtube.com/watch?v=2qsaG_V_k9w&list=PLz2iXe7EqJOMp5LozvYa0qca9E4OBkevW&index=7 


import pygame

이전 강의에서 배웠던 마우스로 이미지를 움직일 때 사용했던 코드가 대부분이다.

마우스에 반응하는 코드를 지우고, 이미지가 자동으로 움직이며 벽에 튕기게 해보자.

pygame.init()

background = pygame.display.set_mode((550, 382)) # 배경 이미지에 맞추어 화면크기 설정함
pygame.display.set_caption('PYGAME_6')

# 이미지 파일 준비
image_bg = pygame.image.load('./image/fungo.png')
image_ball = pygame.image.load('./image/ball_small.png')

# 배경의 사이즈 가져오기
size_bg_width = background.get_size()[0]
size_bg_height = background.get_size()[1]

# ball의 사이즈 가져오기 (가로, 세로)
size_ball_width = image_ball.get_rect().size[0]
size_ball_height = image_ball.get_rect().size[1]

# ball의 좌표값 설정하기
x_pos_ball = size_bg_width/2 - size_ball_width/2 # 가운데
y_pos_ball = 0 # 맨 위

# ball의 x,y 축 속도 변수 (좌표에 더해줄 목적)
x_speed_ball = 1
y_speed_ball = 1

play = True
while play:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            play = False
        
    x_pos_ball += x_speed_ball
    y_pos_ball += y_speed_ball
        
    # x좌표값을 제한하고 speed변수를 음수로 바꿔 방향 전환하기
    if x_pos_ball <= 0:
        x_speed_ball = -x_speed_ball
        x_pos_ball = 0
    elif x_pos_ball >= size_bg_width - size_ball_width:
        x_speed_ball = -x_speed_ball
        x_pos_ball = size_bg_width - size_ball_width
        
    if y_pos_ball <= 0:
        y_speed_ball = -y_speed_ball
        y_pos_ball = 0
    elif y_pos_ball >= size_bg_height-size_ball_height:
        y_speed_ball = -y_speed_ball
        y_pos_ball = size_bg_height-size_ball_height
            
    # 이미지 삽입 및 업데이트
    background.blit(image_bg, (0,0))
    background.blit(image_ball, (x_pos_ball, y_pos_ball))
    pygame.display.update()
    
pygame.quit()

달라진 점은 speed_ball 이라는 속도(및 방향)변수가 생겼고, 이를 이용해 좌표값을 변하게 한다.

 

  • 이미지(ball)가 움직이게 하려면 좌표를 조정해주면 된다.
    • 시작 좌표는 왼쪽 가장자리 (0,0)
    • x좌표 : 이미지가 왼쪽으로 움직일때는 감소, 오른쪽으로 움직일때는 증가
    • y좌표 : 이미지가 위쪽으로 움직일때는 감소, 아래쪽으로 움직일때는 증가
  • 이미지가 벽에 튕기게 하려면 각 벽에 대한 조건을 만들어주어야 한다.
  • 배경의 가로 / 세로 길이를 그대로 적용할 수 없음 (pygame에서는 왼쪽 가장자리가 중심점이기 때문, 아래 사진 참고)
    • 화면의 위쪽 : y좌표값이 0보다 더 낮아지게 되면 화면 밖으로 벗어나므로 0 미만으로 넘어가서는 안됨.
    • 화면의 오른쪽 : x좌표값이 (배경의 가로길이 - 이미지의 가로길이) 값보다 더 증가해서는 안됨.
    • 화면의 아래쪽 : y좌표값이 (배경의 세로높이 - 이미지의 세로높이) 값보다 더 증가해서는 안됨.
    • 화면의 왼쪽 : x좌표값이 0보다 더 낮아져서는 안됨.

시연 영상

 

이번에도 출연해주신 정근우 선수

 

 

728x90