Gra izometryczna cz.1 – Wstęp do pygame

przez Adam Sobociński w dniu 4 listopada 2011 w kategorii: python

Zakładam, że znasz już przynajmniej w stopniu podstawowym pythona, jeśli nie to polecam podręcznik „Zanurkuj w Pythonie„, inaczej może być Ci ciężko zrozumieć zamieszczony tu materiał. Celem kursu, jest napisanie gry izometrycznej, ale zanim zaczniemy musimy poznać podstawy. Dlatego przez pierwsze kilka lekcji, poznamy zasady tworzenia gier, czyli duszki, animacje, kolizje itd.

Python oferuje niesamowite możliwości, przy prostej, łatwej do nauczenia składni. Posiada wiele użytecznych bibliotek i frameworków. Do tworzenia gier jest co najmniej kilkanaście frameworków. Jeśli nie znasz żadnego, to nie ma problemu, poznasz szybko, przerabiając mój mały kurs.
Wszystkie przykłady będę pisał pod Pygame, z dwóch powodów. Raz, że jest najpopularniejsze, a dwa, bo tak mi jest wygodniej ;) . Przykłady testowałem pod Linuxem i pod Windowsem, jeśli coś nie będzie działać, proszę komentarz pod tym artykułem.

Co nam będzie potrzebne

  • Python 2.6 lub nowszy
  • Pygame 1.9.1 (starszy też może być, ale lepiej korzystać z najnowszej wersji)
  • PyOpenGL - w tej lekcji zbędny, ale będziemy później go potrzebować
  • Dowolny edytor tekstu, ja polecam NetBeans 6.5. Nowsza wersja niestety nie działa poprawnie z pluginem Pythona. Jeśli ktoś zna rozwiązanie, aby to naprawić, proszę o kontakt.
  • Świeżo zaparzona kawa – na rozruszanie szarych komórek :)

Instalacja
Instalacja nie sprawi większych trudności. Jeśli jednak będzie potrzeba, to zrobię oddzielny wpis z opisem instalacji i konfiguracji na Linuxie i Windows.

Zakładam, że masz już wszystko zainstalowane i skonfigurowane, więc bierzemy łyk kawy i zaczynamy tworzyć naszą grę.

Zaczynamy
Tworzymy plik o nazwie game.py, a w nim umieszczamy następujący kod:

import pygame                # importujemy biblioteki pygame
from pygame.locals import *  # importujemy nazwy [QUIT, KEYDOWN,K_ESCAPE] itp.
from sys import exit         # importujemy funkcje systemową exit

screen_size = (800,600)      # ustalamy rozmiar ekranu

class IsoGame(object):
    def __init__(self):
        pygame.init()       # incjalizujemy biblioteke pygame
        flag = DOUBLEBUF    # wlaczamy tryb podwojnego buforowania
        self.surface = pygame.display.set_mode(screen_size,flag)
        self.gamestate = 1  # 1 - run, 0 - exit
        self.loop()         # glowna petla gry

    def game_exit(self):
        """ funkcja przerywa dzialanie gry i wychodzi do systemu"""
        exit()

    def loop(self):
        """ glowna petla gry """
        while self.gamestate==1:
           for event in pygame.event.get():
               if event.type==QUIT or (event.type==KEYDOWN and event.key==K_ESCAPE):
                   self.gamestate=0
        self.game_exit()

if __name__ == '__main__':
   IsoGame()

Szczegółowo, zostało wszystko wyjaśnione w komentarzach. Ja tylko wyjaśnię ogólną budowę.

Utworzyliśmy klasę bazową naszej gry o nazwie IsoGame. W niej mamy 3 metody:
def __init__() – inicjuje bibliotekę i tworzy okno gry
def game_exit() – funkcja przerywa działanie programu
def loop() – główna pętla gry, tutaj będzie się działa cała akcja, na razie mamy tam tylko kod odpowiedzialny za obsługę zdarzeń (przycisku zamykającego okno i obsługę klawisza [ESC]
Linia 11 tworzy powierzchnie, na której będziemy umieszczać wszystkie elementy gry.

Po uruchomieniu programu poleceniem „python game.py”, ukaże nam się puste okno o wielkości 800x600px

Gdy już nacieszymy oko, naszym nowo powstałym okienkiem, bierzemy kolejny łyk kawy i zamykamy program, wciskając [ESC].

Wyświetlanie obrazka
Pustym okienkiem, nikt się długo nie będzie cieszył, warto coś w nim wyświetlić. Umieszczamy w tym samym katalogu, co nasz skrypt, obrazek w formacie PNG, na przykład ten…

Format PNG nie jest wybrany przypadkowo, dzięki temu, że posiadał tzw. kanał alfa, obrazek będzie bez tła.
Aby załadować obrazek do pamięci użyjemy, wbudowanej funkcji pygame:

obrazek = pygame.image.load('tree.png')

teraz umieszczamy go na utworzonej wcześniej powierzchni

self.surface.blit(obrazek, (x,y))

gdzie x – to pozycja w poziomie, y – pozycja w pionie na ekranie
i na koniec musimy wrzucić naszą powierzchnię (surface) z pamięci na ekran

pygame.display.flip()

W całości więc, będzie to wyglądać tak:

import pygame                # importujemy biblioteki pygame
from pygame.locals import *  # importujemy nazwy [QUIT, KEYDOWN,K_ESCAPE] itp.
from sys import exit         # importujemy funkcje systemową exit

screen_size = (800,600)      # ustalamy rozmiar ekranu

class IsoGame(object):
    def __init__(self):
        pygame.init()       # incjalizujemy biblioteke pygame
        flag = DOUBLEBUF    # wlaczamy tryb podwojnego buforowania

        # tworzymy bufor na  grafikę
        self.surface = pygame.display.set_mode(screen_size,flag)

        # zmienna stanu gry
        self.gamestate = 1  # 1 - run, 0 - exit

        obrazek = pygame.image.load('tree.png') # ładujemy obrazek do pamieci
        self.surface.blit(obrazek, (10,20))     # umieszczamy go w buforze (surface)
        self.loop()                             # glowna petla gry

    def game_exit(self):
        """ funkcja przerywa dzialanie gry i wychodzi do systemu"""
        exit()

    def loop(self):
        """ glowna petla gry """
        while self.gamestate==1:
           for event in pygame.event.get():
               if event.type==QUIT or (event.type==KEYDOWN and event.key==K_ESCAPE):
                   self.gamestate=0
           pygame.display.flip()   # przenosimy bufor na ekran
        self.game_exit()

if __name__ == '__main__':
   IsoGame()

I możemy cieszyć się efektem końcowym.

Pobierz kod i grafikę z dzisiejszej lekcji isogame_tut1

To tyle na dziś, kawa wypita, jeśli nie to wystygła ;) . A następnym razem, opowiemy sobie o sprite’ach, czyli popularnych duszkach.

Podziel się na:
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • Blogplay
  • Blogger.com
  • Gadu-Gadu Live


11 odpowiedzi na „“Gra izometryczna cz.1 – Wstęp do pygame””

  1. [...] poprzedniej części, nauczyliśmy się tworzyć okno, obsługiwać pętle zdarzeń i wyświetlać obrazki na ekranie. W [...]

  2. m pisze:

    idealny tutorial na początek

  3. Minik01 pisze:

    Witam. Mam problem z pygame. Jak próbuje otworzyć jakikolwiek przykład, to nie działa. Zamiast wyświetlać okno, każe mi zaznaczyć obszar, z którego tworzy obraz i zapisuje go do pliku (bez rozszerzenia :P ). Pracuje na Ubuntu (średnia dystrybucja do programowania, ale liczę, że da się ją skonfigurować). Proszę o pomoc.

  4. Minik01 pisze:

    Faktycznie pomogło… zawsze robiłęm metodą „chmod i ./”.
    Traz wyskoczył bład ” File „p1.py”, line 10
    SyntaxError: Non-ASCII character ‘\xc2′ in file p1.py on line 10, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
    ” Przeanalizuje kod i zobaczę czy dalej ruszę.

  5. Slawek pisze:

    Swietny tutorial, tego mi brakowalo w polskim necie, oby tak dalej mistrzu!

  6. Marcin pisze:

    mam problem z zainstalowaniem PyOpenGl, po pobraniu instaluje za pomocą- python setup.py install i robią mi się różne działania w terminalu a na końcu wyskakuję error error: could not create ‘/usr/local/lib/python2.7/dist-packages/OpenGL’: Permission denied
    nie wiem co zrobić żeby nie było tego błędu :(

  7. Marcin pisze:

    problem rozwiązany, użyłem „sudo” przed instalacją :)

  8. maniek pisze:

    Witam podczas próby uruchomienia tego pierwszego kodu gry wyskakuje mi taki oto błąd.

    „Traceback (most recent call last):
    File „C:\Python27\game.py”, line 1, in
    import pygame # importujemy biblioteki pygame
    File „C:\Python27\lib\site-packages\pygame\__init__.py”, line 95, in
    from pygame.base import *
    ImportError: DLL load failed: Nie można odnaleźć określonego modułu.”

    Jakieś pomysły jak ten błąd naprawić ??

  9. maslo pisze:

    bardzo fajny poradnik szukałem takiego :)

Dodaj komentarz

Current month ye@r day *