Menu
CoddyTech

Ściąga pygame

Ostatnia aktualizacja

Konfiguracja i pętla gry

Każdy program w pygame otwiera okno, a potem powtarza jedną pętlę, aż gracz wyjdzie z gry.

OperacjaKod
Instalacja pygame-cepython3 -m pip install pygame-ce
Import i uruchomienie pygameimport pygame pygame.init()
Otwarcie oknascreen = pygame.display.set_mode((640, 480))
Ustawienie tytułu oknapygame.display.set_caption("My Game")
Utworzenie zegaraclock = pygame.time.Clock()
Pętla gryrunning = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False screen.fill("black") pygame.display.flip() clock.tick(60)
Zamknięcie po pętlipygame.quit()

Ekran

Ekran to Surface; nic się nie pokaże, dopóki nie wywołasz flip.

OperacjaKod
Pokazanie gotowej klatkipygame.display.flip()
Odświeżenie tylko wybranych obszarówpygame.display.update([rect1, rect2])
Wyczyszczenie ekranuscreen.fill((30, 30, 46))
Rozmiar oknascreen.get_size(), screen.get_width()
Ekran jako Rectscreen.get_rect()
Okno ze zmiennym rozmiarempygame.display.set_mode((640, 480), pygame.RESIZABLE)
Pełny ekran w rozdzielczości pulpitupygame.display.set_mode((0, 0), pygame.FULLSCREEN)

Kolory i rysowanie

Funkcje pygame.draw przyjmują powierzchnię, kolor i pozycję. width=0 wypełnia kształt.

OperacjaKod
Kolor jako RGB(255, 140, 0)
Kolor po nazwie lub w hex"tomato", "#ff8c00", pygame.Color("gold")
Prostokątpygame.draw.rect(screen, "red", (x, y, w, h))
Obrys i zaokrąglone rogipygame.draw.rect(screen, "red", rect, width=2, border_radius=8)
Koło (od środka)pygame.draw.circle(screen, "blue", (cx, cy), radius)
Liniapygame.draw.line(screen, "white", (x1, y1), (x2, y2), 3)
Wielokątpygame.draw.polygon(screen, "green", [(0, 0), (40, 0), (20, 30)])
Elipsa w prostokąciepygame.draw.ellipse(screen, "purple", (x, y, w, h))

Rect

Rect przechowuje pozycję i rozmiar jako liczby całkowite.

OperacjaKod
Utworzenie Rectaplayer = pygame.Rect(x, y, width, height)
Ustawienie według dowolnego punktuplayer.center = (320, 240), player.bottom = 400
Krawędzie i rogileft, right, top, bottom, topleft, midbottom
Przesunięcie w miejscuplayer.move_ip(dx, dy)
Przesunięta kopiamoved = player.move(dx, dy)
Utrzymanie w obrębie ekranuplayer.clamp_ip(screen.get_rect())
Powiększenie wokół środkabigger = player.inflate(20, 20)
Pozycje zmiennoprzecinkowe (pygame-ce)pygame.FRect(10.5, 20.25, 40, 40)

Obrazy, Surface i blit

Wczytuj obrazy raz, przed pętlą, a potem rysuj je przez blit w każdej klatce.

OperacjaKod
Wczytanie obrazu z przezroczystościąimg = pygame.image.load("player.png").convert_alpha()
Wczytanie obrazu bez przezroczystościbg = pygame.image.load("sky.png").convert()
Narysowanie obrazuscreen.blit(img, (x, y))
Narysowanie na środkuscreen.blit(img, img.get_rect(center=(320, 240)))
Nowa pusta Surfacepanel = pygame.Surface((200, 100))
Przezroczysta Surfacelayer = pygame.Surface((200, 100), pygame.SRCALPHA)
Półprzezroczystość całej Surfaceimg.set_alpha(128)
Wycięcie klatki z arkusza sprite'ówframe = sheet.subsurface((0, 0, 32, 32))
Zapisanie zrzutu ekranupygame.image.save(screen, "shot.png")

Przekształcenia

Każda funkcja zwraca nową Surface; przekształcaj oryginał, a nie ostatni wynik.

OperacjaKod
Zmiana rozmiarupygame.transform.scale(img, (64, 64))
Skalowanie o współczynnikpygame.transform.scale_by(img, 2)
Płynna zmiana rozmiarupygame.transform.smoothscale(img, (64, 64))
Obrót (przeciwnie do ruchu wskazówek zegara, w stopniach)pygame.transform.rotate(img, 45)
Obrót wokół środkarotated = pygame.transform.rotate(original, angle) rect = rotated.get_rect(center=rect.center)
Odbicie w poziomiepygame.transform.flip(img, True, False)

Zdarzenia i klawiatura

Używaj zdarzeń do pojedynczych naciśnięć, a get_pressed() do przytrzymanych klawiszy.

OperacjaKod
Odczyt zdarzeń z tej klatkifor event in pygame.event.get():
Zamknięto oknoevent.type == pygame.QUIT
Naciśnięto klawiszevent.type == pygame.KEYDOWN and event.key == pygame.K_SPACE
Puszczono klawiszevent.type == pygame.KEYUP
Wpisany znakevent.unicode
Klawisze wciśnięte terazkeys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: x -= 5
Kierunek z dwóch klawiszydx = keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]
Klawisze naciśnięte w tej klatce (pygame-ce)pygame.key.get_just_pressed()[pygame.K_SPACE]
Stałe klawiszyK_a...K_z, K_0...K_9, K_UP, K_RETURN, K_ESCAPE, K_LSHIFT
Nazwa klawiszapygame.key.name(event.key)
Własne zdarzenieHIT = pygame.event.custom_type() pygame.event.post(pygame.event.Event(HIT))

Mysz

Przyciski: 1 lewy, 2 środkowy, 3 prawy.

OperacjaKod
Naciśnięto przyciskevent.type == pygame.MOUSEBUTTONDOWN and event.button == 1
Gdzie go naciśniętoevent.pos
Pozycja kursora terazx, y = pygame.mouse.get_pos()
Przyciski wciśnięte terazleft, middle, right = pygame.mouse.get_pressed()
Mysz się poruszyłaevent.type == pygame.MOUSEMOTION, event.rel
Obrócono kółkoevent.type == pygame.MOUSEWHEEL, event.y
Kliknięcie w przyciskbutton_rect.collidepoint(event.pos)
Ukrycie kursorapygame.mouse.set_visible(False)

Sprite'y i grupy

Sprite ma image i rect; grupa aktualizuje i rysuje wiele sprite'ów naraz.

OperacjaKod
Klasa sprite'aclass Coin(pygame.sprite.Sprite): def __init__(self, pos): super().__init__() self.image = coin_img self.rect = self.image.get_rect(center=pos)
Utworzenie grupycoins = pygame.sprite.Group()
Dodanie do grupycoins.add(Coin((100, 50)))
Aktualizacja każdego sprite'acoins.update()
Narysowanie każdego sprite'acoins.draw(screen)
Usunięcie sprite'a ze wszystkich grupcoin.kill()
Grupa z jednym sprite'emplayer = pygame.sprite.GroupSingle(Player())

Kolizje

Recty kolidują, gdy na siebie nachodzą; same stykające się krawędzie się nie liczą.

OperacjaKod
Dwa prostokątya.colliderect(b)
Punkt w środkurect.collidepoint(x, y)
Pierwszy z wielurect.collidelist(walls) # index or -1
Sprite kontra grupahits = pygame.sprite.spritecollide(player, coins, True)
Czy jest jakiekolwiek trafieniepygame.sprite.spritecollideany(player, enemies)
Grupa kontra grupapygame.sprite.groupcollide(bullets, enemies, True, True)
Co do pikselapygame.sprite.spritecollide(a, group, False, pygame.sprite.collide_mask)
Kołapygame.Vector2(a).distance_to(b) < r1 + r2

Tekst i czcionki

Wyrenderuj tekst na Surface, a potem narysuj go przez blit.

OperacjaKod
Domyślna czcionkafont = pygame.font.Font(None, 36)
Czcionka systemowafont = pygame.font.SysFont("arial", 24)
Plik czcionkifont = pygame.font.Font("pixel.ttf", 32)
Renderowanie tekstutext = font.render("Score: 10", True, "white")
Narysowanie na środkuscreen.blit(text, text.get_rect(center=(320, 40)))
Zawijanie długiego tekstu (pygame-ce)font.render(story, True, "white", None, 400)
Rozmiar bez renderowaniafont.size("Hello")
Zainstalowane czcionkipygame.font.get_fonts()

Dźwięk i muzyka

Wczytuj dźwięki raz. Muzyka odtwarza jeden utwór strumieniowo prosto z pliku.

OperacjaKod
Wczytanie dźwiękujump = pygame.mixer.Sound("jump.ogg")
Odtworzeniejump.play()
Głośność dźwiękujump.set_volume(0.5)
Wczytanie muzykipygame.mixer.music.load("theme.ogg")
Muzyka w nieskończonej pętlipygame.mixer.music.play(-1)
Pauza i wznowieniepygame.mixer.music.pause(), pygame.mixer.music.unpause()
Zatrzymanie muzykipygame.mixer.music.stop()

Czas i timery

Ticki liczone są w milisekundach.

OperacjaKod
Ograniczenie liczby klatekclock.tick(60)
Delta czasu w sekundachdt = clock.tick(60) / 1000
Aktualna liczba klatek na sekundęclock.get_fps()
Milisekundy od initpygame.time.get_ticks()
Powtarzające się zdarzenie timeraSPAWN = pygame.event.custom_type() pygame.time.set_timer(SPAWN, 1000)
Jednorazowy timerpygame.time.set_timer(SPAWN, 2000, loops=1)
Zatrzymanie timerapygame.time.set_timer(SPAWN, 0)

Vector2

Liczby zmiennoprzecinkowe dla pozycji i prędkości.

OperacjaKod
Utworzenie wektorapos = pygame.Vector2(100, 200)
Ruch o prędkośćpos += velocity * dt
Długośćvelocity.length()
Ta sama prędkość po przekątnejif direction.length() > 0: direction = direction.normalize()
Odległość między punktamipos.distance_to(target)
Obrótvelocity.rotate(90)
Krok w stronę punktu (pygame-ce)pos.move_towards_ip(target, 5)

Kod pygame, po który sięgasz, tworząc grę 2D w Pythonie, pogrupowany według zadań: pętla gry, okno, kolory i rysowanie, Rect, obrazy i blit, skalowanie i obracanie, obsługa klawiatury i myszy, sprite'y i grupy, kolizje, tekst, dźwięk, timery i Vector2. Każdy wiersz to krótki fragment kodu do wklejenia, a obok opis tego, co robi.

Wszystko tutaj jest napisane dla pygame-ce 2.5, wydania społecznościowego pygame, które nadal importujesz przez import pygame. Wiersze oznaczone pygame-ce korzystają z jego nowych funkcji; wszystkie pozostałe działają też w oryginalnym pygame. Wypróbuj dowolny fragment w playgroundzie pygame, który uruchamia pygame w przeglądarce bez żadnej instalacji. Dopiero zaczynasz z samym Pythonem? Zacznij od ściągi z Pythona.

Ściąga pygame: najczęstsze pytania

Czy ta ściąga pygame jest darmowa?

Tak. Jest darmowa i nie wymaga rejestracji. Dodaj ją do zakładek albo wydrukuj do PDF z przeglądarki i wracaj, gdy potrzebujesz dokładnego wywołania dla grupy sprite'ów, dźwięku albo sprawdzania kolizji.

Czy ta ściąga działa z pygame i pygame-ce?
Tak. Oba importujesz przez import pygame i mają prawie całe API wspólne. Wiersze oznaczone pygame-ce (FRect, scale_by, get_just_pressed, zawijanie tekstu i move_towards_ip) wymagają pygame-ce, a cała reszta działa w obu.
Dlaczego moje okno pygame nie odpowiada?
Pętla gry nie odczytuje zdarzeń. Wywołuj pygame.event.get() raz w każdej klatce, nawet jeśli ignorujesz zdarzenia, i kończ każdą klatkę wywołaniami pygame.display.flip() i clock.tick(60).
Do obsługi wejścia lepsze są zdarzenia czy key.get_pressed()?
Używaj zdarzenia KEYDOWN do akcji, które dzieją się raz na naciśnięcie, jak skok albo otwarcie menu. Używaj pygame.key.get_pressed() do akcji, które trwają, dopóki klawisz jest wciśnięty, jak chodzenie.
Ilustracja języków programowania w Coddy

Naucz się języka Pygame z Coddy

Zacznij