자동완성 오류 해결, pygame의 작동 특징
visual studio code를 활용하여 pygame 모듈을 사용하면 간혹 자동완성 기능이 작동하지 않을 때가 있다. 모듈 다운 방법은 다른 자료에서도 많이 등장하기에 이 문제를 해결하는 법만 간단히 정리하겠다. github에서 해결법을 발견하였는데 (출처 :https://github.com/pygame/pygame/blob/main/buildconfig/pygame-stubs/__init__.pyi) 모듈이 수정되기 전까지는 직접 수정해줘야 사용할 수 있다.
1. "C:\Users\{Username}\appdata\local\programs\python\python39\lib\site-packages\pygame\__init__.pyi" 파이썬이 설치된 곳에서 파이 게임 모듈 설치 위치를 들어가서 __init__.pyi 이름인 파일을 찾는다.
2. 그 파일(__init__.pyi)을 vscode로 끌어온 뒤(vscode에서 실행한 뒤)
https://github.com/pygame/pygame/blob/main/buildconfig/pygame-stubs/__init__.pyi
링크에 들어가서 문서의 모든 내용을 복사한다.
3. vscode에 존재하는 __init__.pyi 파일의 내용을 지우고 2번에서 복사한 내용을 붙여넣고 저장한다.
4. 나갔다가 다시 들어오면 잘 작동되는 것을 확인할 수 있다!
pygame이 작동하는 방식은 두 가지로 크게 분리된다. 우리가 보여주고 싶은 게임 창(1)을 만들고 그 각각의 요소들의 이벤트를 받아 그 뒤 작동 방식(2)을 구현해줘야 한다.
게임 창은 qt처럼 실제 덩어리? 버튼이 존재하는 방식이 아니라 겹겹이 쌓는 그림, 이미지에 가깝다. 가장 기본적인 메소드는 blit 인데 화면이 바뀔 때마다(ex 캐릭터의 위치 이동) 메소드를 활용해서 겹겹히 쌓아주는 것이 중요하다! (그래서 원래 있었던 요소가 사라진다고 해서 지울 수는 없다.)
만약 다음과 같이 게임 이미지를 넣고싶다면
우선 우리의 컴퓨터에서 이미지를 각각 준비해야 한다. 이 예시에선 하늘, 땅 사람 세 가지를 준비할 수 있다. 각각의 이미지를 파이썬이 읽을 수 있게 이미지 객체로 만들어줘야 한다. (파이썬이 읽을 수 있는 변수로 설정해주는 느낌이다. 그래서 화면에 표시하라고 시킬 때 그 변수를 활용한다.)
세 가지 이미지 객체를 만들었다면(
<<<사용하고 싶은 변수 이름 =pygame.image.load("파일 위치\파일 이름(확장자까지, ex: .png)")>>>이미지 객체는 이렇게 만듦) 이제 쌓아줘야 한다.
즉 파이 게임의 스크린의 특성은 쌓아주는 것이기에 우리가 원하는 저 그림을 만들기 위해서는 그림 1 위에 그림 2, 그 위에 그림 3 이렇게 쌓아야 한다.
파이썬은 윗줄부터 차례대로 수행하기 때문에 따라서 blit를 사용할 때도
스크린.blit(그림 1, 그림 크기)
스크린.blit(그림 2, 그림 크기)
스크린.blit(그림 3, 그림 크기)
이렇게 활용하면 우리가 원하는 모습을 만들 수 있다.
또한 이러한 변화가 실제 우리의 화면에 보이게 해줄려면 업데이트를 해줘야 한다.
pygame.display.update()
를 활용하면 스크린에 변화를 준 내용이 즉각적으로 반영이 된다.
필자가 헷갈렸던 부분은 바로 이러한 특성 때문이었다. 필자는 만약 목숨이 하나 줄어서 하트를 하나 깎아야 할 때면 생성한 이미지 객체를 지워야 하나?라고 생각했는데 그것이 아니라 화면에 다시 쌓을 때에는 목숨 한 개를 빼고 쌓아올리는 것이었다. 따라서 어떤 사람이 옆으로 이동하는 것을 표현하고 싶다면 배경, 땅, 옆으로 위치가 변한 사람그림 이렇게 세 개를 모두 다시 쌓아주면 된다.
파이 게임의 작동이 이루어지는 원리는 가장 흔하게 사용하는 터틀과 거의 비슷하다. 특정한 이벤트(사용자가 컴퓨터에 주는 자극 같은 느낌)을 받았을 때 할 행동을 설정해줘서 이벤트를 받고 그에 맞는 활동을 하는 것이다. 가장 많이 쓰이는 것은 마우스, 시간(타이머), 클릭, 키보드가 있을 것이다.
컴퓨터가 계속해서 반복문을 돌면서 이벤트가 발생 했는지 안했는지 확인한다. 만약 내가 설정한 방식의 이벤트가 작동했다면 중간에 어느 if문에 걸려서 내가 원하는 행동을 하게 만드는 것이다. 따라서 각 화면에서 우리가 어떤 행동을 했을 때 무슨 작동을 할 지 정해줘야 한다.
가장 큰 while 문( 전체를 반복하는 반복문/파란색) 안에
for event in pygame.event.get(): 를 설정하여 특정 이벤트를 받았을 때 저 반복문 안을 돌면서 우리가 정한 자극을 받은 것인지 확인하는 것이다. 만약 if로 설정한 자극 중 옳은 것이 실제로 행해졌다면(즉 실제로 시작을 클릭했다면) 그러면 작동할 행동을 if 밑에 적어서 실행시키는 방식이다. 각각의 메소드에 대해서는 다음 게시물을 통해 정리해보고자 한다.