게임 개발 수업 계속 중
import pygame
pygame.init() # 파이게임 라이브러리를 사용하기 위해 엔진을 켭니다. (필수)
size = [400, 900] # 화면 크기 지정 (가로 400, 세로 900 픽셀)
screen = pygame.display.set_mode(size) # 지정한 크기로 게임 창을 만듭니다.
title = "pyGameExample"
pygame.display.set_caption(title) # 게임 창의 맨 위(제목 표시줄)에 이름을 달아줍니다.
clock = pygame.time.Clock() # 게임의 프레임(초당 화면 갱신 속도)을 조절할 시계 객체입니다.
color1 = (160, 250, 208)
color2 = (191, 234, 255)
black_color = (0,0,0) # 검은색 (주로 배경색으로 사용)
white_color = (255,255,255) # 흰색
class Img_Object:
def init(self):
# 객체가 처음 만들어질 때 기준 위치(x, y)를 0으로 세팅합니다.
self.x = 0
self.y = 0
def add_Img(self, address):
# 이미지를 불러오는 함수입니다.
# 파일 이름 끝 3자리가 "png"이면 배경이 투명한 이미지이므로 convert_alpha()를 써서 투명도를 유지
if address[-3:] == "png":
self.img = pygame.image.load(address).convert_alpha()
else:
self.img = pygame.image.load(address)
def change_size(self, width, height):
# 이미지의 크기를 원하는 가로(width), 세로(height)로 변경합니다.
self.img = pygame.transform.scale(self.img, (width, height))
# 변경된 크기 정보를 객체의 속성(self.width, self.height)으로 저장해 둡니다.
self.width, self.height = self.img.get_size()
def show_Img(self):
# 화면(screen)의 지정된 좌표(self.x, self.y)에 이미지를 복사해서 찰칵 찍습니다(blit).
screen.blit(self.img,(self.x, self.y))
hero = Img_Object() # 클래스(틀)를 이용해 주인공 객체 생성
hero.add_Img("C:/Users/201/Pictures/pyGame/hero1.png") # 이미지 불러오기
hero.change_size(80,80) # 크기를 80x80으로 조절
hero.x = round(size[0] / 2) - round(hero.width / 2)
hero.y = size[1] - hero.height - 70
hero.move = 5 # 방향키를 누를 때마다 이동할 속도(픽셀)
left_move = False # 왼쪽 방향키가 눌렸나?
right_move = False # 오른쪽 방향키가 눌렸나?
space_on = False # 스페이스바(총알 발사)가 눌렸나?
missile_list = []
system_exit = 0
while system_exit == 0:
# 4-1. FPS(Frames per Sec) 설정
# 게임이 너무 빠르게 실행되지 않도록 1초에 60번만 돌게 제한을 겁니다.
clock.tick(60)
# 4-2. 입력(키보드, 마우스)의 감지
for event in pygame.event.get():
# 창의 우측 상단 'X' 버튼을 누르면 루프 종료
if event.type == pygame.QUIT:
system_exit = 1
# 키보드를 '누를 때' (스위치 ON)
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
left_move = True
if event.key == pygame.K_RIGHT:
right_move = True
if event.key == pygame.K_SPACE:
space_on = True
# 키보드에서 손을 '뗄 때' (스위치 OFF)
elif event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
left_move = False
if event.key == pygame.K_RIGHT:
right_move = False
if event.key == pygame.K_SPACE:
space_on = False
# 4-3. 입력, 시간에 따른 변화 (업데이트)
# 주인공 좌우 이동 및 화면 이탈 방지 처리
if left_move == True:
hero.x -= hero.move # 왼쪽으로 이동
if hero.x <= 0: # 화면 왼쪽 끝에 닿으면
hero.x = 0 # 더 이상 못 가게 막음
elif right_move == True:
hero.x += hero.move # 오른쪽으로 이동
if hero.x >= size[0] - hero.width: # 화면 오른쪽 끝에 닿으면
hero.x = size[0] - hero.width # 더 이상 못 가게 막음
# 스페이스바를 누르고 있는 동안 미사일 생성
if space_on == True:
missile = Img_Object() # 새 미사일 객체 생성
missile.add_Img("C:/Users/201/Pictures/pyGame/missile.png")
missile.change_size(25,50)
missile.x = hero.x + (hero.width / 2) - (missile.width / 2)
missile.y = hero.y - missile.height - 15
missile.move = 5
missile_list.append(missile) # 완성된 미사일을 리스트에 추가
print (missile_list)
space_on = False # 스페이스 클릭 시 한번만 미사일이 생성되도록 처리
for i in range(len(missile_list)) :
m = missile_list[i]
m.y -= m.move
if len(missile_list) > 0:
if missile_list[0].y <= - missile.height : # 0번째 미사일이 화면 밖(y <= 0)으로 나갔다면
del missile_list[0] # 메모리에서 삭제합니다.
print(missile_list) # 잘 지워졌는지 확인을 위해 출력합니다.
# 4-4. 전사작업 (화면에 그리기)
# 1. 이전 프레임의 흔적을 지우기 위해 화면 전체를 검은색으로 칠합니다.
screen.fill(black_color)
# 2. 주인공을 화면에 그립니다.
hero.show_Img()
# missile.show_Img() (사용 안 함)
# 3. 리스트에 담긴 모든 미사일을 화면에 그립니다.
# 현재 코드의 특징: 미사일이 위로 날아가는 이동(y -= move) 로직이 빠져있어 한자리에만 겹쳐서 그려집니다.
for m in missile_list:
m.show_Img()
# 4-5. 업데이트
# 메모리에서 다 그린 화면을 실제 모니터(창)에 반영하여 보여줍니다.
pygame.display.flip()
pygame.quit()
간단히 말해 '가상의 네모난 상자(히트박스)'를 만들어주는 함수입니다. 게임 속 캐릭터나 미사일은 겉보기엔 복잡한 이미지지만, 컴퓨터가 충돌을 쉽게 계산하고 위치를 조절하게 하려면 그 주변을 감싸는 투명한 네모 상자가 필요합니다. Rect가 바로 그 역할을 합니다.
Python
my_rect = pygame.Rect(100, 200, 50, 80)
위 코드는 화면의 (100, 200) 위치에 가로 50, 세로 80 크기의 투명한 상자를 만든 것입니다.
🌟 매직 속성 (위치 자동 계산)
보통 x, y 좌표만 알면 객체의 오른쪽 끝이나 정중앙이 어딘지 일일이 계산(x + 가로크기 / 2 등)해야 합니다. 하지만 Rect는 다음 속성들을 기본으로 제공하며, 하나를 바꾸면 나머지도 알아서 자동으로 계산되어 움직입니다.
my_rect.x, my_rect.y: 왼쪽 상단 꼭짓점 좌표
my_rect.center: 정중앙 좌표 (x, y)
my_rect.centerx, my_rect.centery: 정중앙의 x, y값
my_rect.left, my_rect.right: 왼쪽 끝, 오른쪽 끝 좌표
my_rect.top, my_rect.bottom: 위쪽 끝, 아래쪽 끝 좌표
[활용 예시]
만약 비행기를 화면 정중앙에 놓고 싶다면 복잡한 수식 없이 이렇게만 쓰면 됩니다.
Python
my_rect.center = (200, 450) # 중앙 좌표만 지정해주면 x, y 위치가 알아서 바뀝니다!
💥 막강한 충돌 감지 (Collision Detection)
가장 많이 쓰이는 이유입니다. 두 물체가 닿았는지 확인하는 복잡한 수학 공식을 단 한 줄로 끝내줍니다.
colliderect(): 네모와 네모가 부딪혔을 때
비행기(hero)와 적(enemy)이 부딪혔는지 검사할 때 씁니다.
Python
if hero_rect.colliderect(enemy_rect):
print("적과 충돌했습니다!")
collidepoint(): 네모 안에 점이 들어왔을 때
마우스 클릭 위치나, 총알(점 1개로 취급할 때)이 적에게 맞았는지 검사할 때 씁니다.
Python
if enemy_rect.collidepoint(bullet.x, bullet.y):
print("총알 명중!")
3. 이미지에서 바로 Rect 뽑아내기
우리가 직접 크기를 입력하지 않아도, 불러온 이미지에서 딱 맞는 크기의 Rect를 자동으로 뽑아낼 수도 있습니다.
Python
hero_image = pygame.image.load("hero.png")
hero_rect = hero_image.get_rect()
💡 요약
pygame.Rect는 게임 속 물체를 감싸는 '투명한 네모 상자'입니다. 이 상자를 씌워두면 위치를 잡거나, 마우스 클릭을 감지하거나, 물체끼리 부딪혔는지(충돌) 확인할 때 파이게임이 알아서 다 계산해 주는 만능 도구입니다!
눈에 보이지 않는 Rect를 화면에 그려볼까요?
예