Kurs PyGame – podstawy

PyGame to biblioteka przeznaczona do tworzenia gier 2d w pythonie. Kurs wymaga znajomości podstaw pythona.

Instalacja biblioteki PyGame

Instalacja jest bardzo prosta. Biblioteka PyGame zostanie zainstalowana po wpisaniu komendy pip install pygame w cmd.

Tworzenie okna gry

Okno gry stworzone w pygame

Na początku musimy zaimportować 2 potrzebne moduły pygame i sys.

import pygame, sys #importujemy potrzebne moduły

Następnie, niezbędną rzeczą, będzie zainicjowanie pygame. Aby to zrobić należy wywołać funkcję pygame.init().

import pygame, sys #importujemy potrzebne moduły

pygame.init() #inicjujemy pygame

Funkcja pygame.display.set_mode( (,) ) pozwala na utworzenie okna gry.

import pygame, sys #importujemy potrzebne moduły

pygame.init() #inicjujemy pygame

X = 600 # dowolna szerokość okna
Y = 600 # dowolna wysokość okna

SCREEN = pygame.display.set_mode( (X,Y) ) #tworzymy okno z podanymi parametrami

Pętla głowna gry

Jak można było zauważyć w poprzednim przykładzie okno nie odpowiadało. Nie zamykało się kiedy próbowaliśmy je zamknąć, ani nie dało się go dowolnie przesuwać. Aby to zmienić należy dodać pętle która będzie zbierać wszystkie zdarzenia.

import pygame, sys #importujemy potrzebne moduły

pygame.init() #inicjujemy pygame

X = 600 # szerokość okna
Y = 600 # wysokość okna

SCREEN = pygame.display.set_mode( (X,Y) ) #tworzymy okno z podanymi parametrami


while True: # Pętla główna programu
	for event in pygame.event.get(): #iterujemy się po wszystkich zebranych zdarzeniach
		if event.type == pygame.QUIT: # sprawdzamy czy podane zdarzenie dotyczy zamknięcia okna
			pygame.quit() # wychodzimy z pygame
			sys.exit()# kończymy działanie programu

Jak nazwać okno?

Standardową nazwą okna jest pygame window, w celu zmiany nazwy należy użyć funkcji pygame.display.set_caption('Nazwa').

import pygame, sys #importujemy potrzebne moduły

pygame.init() #inicjujemy pygame

X = 600 # szerokość okna
Y = 600 # wysokość okna

SCREEN = pygame.display.set_mode( (X,Y) ) #tworzymy okno z podanymi parametrami

pygame.display.set_caption('Game') #nazywamy nasze okno

while True: # Pętla główna programu
    for event in pygame.event.get(): #iterujemy się po wszystkich zebranych zdarzeniach
        if event.type == pygame.QUIT: # sprawdzamy czy podane zdarzenie dotyczy zamknięcia okna
            pygame.quit() # wychodzimy z pygame
            sys.exit()# kończymy działanie programu

Rysowanie figur

Figura narysowana w bibliotece pygame

Aby narysować prostokąt w pygame należy użyć funkcji pygame.draw.rect( okno_gry , kolor, (x,y,w,h) ). Funkcja przyjmuje parametry w kolejności: okno, kolor (RGB), pozycja na osi x, pozycja na osi y, szerokość, wysokość.

Następną ważną rzeczą jaka tu się pojawi to SCREEN.fill( [0,0,0] ) i pygame.display.update(). Pierwsza z powyższych dwóch funkcji służy do czyszczenia okna, a druga do odświeżania go np. po wykonaniu jakiegoś rysunku.

Sposób nr. 1:

import pygame, sys #importujemy potrzebne moduły

pygame.init() #inicjujemy pygame

X = 600 # szerokość okna
Y = 600 # wysokość okna

SCREEN = pygame.display.set_mode( (X,Y) ) #tworzymy okno z podanymi parametrami

pygame.display.set_caption('Gra') #nazywamy nasze okno

rectangle_position_x = 100 # pozycja na oknie oś X
rectangle_position_y = 100 # pozycja na oknie oś Y
rectangle_width = 100 #szerokość prostokąta
rectangle_height = 100 #wysokość prostokąta

while True: # Pętla główna programu
    for event in pygame.event.get(): #iterujemy się po wszystkich zebranych zdarzeniach
        if event.type == pygame.QUIT: # sprawdzamy czy podane zdarzenie dotyczy zamknięcia okna
            pygame.quit() # wychodzimy z pygame
            sys.exit()# kończymy działanie programu

    SCREEN.fill([0,0,0]) #czyścimy okno wypełniając je czarnym kolorem (RGB)

    pygame.draw.rect(SCREEN,[255,0,0],(rectangle_position_x, rectangle_position_y, rectangle_width, rectangle_height)) # rysujemy prostokąt

    pygame.display.update() #odświeżamy okno po narysowaniu

Sposób nr. 2, używający pygame.Rect()

import pygame, sys #importujemy potrzebne moduły

pygame.init() #inicjujemy pygame

X = 600 # szerokość okna
Y = 600 # wysokość okna

SCREEN = pygame.display.set_mode( (X,Y) ) #tworzymy okno z podanymi parametrami

pygame.display.set_caption('Gra') #nazywamy nasze okno

rectangle = pygame.Rect(100, 100, 100, 100) # pygame udostępnia nam już wbudowaną klasę gdzie możemy zrobić to samo tylko krócej

while True: # Pętla główna programu
    for event in pygame.event.get(): #iterujemy się po wszystkich zebranych zdarzeniach
        if event.type == pygame.QUIT: # sprawdzamy czy podane zdarzenie dotyczy zamknięcia okna
            pygame.quit() # wychodzimy z pygame
            sys.exit()# kończymy działanie programu

    SCREEN.fill([0,0,0]) #czyścimy okno wypełniając je czarnym kolorem (RGB)

    pygame.draw.rect(SCREEN,[255,0,0],rectangle) # rysujemy prostokąt w kolorze czerwonym (RGB)

    pygame.display.update() #odświeżamy okno po narysowaniu

Jak chcesz wiedzieć jak narysować inne figury to odwiedź tą stronę:

Rysowanie figur w pygame

Jak narysować własną grafikę?

Własny obrazek narysowany w bibliotece pygame

Jest to bardzo proste, do tego potrzebna będzie nam funkcja: 

pygame.image.load('sciezka') i SCREEN.blit(zmienna_z_grafika, (150,100))

gdzie 150 w tym przypadku oznacza miejsce na osi x, a 100 miejsce na osi y.

import pygame, sys #importujemy potrzebne moduły

pygame.init() #inicjujemy pygame

X = 600 # szerokość okna
Y = 600 # wysokość okna

SCREEN = pygame.display.set_mode( (X,Y) ) #tworzymy okno z podanymi parametrami

pygame_logo = pygame.image.load('pygame_logo.png') # wczytujemy grafikę do zmiennej 

while True: # Pętla główna programu
    for event in pygame.event.get(): #iterujemy się po wsyzstkich zebranych zdarzeniach
        if event.type == pygame.QUIT: # sprawdzamy czy podane zdarzenie dotyczy zamknięcia okna
            pygame.quit() # wychodzimy z pygame
            sys.exit()# kończymy działanie programu

    SCREEN.fill([0,0,0]) #czyścimy okno wypełniając je czarnym kolorem (RGB)

    SCREEN.blit(pygame_logo, (100,100)) #rysujemy grafikę na określonej pozycji (OŚ X, OŚ y)

    pygame.display.update() #odświeżamy okno po narysowaniu

Rysowanie tekstu

Przykładowy tekst narysowany w bibliotece pythona – pygame

Aby narysować tekst w oknie naszej gry, będą potrzebne dwie nowe funkcje. 

pygame.font.SysFont('comicsans', 40) – parametry jakie przyjmuje funkcja to: nazwa czcionki i wielkość tekstu

font.render('Example text', 1, (255, 255, 255)) – parametry jakie przyjmuje ta funkcja to: tekst jaki chcemy narysować, antyaliasing( true / false) i kolor.

import pygame, sys #importujemy potrzebne moduły

pygame.init() #inicjujemy pygame

X = 600 # szerokość okna
Y = 600 # wysokość okna

SCREEN = pygame.display.set_mode( (X,Y) ) #tworzymy okno z podanymi parametrami

font = pygame.font.SysFont('comicsans', 40) # wybieramy czcionkę i ustalamy jej wielkość
text = font.render('Example text', 1, (255, 255, 255)) # generujemy tekst

while True: # Pętla główna programu
    for event in pygame.event.get(): #iterujemy się po wszystkich zebranych zdarzeniach
        if event.type == pygame.QUIT: # sprawdzamy czy podane zdarzenie dotyczy zamknięcia okna
            pygame.quit() # wychodzimy z pygame
            sys.exit()# kończymy działanie programu

    SCREEN.fill([0,0,0]) #czyścimy okno wypełniając je czarnym kolorem (RGB)

    SCREEN.blit(text, (100, 100)) #rysujemy nasz tekst

    pygame.display.update() #odświeżamy okno po narysowaniu 

Ruch za pomocą klawiszy W,S,A,D

Żeby poruszać się po oknie będziemy musieli sprawdzać dodatkowe zdarzenia. np. Sprawdzać czy dany klawisz klawiatury został wciśnięty.

import pygame, sys #importujemy potrzebne moduły

pygame.init() #inicjujemy pygame


SCREEN = pygame.display.set_mode( (600, 600) ) #tworzymy okno z podanymi parametrami

class Block:

    def  __init__(self,x,y,img): #inicjalizujemy klasę
        self.x = x
        self.y = y
        self.img = img

    def go_right(self): 
        self.x += 1

    def go_left(self):
        self.x -= 1

    def go_up(self):
        self.y -= 1

    def go_down(self):
        self.y += 1

    def draw(self):
        SCREEN.blit(self.img, (self.x,self.y)) # rysujemy obiekt


rectangle = Block(0,0,pygame.image.load('sciezka_do_pliku_graficznego')) #tworzymy obiekt

while True: # Pętla główna programu
    for event in pygame.event.get(): #iterujemy się po wszystkich zebranych zdarzeniach

        key = pygame.key.get_pressed() # zbieramy wszystkie naciśnięte klawisze

        if key[pygame.K_w]: # jeżeli klawisz w jest naciśnięty idziemy do góry
            rectangle.go_up()
        elif key[pygame.K_s]: # jeżeli klawisz s jest naciśnięty idziemy w dół
            rectangle.go_down()
        elif key[pygame.K_a]: # jeżeli klawisz a jest naciśnięty idziemy w lewo
            rectangle.go_left()
        elif key[pygame.K_d]: # jeżeli klawisz d jest naciśnięty idziemy w prawo
            rectangle.go_right()

        if event.type == pygame.QUIT: # sprawdzamy czy podane zdarzenie dotyczy zamknięcia okna
            pygame.quit() # wychodzimy z pygame
            sys.exit()# kończymy działanie programu
        

    SCREEN.fill([0,0,0]) #czyścimy okno wypełniając je czarnym kolorem (RGB)

    rectangle.draw() # wywołujemy metodę draw()
    
    pygame.display.update() #odświeżamy okno po narysowaniu

Jak dodać FPS’y do swojej gry

Jak można było zauważyć w poprzednim przykładzie, komputer zaczynał się grzać. Było to spowodowane brakiem ustalenia klatek na sekundę. Aby każdy gracz, grający w twoją grę miał równą rozgrywkę, warto jest dodać określoną liczbę klatek na sekundę. W kodzie poniżej zobaczysz jak można to zrobić.

import pygame, sys #importujemy potrzebne moduły

pygame.init() #inicjujemy pygame

X = 600 # szerokość okna
Y = 600 # wysokość okna

SCREEN = pygame.display.set_mode( (X,Y) ) #tworzymy okno z podanymi parametrami

pygame_logo = pygame.image.load('pygame_logo.png') # wczytujemy grafikę do zmiennej 

clock = pygame.Clock()

while True: # Pętla główna programu
    for event in pygame.event.get(): #iterujemy się po wszystkich zebranych zdarzeniach
        if event.type == pygame.QUIT: # sprawdzamy czy podane zdarzenie dotyczy zamknięcia okna
            pygame.quit() # wychodzimy z pygame
            sys.exit()# kończymy działanie programu

    SCREEN.fill([0,0,0]) #czyścimy okno wypełniając je czarnym kolorem (RGB)

    SCREEN.blit(pygame_logo, (100,100)) #rysujemy grafikę w określonych pozycjach (OŚ X, OŚ y)

    pygame.display.update() #odświeżamy okno po narysowaniu

    clock.tick(30) #ustawiamy 30 FPS'ów w grze

Przykład programu napisanego z pomocą pygame

Przykładowy program stworzony w pygame

from math import sqrt
import pygame, random, sys

MAIN_COLOR = [255,0,0]
DOTS_AMOUNT = 30
DOTS_WIDTH = 3
LINES_WIDTH = 1
BACKGROUND_COLOR = [0,0,0]
SPEED = 1

pygame.init()

class Board:
    def __init__( self, x, y ):
        self.x = x
        self.y = y
        self.background_color = BACKGROUND_COLOR
        self.screen = pygame.display.set_mode( ( self.x, self.y ) )
    
class Dot( Board ):
    def __init__(self):
        super().__init__( 600 , 600 )
        self.dot_thickness = DOTS_WIDTH
        self.starting_pos = [ random.randint(  1, self.x ), random.randint(1, self.y ) ]
        self.speed = random.uniform(1.3123, 2.3123 + SPEED)

    def second_init(self):
        self.starting_pos = [ random.randint(  1, self.x ), 0 ]
        self.speed = random.uniform(1.3123, 2.3123 + SPEED)


    def move(self):
        self.starting_pos[1] +=  self.speed
        self.starting_pos[0] += 0.5
        if self.starting_pos[1] >= self.y:
            self.second_init()
    def find_near_friend(self, brothers_list ):
        for dot in brothers_list:
            one = ( self.starting_pos[0] - dot.starting_pos[0] ) * ( self.starting_pos[0] - dot.starting_pos[0] )
            two = ( self.starting_pos[1] - dot.starting_pos[1] ) * ( self.starting_pos[1] - dot.starting_pos[1] )
            dot_range =  sqrt(  one + two )
            if dot_range < 250:
                pygame.draw.line(self.screen, MAIN_COLOR, self.starting_pos, dot.starting_pos, LINES_WIDTH )

    def represent(self):
        pygame.draw.circle(self.screen,  MAIN_COLOR, self.starting_pos, self.dot_thickness )


dots = []
for _ in range(DOTS_AMOUNT):
    d = Dot()
    dots.append( d )

clock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    dots[0].screen.fill( dots[0].background_color )
    
    for dot in dots:
        dot.move()
        dot.find_near_friend( dots )
        dot.represent()
    
    pygame.display.update()

    clock.tick(100)

Autor kursu: Novy#5564 (github, youtube)
Oryginalna strona kursu: https://pygamekurs.pl/

Chcesz być na bieżąco? Obserwuj nas w google news lub polub nas na Facebooku.
Losowy artykuł
SpaceX jest na skraju bankructwa