PyGame - Wstęp

PyGame to biblioteka przeznaczona do tworzenia gier 2d w pythonie.

Instalacja

Instalacja jest bardzo prosta. Polega na wpisaniu komendy pip install pygame.

Co wypadałoby znać?

Wypadałoby znać podstawy pythona (w tym klasy i obiekty)

Tworzenie okna gry

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", aby to zmienić 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

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ąc 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ę?

Jest to bardzo proste, do tego potrzebna będzie nam funkcja: pygame.image.load('Ścieżka do pliku graficznego') 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

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


                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)
            

Linki:

Mój Github -

https://github.com/Novy12


Mój YouTube -

https://www.youtube.com/channel/UC_WHEZJff4_lP15B5iNnfpw

<

Ewentualne pytania:

email - pygamekurspl@gmail.com