08월26일

Win Cha·2026년 8월 27일

게임 개발 수업 계속 중

import pygame

1. 파이게임 초기화 = 주인공, 미사일 생성

pygame.init() # 파이게임 라이브러리를 사용하기 위해 엔진을 켭니다. (필수)

2. 게임 화면 설정 -> 고정값

size = [400, 900] # 화면 크기 지정 (가로 400, 세로 900 픽셀)
screen = pygame.display.set_mode(size) # 지정한 크기로 게임 창을 만듭니다.

title = "pyGameExample"
pygame.display.set_caption(title) # 게임 창의 맨 위(제목 표시줄)에 이름을 달아줍니다.

3. 게임 내에서의 설정 -> 변수로 처리

clock = pygame.time.Clock() # 게임의 프레임(초당 화면 갱신 속도)을 조절할 시계 객체입니다.

사용할 색상들을 미리 RGB 값(0~255)으로 정의.

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) 비행기 객체 생성 및 세팅

hero = Img_Object() # 클래스(틀)를 이용해 주인공 객체 생성
hero.add_Img("C:/Users/201/Pictures/pyGame/hero1.png") # 이미지 불러오기
hero.change_size(80,80) # 크기를 80x80으로 조절

화면 가로 정중앙에 배치: (전체 가로 / 2) - (주인공 가로 / 2)

hero.x = round(size[0] / 2) - round(hero.width / 2)

화면 맨 아래에서 살짝 띄워서 배치

hero.y = size[1] - hero.height - 70
hero.move = 5 # 방향키를 누를 때마다 이동할 속도(픽셀)

(주석 처리된 과거 미사일 단일 객체 생성 코드)

missile = Img_Object()

missile.add_Img("C:/Users/201/Pictures/pyGame/missile.png")

missile.change_size(25,50)

missile.x = 0

missile.y = 0

missile.move = 5

키보드 눌림 상태를 기억하는 '스위치' 변수들

left_move = False # 왼쪽 방향키가 눌렸나?
right_move = False # 오른쪽 방향키가 눌렸나?
space_on = False # 스페이스바(총알 발사)가 눌렸나?

화면에 존재하는 여러 개의 미사일을 담아둘 장바구니(리스트)

missile_list = []

4. 메인 이벤트 (게임 루프 - 무한 반복)

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() 

5. 종료 (while문을 빠져나오면 파이게임 종료)

pygame.quit()

  1. 예외란? 예외처리 방법 try except
  2. 예외 처리 방법 try, except, else, finally   
    2- 1) try + except   
    2-2) try + except + else   
    2-3) try + finally   
    2-4) try + except + finally   
    2-5) try + except + else + finally
  3. try (해당 구문 안에서 에러 발생 시 처리 가능 - 필수)
    except (에러 발생시 수행 - 선택이지만 에러를 처리하려면 필수)
    else (에러 없을 때 수행 - 선택이지만 except 없이는 올 수 없음)
    finally (에러가 있거나 없거나 상관없이 항상 수행 - 선택)

pygame.Rect는 파이게임(Pygame)에서 가장 중요하고 강력한 마법 같은 기능입니다!

간단히 말해 '가상의 네모난 상자(히트박스)'를 만들어주는 함수입니다. 게임 속 캐릭터나 미사일은 겉보기엔 복잡한 이미지지만, 컴퓨터가 충돌을 쉽게 계산하고 위치를 조절하게 하려면 그 주변을 감싸는 투명한 네모 상자가 필요합니다. Rect가 바로 그 역할을 합니다.

  1. Rect는 어떻게 만드나요?
    아주 간단하게 4가지 숫자(x 좌표, y 좌표, 가로 길이, 세로 길이)만 넣어주면 만들어집니다.

Python

pygame.Rect(x위치, y위치, 가로크기, 세로크기)

my_rect = pygame.Rect(100, 200, 50, 80)
위 코드는 화면의 (100, 200) 위치에 가로 50, 세로 80 크기의 투명한 상자를 만든 것입니다.

  1. Rect가 왜 그렇게 강력한가요? (핵심 기능)
    Rect를 쓰면 위치 계산과 충돌 계산이 믿을 수 없을 만큼 쉬워집니다.

🌟 매직 속성 (위치 자동 계산)
보통 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")

이미지의 원본 크기 그대로 Rect 상자 만들기

hero_rect = hero_image.get_rect()
💡 요약
pygame.Rect는 게임 속 물체를 감싸는 '투명한 네모 상자'입니다. 이 상자를 씌워두면 위치를 잡거나, 마우스 클릭을 감지하거나, 물체끼리 부딪혔는지(충돌) 확인할 때 파이게임이 알아서 다 계산해 주는 만능 도구입니다!

눈에 보이지 않는 Rect를 화면에 그려볼까요?

예

0개의 댓글