본문 바로가기
Python/pygame

python 게임만들기 - 기초 작업

by To올라운더 2024. 2. 3.
반응형

앞선 포스팅에서 간략히 소개한 내용과 같이

python에는 게임을 만들기에 유용한 pygame 이라는 좋은 모듈이 있다.

 

그런데 아무리 좋은 모듈도 사용법을 모르면

쓸모가 없는 법.

하나씩 우리가 원하는 기능을 고민해가며,

기능을 구현해 볼 예정이다.

 

 1. 가상환경 구성하기

 - 해당 과정은 진행을 해도 되고 하지 않아도 되지만,

   독립적인 프로젝트 구성을 위해 가상환경을 사용하는 것을 권장한다.

  * 간단히 독립적인 구성은 다른 프로젝트나 업무로 인해 기존의 프로젝트나

    내가 의도치 않은 프로젝트들은 영향을 받지 않도록 분리하는 것을 말한다.

   * 단순한 예로 크롤링에 많이 사용되는 selenium 의 경우,

      3.X과 4.X 버전에서는 name 을 통해 검색하던 구문이 아래의 형태처럼 달라져 버렸다.

# selenium 3.X 버전
elem = browser.find_element_by_name('p')


# selenium 4.X 버전
elem = browser.find_element(By.NAME, 'p')

    * 다른 의미로 기존에 정상 동작하던 코드들이 selenium을 upgrade를 할 경우 동작하지 않는 다는 의미이며,

      이런 불상사를 사전에 예방하기 위해 가상환경을 구성한다.

       ( 자세한 내용은 아래의 포스팅을 참고해주세요.)

2023.05.30 - [Python] - venv 가상환경 구성하기 01

 

venv 가상환경 구성하기 01

0. 왜 가상환경이 필요한가요? 가상환경이 꼭, 항상, 누구에게나 필요하진 않다. (*사실 이글을 읽는다면 가상환경이 뭔지도 모를 확률이 더 높다.) 특히, 개인적으로 개발 업무를 하거나 한개의

to-all-rounder.tistory.com

 

  커맨드 영역에서 아래와 같이 입력하면,

python -m venv pygame_guide

 

  기존의 워크스페이스 영역 하단에 우리가 명령어로 입력한 pygame_guide 라는 폴더와 가상환경에 필요한 파일들이 생성된다.

 

 생성이 완료된 가상환경은 우리가 위에서 폴더 이름으로 지정한 경로(pygame_guide) 내의 Activate.ps1 을 실행해주면 된다.

 정상 실행 시, 아래의 빨간색 박스와 같이 경로 앞에 괄호를 포함한 가상환경의 이름이 나타나며,

 이후 작업들은 해당 영역에서 진행될 예정이다.

 작업을 완료하고, 원래의 작업영역(가상환경 탈출 또는 종료)으로 돌아오고자 할 때에는 deactivate를 입력해주면 된다.

 

 

 

2. pygame 설치

  - 가상환경에서 pip install 을 통해 pygame을 설치한다.

  - 위에서 가상환경을 진행하지 않았다면, 커맨드 영역의 초록색 괄호(가상환경 이름)은 무시해도 된다.

pip install pygame

 

  - 가상환경을 활성화 시킨 뒤(pygame_guide\Scripts\Activate.ps1)

   * 가상환경을 구성하지 않았다면 skip

   * 2개 이상의 프로젝트가 진행되지 않는 학습단계에서 가상환경은 권장사항일 뿐 필수사항은 아닙니다.

 

  - pip install pygame 설치 한다.

  - pip list 로 설치 여부를 확인해보면 pygame 2.5.2 Version 이 정상 설치 되었음을 확인할 수 있다.

 

 

3. pygame 기본 틀 만들기

 - 설치된 pygame 모듈을 import 하면 되는데,

   분명히 정상 설치가 되었지만, 해당 모듈에 밑줄이 나타나며 인식이 안되는 경우가 있다.

 

  - 이럴 때는 Visual Studio Code를 종료 후, 재시작 해주면 정상적으로 인식이된다.

 

  - 이제 몇가지 코드를 추가한 뒤, 해당 코드에 대해 간략한 설명을 진행해보면

import pygame

pygame.init()

background = pygame.display.set_mode((480,360))
pygame.display.set_caption('Exciting Pygame by ToAllrounder')

running = True # 동작 상태

while running:
    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            running = False

pygame.quit()

 

아래와 같은 창이 하나 나타난다.

 

 - 좌측의 코드와 우측의 실행창을 같이 보면 해당 기능에 대해 어렵지 않게 이해할 수 있다.

 - 일반적인 기본 틀에서 빠진 부분이 있다면 속도를 조절하는 fps 부분인데, 해당 내용은 다음 포스팅에 추가할 예정이다.

 - 유의할 사항은 background 의 경우, pygame.display.set_mode가 전달 받는 파라미터가 

   (해상도, 옵션, 색상 깊이 등)로 해상도는 (창의 가로 길이, 창의 세로 길이)를 튜플 형태(pixel값) 으로 받는다.

   따라서 위의 5코드와 같이 괄호가 2개 표기가 되어야 정상 동작이 가능하며, 1개만 표기할 경우 에러가 발생한다.

 

  - while 문을 통해 전체 프로그램을 지속적으로 실행하게 되는데, 동작 상태를 나타내는 flag 값(runnig)을 할당한다. 

  - 이제 프로그램이 계속 실행된 상태(while문)에서 어떤 동작들이 발생하는지 확인하고 해당 기능에 대한 코드를 작성해주면 되는데,

  - event.type 중 pygame.QUIT() 의 경우 pygame을 종료하는 이벤트이다.

 

  - 이벤트라는 말이 조금 난해할 수도 있지만, 실제 게임을 하게되면, 특정 키보드를 입력한다던지, 마우스를 조작한다든지 하는 등의 이벤트를 우리가 모니터링하고 경우에 따라 동작을 지정할 수 있다는 의미이다.

 

  - 어떠한 이벤트들이 있는지는 아래의 표를 통해 확인 가능하고,

    우리는 가장 첫번째에 있는 종료 기능(QUIT)를 while 문 안의 pygame.event.get() 을 통해 모니터링을 진행하다,

    해당 이벤트가 발생하면 프로그램을 종료한 것이다.

 

반응형

4. event.type 종류

Event Type 동작 specific attributes
QUIT 윈도우의 x 버튼, 창 닫기 버튼 눌림 none
ACTIVEEVENT 마우스가 화면에 들어가거나 나가면 발생
 
gain : 0 - 마우스가 화면에 들어올때
gain : 1 - 마우스가 화면에서 나갔을 때
 
state : 1 - 창이 활성화
state : 2 - 창이 비활성화
state : 6 - 비활성화된 창이 활성화 될때
gain, state
KEYDOWN 키가 눌렸을 때 key, mod, unicode, scancode
KEYUP 키가 올라갔을 때 key, mod
MOUSEMOTION 마우스 움직일때 pos, rel, buttons
MOUSEBUTTONUP 마우스 버튼 뗄 때 pos, button
MOUSEBUTTONDOWN 마우스 버튼 눌렀을 때 pos, button
JOYAXISMOTION 조이스틱 축이 변경될 때 joy, axis, value
JOYBALLMOTION 조이스틱 볼이 움직일 때 joy, ball, rel
JOYHATMOTION 조이스틱 hat이 변경될 때 joy, hat, value
JOYBUTTONUP 조이스틱 버튼 뗄 때 joy, button
JOYBUTTONDOWN 조이스틱 버튼 눌렀을 때 joy, button
VIDEORESIZE pygame.display.set_mode(size, mode)에서 modepygame.RESIZABLE 일 경우.
윈도우 창 크기 변경 될 때
size, w, h
VIDEOEXPOSE 화면에 직접 그리는 하드웨어 디스플레이는 창의 일부를 다시 그려야 할 때 pygame.VIDEOEXPOSE 이벤트를 받음 none
USEREVENT 사용자 설정 이벤트 code

 

 

 - 이제 우리가 좀 더 세부적으로 알아야할 요소는 해당 이벤트들을 상황별로 구성하는 것과 

   약간의 산수가 필요한 코드로 구현하는 것들이다.

   * event.type이 많아 보이지만, 조이스틱을 제거하고 나면 몇 가지 되지 않으니 희망을 가져도 된다.

 

반응형