DSP: Gracz zaczyna żyć!
W poprzednim wpisie napisałem, że pierwszą rzeczą jaką chcę zakodować to poruszanie się graczem po planszy. Okazało się to prostsze niż myślałem. Z początku sądziłem, że trzeba będzie użyć jakiegoś timera
lub czegoś w tym stylu żeby w ogóle ogarnąć zmiany na planszy. Okazało się to dużo prostsze!
Znalazłem w sieci kod tetrisa napisany w PyQt4 i wgryzłem się w jego funkcje. Dowiedziałem się, że rysowanie czegokolwiek na planszy może zostać wykonane przez QPainter
, a ten użyty może być tylko w event’cie paintEvent
. QPainter musi za każdym razem zostać „opuszczony” (begin
) oraz po zakończeniu podniesiony (end
). Pomiędzy tymi metodami może dziać się wszystko. Użyłem określeń podniesiony i opuszczony żeby porównać QPaintera do np. rysowania ołówkiem.
def paintEvent(self, QPaintEvent):
self.drawPlayer()
def drawPlayer(self):
painter = QtGui.QPainter()
painter.begin(self)
painter.setBrush(QtGui.QColor(255, 0, 0))
painter.drawRect(self.pos_x, self.pos_y, self.player_w, self.player_h)
painter.end()
Narysowałem więc okno 500x500 px, ustaliłem rozmiary gracza na 50x50 px oraz rozmiar ruchu na 10 px. Następnie nadpisałem metodę keyPressEvent
która odpowiada za przechwycenie przyciśnięcia klawisza. W prostym bloku if-elif (Python nie ma switch
a?) zaimplementowałem 4 metody dla klawiszy strzałek.
def keyPressEvent(self, e):
key = e.key()
if key == QtCore.Qt.Key_Left:
self.player_move_left()
[…]
def player_move_left(self)
if self.pos_x <= 0:
return
self.pos_x -= self.move_size
self.update()
W tym momencie odkryłem metodę update()
która odpowiedzialna jest za przerysowanie okna. Oznacza to, że wywołuje ona event paintEvent
. Wystarczyło więc odpowiednio zmienić koordynaty gracza, wywołać update()
i gracz po prostu przesunął się na planszy. Ogranie ciągłego wciskania klawisza i poruszania graczem ograne jest out of the box 😃
Dodałem jeszcze odpowiednie warunki brzegowe zapobiegające przemieszczeniu się gracza poza planszę i bang! - w niecałą godzinę miałem wykonany plan.
Co następne
Jako kolejny krok myślałem o poruszaniu się planszy w osi X razem z graczem. Polegać ma to na tym, że jak gracz znajdzie się na środku planszy i będzie poruszał w prawo to plansza będzie poruszała się razem z nim. Aby pokazać ten ruch dodam jakieś tło dla okna. Jeszcze nie zdecydowałem czy gracz będzie mógł się cofać czy ruch ten zostanie zablokowany, więc na razie pozwolę na ruch w obie strony aż do granic planszy.