Skip to content

Latest commit

 

History

History
81 lines (67 loc) · 3.47 KB

211226.md

File metadata and controls

81 lines (67 loc) · 3.47 KB

Day 80

파이썬으로 배우는 게임 개발 실전편

Chapter 1

Walking dog

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys

class WindowClass(QWidget):
    def __init__(self):
        super().__init__()
        self.img_dog = [
            QImage('Python_workspace\python_game\image\walking_dog\dog0.png'),
            QImage('Python_workspace\python_game\image\walking_dog\dog1.png'),
            QImage('Python_workspace\python_game\image\walking_dog\dog2.png'),
            QImage('Python_workspace\python_game\image\walking_dog\dog3.png')
        ]
        self.img_bg = QImage('Python_workspace\python_game\image\walking_dog\park.png').scaled(480, 300)
        self.xy = 0
        self.ani = 0
        self.initUI()
        timer = QTimer(self)
        timer.setInterval(200)
        timer.timeout.connect(self.update)
        timer.start()

    def initUI(self):
        self.setGeometry(100, 100, 480, 300)
        self.setWindowTitle('Walking dog')

    def paintEvent(self, e):
        qp = QPainter()
        qp.begin(self)
        self.xy = self.xy + 4
        if self.xy == 480:
            self.xy = 0
        
        qp.drawImage(QRect(0, 0, self.xy, 300), self.img_bg, QRect(480 - self.xy, 0, self.xy, 300))
        qp.drawImage(QRect(self.xy, 0, 480 - self.xy, 300), self.img_bg, QRect(0, 0, 480 - self.xy, 300))

        self.ani = (self.ani + 1) % 4
        qp.drawImage(QRect(150, 130, self.img_dog[self.ani].width(), self.img_dog[self.ani].height()), self.img_dog[self.ani])
        qp.end()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main_W = WindowClass()
    main_W.show()
    sys.exit(app.exec_())

긴 삽질 끝에 완성했다. 배경이 끊어지는 느낌도 없다.

이번에는 동시처리가 필요 없다고 생각해서 QThread부분을 날리고, QTimer를 사용했다.

timer = QTimer(self)
timer.setInterval(200) # 몇 초마다 반복할 것인가
timer.timeout.connect(self.update) # 무엇을 반복할 것인가
timer.start() # 시작

QTimer를 통해 Thread 없이도 반복해서 호출이 가능했다.

그 다음으로 pixmap과 라벨을 이용하여 이미지 표현을 하는 부분도 빼고 paintEvent를 이용해서 이미지 표현을 했다.

여기서 가장 문제였던 부분은 배경의 이미지가 어떻게 흘러가게 하느냐였다. 책에 구현되어 있는 것을 계속 보고 완벽하게 이해해야했다.

결과적으로 이미지의 오른쪽부터 사라지게하고, 왼쪽에서 오른쪽 부분부터 나타나게 해야했다.

qp.drawImage(QRect(0, 0, self.xy, 300), self.img_bg, QRect(480 - self.xy, 0, self.xy, 300))
qp.drawImage(QRect(self.xy, 0, 480 - self.xy, 300), self.img_bg, QRect(0, 0, 480 - self.xy, 300))

self.ani = (self.ani + 1) % 4
qp.drawImage(QRect(150, 130, self.img_dog[self.ani].width(), self.img_dog[self.ani].height()), self.img_dog[self.ani])

첫 번째 줄부터 보면 (0, 0)지점에 너비 self.xy, 높이 300으로 self.img_bg의(480 - self.xy, 0) 부분부터 너비 self.xy, 높이 300에 해당하는 이미지를 그리라는 것이 된다. self.xy는 점점 증가할 것이고, 480에서 self.xy를 뺀 부분부터 가져오니 오른쪽에서부터 가져오는 것처럼 되는 것이다.

두 번째 줄은 반대로 점점 오른쪽부분이 사라지는 것처럼 된다.

self.ani = (self.ani + 1) % 4 이 부분은 self.ani = self.ani + 1과 self.ani = self.ani % 4를 합쳐놓은 문장이다.