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
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
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ę:
Jak narysować własną grafikę?
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
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)
Autor kursu: Novy#5564 (github, youtube)
Oryginalna strona kursu: https://pygamekurs.pl/