Temat wykladu:
Python: Programowanie gier 2D (by Katharsis, 2007-07-09) @ wyklady.net
Komentarze: http://forum.wyklady.net/index.php?topic=108
20:00Katharsisczesc wszystkim ^^
Mat-eeX;)
hawksiem
adek05dobry
MiSHudżem dobry!
Mat-eeXelo :)
Katharsisi witam na wykladzie poswieconemu jezykowi programistycznemu Python
Katharsisa konkretniej, programowaniu w nim gier 2D
hawkptyta fajny tongu
Mat-eeXmozna sie dowiedziec kto go bedzie
mith+m ;)
Mat-eeXprowadzil?;d
MiSHułał
Mat-eeXxD
Katharsisjestem Katharsis, reprezentuje Polska grupe programistow Pythona, Polish Python Coders Group www.ppcg.eu.org)
Mat-eeXnom to fajnie:)
20:01Katharsis^^
Katharsiszanim jednak rozpoczne wyklad, zaintalujcie wymagany soft
adek05tj
adek05?
Katharsisinterpreter Pythona 2.5.1 (http://www.python.org/ftp/python/2.5.1/)
Katharsisinterpreter Pythona dla uzytkownikow Windows http://www.activestate.com/Products/activepython/
20:02MiSHua jak mam juz w linuksie jak sprawdzic jaka wersja? :D
Katharsisbiblioteka PyGame 1.7.1 http://www.pygame.org/download.shtml
Katharsiswywolaj python
darkjamesMiSHu, python -V
Zombiakno tak, bedziemy skladac gry z klockow duplo ;d
MiSHuha! bede w logach! Pozdrawiam mame, tate i rodzicow! ;]
Katharsiszakladam, ze wiekszosc z Was wie cos o Pythonie, znacie go i na pewno znacie programowanie :)
adek05dobra
Katharsisodbylo sie tutaj juz kilka wykladow na temat Pythona
adek05jakie to pakiety w lInuksie beda ktos sie orientuje?
Katharsiswiec techniki i zasady panujace w nim nie beda dla Was obve
hawkptyta fajny tongu
20:03Katharsisobce*
Katharsischcialbym rowniez dodac, ze bazuje na dokumentacji "About PyGame"
kawa131jest juz wyklad?
mithdaj +m, logi sie smiecą
Katharsiswykladzie "Programowanie Gier pod Linuxem'
Katharsismith: dalem, ale w tedy sam nie moge pisac Oo'
20:04Katharsisna dzisiejszym wykladzie omowie podstawowe moduly i funkcje, dzieki ktorym uzyskujemy obraz, dzwiek, ruch/animacje
Katharsisw Pythonie, dzieki bibliotece PyGame
Katharsisna przykladzie prostego Arkanoida ^^
Katharsisefekt koncowy do jakiego postarmy sie dojsc w dzisiejszym wykladzie to
Katharsisarkanoid_final.py ---> www.ppcg.eu.org/wyklad/arkanoid_final.tar.bz2
20:05Katharsisodpalcie skrypt i spojrzcie w jego kod :]
Katharsisniecale 100 linii kodu wystarcza do napisania Arkanoida w Pythonie :)
Katharsisdobra...
Katharsiszacznijmy od skryptu:
Katharsisarkanoid_01.py ---> www.ppcg.eu.org/wyklad/arkanoid_01.tar.bz2
Katharsisby przygotowac Pythona i PyGame, importujemy bibliteki sys i pygame
Katharsisimport sys, pygame
20:06Katharsisnastepna opcja, to pygame.init() - pozwala ona nam zainicjowac wszystkie zmienne i przygotowac srodowisko
Katharsispygame.init()
Katharsiskolejnym krokiem jest przygotowanie zmiennej - rozmiar_okna - po to, by zawrzec w niej
Katharsisrozmiar ekranu, przypisujac do zmiennej zmienne szerokosci i wysokosc ekranu
20:07Katharsistworzymy ekran o rozmiarze podanym wczesniej za pomoca pygame.display.set_mode(rozmiar_okna)
Katharsisrozmiar_okna = width, height = 800, 600
Katharsisokno = pygame.display.set_mode(rozmiar_okna)
Katharsisoraz wieczna petla, w ktorej (na razie) wszystko bedzie sie dzialo...
Katharsisznajdujaca sie w niej konstrukcja for event in pygame.event.get()
20:08Katharsistworzy liste wszystkich wydarzen wykonywanych w danym momencie np. ruch myszki, nacisniecie klawisza oraz zamkniecie okna Pythona, czyli w naszym wypadku funkcja sys.exit()
Katharsiswhile 1:
Katharsisfor event in pygame.event.get():
Katharsisif event.type == pygame.QUIT: sys.exit()
Katharsiswciecia sa bardzo wazne w pythonie
Katharsisno i w ten sposob uzyskamy obszar naszej gry...
20:09Katharsisodpalcie i edytujcie skrypt arkanoid_02.py ---> www.ppcg.eu.org/wyklad/arkanoid_02.tar.bz2
Katharsisnowe linie kodu w skryptach bede zaznaczal pomiedzy takimi ciagami znakow (komentarze w Pythonie)
Katharsis#-------
Katharsisnowy kod
Katharsis#-------
Katharsisdla lepszego rozeznania.
Katharsisco nowego w arkanoid_02.py
20:10Katharsisza pomoca funkcji pygame.image.load(), wczytujemy obrazek pilka.gif, umieszczajac go w zmiennej pilka
Katharsispilka = pygame.image.load("pilka.gif")
Katharsisfunkcja get_rect() tworzymy rect obrazka (czyli pobiera jego rozmiar i umiejscowienie na ekranied )
Katharsispilkarect = pilka.get_rect()
20:11Katharsisnastepnie, za pomoca funkcji blit() umieszczamy obrazek na ekranie
Katharsisw pozycji ustalonej wczesniej
Katharsisokno.blit(pilka, pilkarect)
Katharsispygame.display.flip()
Katharsispygame wszystkie wczytane obrazki (na poczatku) umiszcza je w "pamieci obrazu", dlatego nalezy uzyc funkcji
20:12Katharsispygame.display.flip() sluzacej do zamiany stron, jej użycie jest konieczne!
Katharsiszamienia strony z pamiecia obrazu, w ktorej obrazek jest umiejscowiony
Katharsisze strona obrazka czekajaca na to, by dalej cos z nim robic
Katharsisto tyle w tym przykladzie.
Katharsisteraz:
Katharsisarkanoid_03.py --> www.ppcg.eu.org/wyklad/arkanoid_03.tar.bz2
20:13Katharsisobrazek sie poruszyl, a spowodowala to funkcja move()
ConSikurde
ConSispoznilem sie :(
Katharsisporusza ona nasza pilke (zmieniajac jej rect), tak, jaka nam zmienna predkosc pokazuje
MiSHuConSi: napisz do mnei po wykladzie, dam ci loga
ConSimhm
Katharsisczyli [2, 2], dwa w lewo i dwa w dol...
Katharsispredkosc = [2, 2]
Katharsis...
20:14Katharsispilkarect = pilkarect.move(predkosc)
Katharsisna dodatek musimy uzyc funkcji fill()!
Katharsisdlaczego?
Katharsisna poczatek definiujmy sobie zmienna kolor, podajac barwe w RGB
Katharsisnastepnie przed wyswietleniem pilki, zapelnijmy caly obrazek, w moim wypadku na czarno (zmienna kolor), uzywajac wlasnie funkcji fill()
20:15Katharsisgdybysmy tego nie zrobili, uzyskalibysmy nieciekawy efekt - sami sprawdzcie... tak jakby ktos pedzlem mazna :)
Katharsiskolor = (000,000,000)
Katharsis...
Katharsisokno.fill(kolor)
Katharsispodsumowujac dzialanie naszej wiecznej petli while
Katharsis- umiejscawiamy obrazek na czarnym tle
Wyklady_Guestprzepraszam - ile b0119dzie mniej wi0119cej trwa0142 wyk0142ad??
20:16Katharsis- poruszamy obrazek
Katharsisdo 24 :)
Katharsis- znowu zapelniamy ekran na czarno
Katharsis- i umiejszamy pileczke przesuniata
Katharsiskolejnosc jest bardzo istotna!
Katharsisnastepny skrypt:
Katharsisarkanoid_04.py --> www.ppcg.eu.org/wyklad/arkanoid_04.tar.bz2
20:17Katharsisw tym skrypcie dopisalismy instrukcje warunkowa, ktora uniemozliwia wyjscie pileczki po za obszar ekranu, czyli kod:
Katharsisif pilkarect.left < 0 or pilkarect.right > width:
Katharsispredkosc[0] = -predkosc[0]
Katharsisif pilkarect.top < 0 or pilkarect.bottom > height:
Katharsispredkosc[1] = -predkosc[1]
20:18Katharsisna osi OX sprawdzamy czy lewa strona obrazka nie jest mniejsza od zera lub prawa nie jest większa od zmiennej width (800)
Katharsisjesli tak to nastepuje zmiana pierwszego elemntu listy predkosc na ujemna wartosc, co powoduje odbicie pilki od granicy ekranu
20:19Katharsisi ta sama sytuacja wzgledem gornej czesci obrazka, jesli jest mniejsza od zera lub jej dol jest wiekszy od zmiennej height (600), nastepuje zmiana drugiego elementu listy - na ujemny
Katharsisw efekcie koncowym uzyskujemy odbicie pilki od kazdej ze stron ekranuy
Katharsisekranu*
Katharsisnowym elementem w skrypcie jest rowniez tapeta, ktora traktujemy jako kolejny obiekt graficzny
Katharsistapeta = pygame.image.load("tapeta.gif")
Katharsistapetarect = tapeta.get_rect()
Katharsis...
Katharsisokno.blit(tapeta,tapetarect)
20:20Katharsiswczytujemy nowy obiekt tapeta.gif, pobieramy jego rect i umieszczamy go na obszarze gry
Katharsisw moim wypadku tapeta ma rozmiar 800*600 dlatego tak wszystko ladnie pasuje :)
Katharsisaha i jeszcze jedno
Katharsisw momencie wczytania tapety, pozbywamy sie kodu
Katharsiskolor = (000,000,000)
20:21Katharsis...
Katharsisokno.fill(kolor)
Katharsisktorego zadaniem jest zamalowywanie (w calej petli) tla gry na czarno
Katharsista funkcje przejmuje nowy obiekt graficzny.. tapeta ;]
Katharsishm... skrypt 5
20:22Katharsisarkanoid_05.py ---. www.ppcg.eu.org/wyklad/arkanoid_05.tar.bz2
Katharsisw tym skrypcie pojawia sie nowy element "paletka.gif"
Katharsisktora mozemy poruszac w lewo i prawo jak pewne zauwazyliscie, a moze i nie :P
Katharsisna razie paletka ma kilka wad...
Katharsiswychodzi po za obszar ekranu
Katharsisno i przepuszcza pilke
Katharsistak wiec musimy temu zapobiedz, ale zanim...
20:23Katharsispaletka = pygame.image.load("paletka.gif")
Katharsispaletkarect = paletka.get_rect()
Katharsispaletkarect = paletkarect.move([350,500])
Katharsispredkosc_paletki = [0,0]
Katharsis...
Katharsisokno.blit(paletka, paletkarect)
20:24Katharsisten kod jest odpowiedzialny za wczytanie pliku paletka.gif, pobraniego jego recta oraz przesuniecie go na pozycje 350*500
Katharsisza pomoca funkcji move()
Katharsisnadodatek ustalamy ze predkosc poczatkowa paletki jest rowna 0,0 no yo w tedy obiekt pozostaje w bezruchu
Katharsisif event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT:
Katharsispredkosc_paletki[0] = -4
Katharsisif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:
Katharsispredkosc_paletki[0] = 4
Katharsisif event.type == pygame.KEYUP and pygame.K_LEFT:
Katharsispredkosc_paletki[0] = 0
Katharsisif event.type == pygame.KEYUP and pygame.K_RIGHT:
Katharsispredkosc_paletki[0] = 0
Katharsisco robimy :)
Katharsisbindujemy klawisz lewej i prawej strzalki
20:25Katharsisdo listy event (odpowiedzialnej za zdarzenia) dopisujemy nowe zdarzenia
Katharsisjesli wystapilo zdarzenie typu pygame.KEYDOWN, czyli przycisniecie klawisza i byl to klawisz lewy pygame.K_LEFT to predkosc paletki z 0 zmienia sie na 4
Katharsisznaczy -4
Katharsis4 bedzie w prawej
20:26Katharsisanalogicznie do klawisza prawego pygame.K_RIGHT, jesli przycisnieto klawisz prawy, jego predkosc z 0, znienia sie wlasnie na 4
Katharsisostatnie dwa warunek sa odpowiedzialne za puszczenie klawisza, czyli nadanie mu predkosci 0,0, bo jak puszczamy to paletka nie rusza sie, logiczne...
20:27Katharsiswarunki musza istniec, gdyz ich brak spowoduje "ucieczke paletki" po za obszar gry, a tego nie chcemy
Katharsispo umiejscowieniu paleki i jej zbindowaniu przesuwamy ja za pomoca kodu:
Katharsispaletkarect = paletkarect.move(predkosc_paletki)
Katharsisznowu funkcja move() sie klania
20:28Katharsisteraz otworzcie i edytujcie arkanoid_06.py --> www.ppcg.eu.org/wyklad/arkanoid_06.tar.bz2
Katharsisco nowego
Katharsispozbylismy sie dwoch niedoskonalosci, ktore mialy miejsce w skrypcie arkanoid_05.py mianowicie, ograniczylismy ruch paletki do granic ekranu, ponizszy kod:
Katharsisif paletkarect.left < 0 or paletkarect.right > width:
Katharsispredkosc_paletki = [0,0]
20:29Katharsisoraz doprowadzilismy do tego, ze pileczka odbija sie od paletki, korzystajac z wbudowanej funkcji collidelistall(), ktora sprawdza czy dane obiekty na siebie nie nachodza (nie koliduja ze soba), czyli kod:
Katharsisif pilkarect.collidelistall([paletkarect]):
Katharsispredkosc[1] = -2
Katharsisjesli polozenie (rect) pilki kolidujee z polozeniem paletki, to predkosc pilki zmienia sie na -2
Katharsisto tyle w tym przykladzie, co raz blizej Arkanoida :)
20:30Katharsistak wiec
Katharsisarkanoid_07.py ---> www.ppcg.eu.org/wyklad/arkanoid_07.tar.bz2
Katharsisna pierwszy rzut, oka nic nowego, ale pozwolcie pilce spasc na dolna granice ekranu...
Katharsismamy fajny koniec gry :)
Katharsisteraz zajmiemy sie pisaniem konca gry
20:31Katharsisprzez pierwsze szesc skryptow wszystkie operacje wykonywane byly na wiecznej petli:
Katharsiswhile 1:
Katharsiszakonoczylismy wiecznosc petli :) podajac warunek:
Katharsiswhile pilkarect.bottom <= height:
Katharsisczyli...
20:32Katharsisdzialanie skryptu zakonczy sie (zakonczenie dzialania petli), jak dolny rect pilki znajdzie sie nizej nic ekran, skrypt konczy sie fajnym GAMEOVEREM, thx for Tanlin ;)
Katharsistak wiec, jak go zaimplementowac?
Katharsisten GameOver ofc.
Katharsispiszemy koniec gry:
Katharsiskoniec_gry = pygame.image.load("gameover.gif")
Katharsiskoniec_gryrect = koniec_gry.get_rect()
Katharsisokno.blit(koniec_gry, koniec_gryrect)
Katharsispygame.display.flip()
Katharsiswhile 1:
Katharsisfor event in pygame.event.get():
Katharsisif event.type == pygame.KEYDOWN:
Katharsissys.exit()
Katharsisnic nowego. wczytujemy nowy obrazek gameover.gif, pobieramy jego rect i umieszczamy go na ekranie
20:33Katharsispo zakonczeniu petli glownej, przechodzimy do petli drugiej (odpowiedzialnej za koniec gry), w ktorej jesli zostanie wcisniety jakis klawisz, skrypt zakonczy dzialanie sys.exit()
20:34Katharsisotworzcie i edytujcie arkanoid_08.py --> www.ppcg.eu.org/wyklad/arkanoid_08.tar.bz2
Katharsistak na prawde nie wiele rzeczy sie pojawilo, glownie da sie zauwazyc nowe/y obiekt/y, deske/ki :)
Katharsisna poczatku importujemy nowy modul random, ktory przyda sie pozniej :)
Katharsisimport sys, pygame, random
Katharsislista_desek = [(40,11),(40,61),(40,111),(40,161),(40,211),(40,261),(40,311),(40,361)]
Katharsislista_desek += [(191,11),(191,51),(191,101),(191,151),(191,201),(191,251),(191,301),(191,351)]
Katharsislista_desek += [(341,11),(341,51),(341,101),(341,151),(341,201),(341,251),(341,301),(341,351)]
Katharsislista_desek += [(491,11),(491,51),(491,101),(491,151),(491,201),(491,251),(491,301),(491,351)]
Katharsislista_desek += [(641,11),(641,51),(641,101),(641,151),(641,201),(641,251),(641,301),(641,351)]
Katharsislista = []
Katharsisulala co to jest :)
20:35Katharsistworzymy sobie liste lista_desek, w ktorej zawarte sa krotki z rectami (polozeniem) poszczegolnych desek ;]
Katharsisnastepnie, w petli for musimy przeczytac te nasze deski i je umiescic na ekranie, przesuwajac je wzgledem podanych rectow^
Katharsisfor i in lista_desek:
Katharsisdeska = pygame.image.load("deska.gif")
Katharsisdeska1 = deska.get_rect()
Katharsisx1 = i[0]
Katharsisy1 = i[1]
Katharsisdeska1 = deska1.move(x1,y1)
Katharsislista.insert(-1, (deska,deska1))
20:36Katharsisco robimy...
Katharsiswczytujemy nowy orazek deska.gif, pobieramy jego rect
Katharsisoraz umiejscawiamy go (funkcja move()) w liscie - lista - wzgledem dwoch parametrow x1 i y1
Katharsisw efekcie koncowym uzyskujemy liste obiektow wszystkich deseczOF ;]
20:37Katharsispostac wyglada mniej wiecej tak [(rysunek, jego rect), (rysunek, jego rect), (rysunek, jego rect)]
Katharsiskolejna sprawa, aby kolizja pileczki z deska doprowadzila do usuniecia deski z pola, musimy dopisac kolejny warunek do petli while
Katharsiswhile pilkarect.bottom <= height and len(lista_desek) > 0:
20:38Katharsisi teraz sprawdzamy kolizje pilki z deska
Katharsisfor i in lista:
Katharsisif pilkarect.collidelistall([i[1]]):
Katharsislista.remove(i)
Katharsispredkosc[1] = -predkosc[1]
Katharsisif random.randint(0, 1):
Katharsispredkosc[0] = -predkosc[0]
20:39Katharsisco widzimy, jezeli dojdzie do kolizji (collidelistall()), deska zostanie usunieta z listy (remove()), oraz pilka zostanie odbita losowo dzieki funkcji random.randint, tak jest fajniej :)
Katharsisno i blitujemy cala liste (obiekty ktore jeszcze pozostaly do zbicia)
Katharsisfor i in lista:
Katharsisokno.blit(i[0],i[1])
Katharsisaha i jeszcze zmiana predkosci na 1,1
20:40Katharsisw sumie to jest zbedne, po prostu przy 2,2 pilka za szybko skacze dla mnie :P
Katharsismozna wzgledem kolejnych leveli zwiekszac predkosc i liste desek np.. ale to juz chyba zalezy od inwencji tworcy :)
Katharsisno i to by bylo (chyba) na tyle :)
Katharsisja ze swojej strony dziekuje, sa pytania odnosnie tych skryptow?
20:41Katharsiszdejmij pan m
adek05nie znam pythona, tylko C++ i wszystko czaje
adek05dobra robota
Katharsismozna jeszcze napisac MENU
Katharsisale mi sie nie chcialo :P
20:42adek05teraz to juz kwestia pomyslu
Katharsisgdyby ktos z Was potrzebowal skompilowac gre do postaci wykonalnej *.exe
adek05algorytm ciekawy
Loganta ?
Katharsisto na ppcg.eu.org jest artykul, ktory 'mowi' jak to zrobic
m4c13xo ktorej beda logi na wyklady.net? (bez partow/joinow etc)
MiSHulog z calosci:
Katharsisw tedy nie jest wymagany interpreter Pythona na maszynie
darkjamesKatharsis, a jak z wydajnoscia? ile fpsow?
MiSHuwww.mishu.pl/python.txt
Katharsisto zalezy
Katharsisosobiscie wszystko robie na gifach
20:43Katharsisuzywajac bmp ilosc fps spada
Katharsisale jest pewna opcja
Katharsisfunkcja convert()
Katharsisktora konwertuje obrazki do takiej postaci
Katharsisby uzyskac jak najwydajnieszy efekt
Katharsisa to odbija sie na FPSach
20:44adek05a nie ma to duzego wplywu na szybkosv
Katharsisilosci przyznam nie mierzylem
Katharsisw tym wypadku nie
adek05czyli im wiecej grafik tym bardziej to bedzie widac?
Katharsiswidac spadek fpsow? o tym mowisz ?
20:45adek05mhm
adek05to logiczne :D
Katharsisim wiecej grafiki bmp bez funkcj convert(), wg mnie tak
adek05aha ok
Katharsisdlatego polcem stosowac cos takiego jak gif :)
adek05nie mam wiecej pytan
Katharsisaha i jeszcze jedno
Katharsistak sobie przypomnialem
Katharsisw finalnej versji
Katharsisjak zauwazyliscie sa dzwieki
20:46Logannom xD
Katharsisdef dzewiek(x):
Katharsisif not pygame.mixer.music.get_busy():
Katharsispygame.mixer.music.load(x)
Katharsispygame.mixer.music.play()
Katharsista funkcja importuje z pygame mixer.music()
Katharsistaka funkcja odpowiedzialna za odtwarzanie wav
dragonCzesc
20:47adek05if not pygame.mixer.music.get_busy():
Katharsisnastepnie wywolujac ja przy kolizji pileczki i paletki albo i deseczki otrzymujemy dzwiek
Katharsis<code
Katharsisdzewiek("stuk.wav")
Katharsisoraz dzewiek("puk.wav")
Katharsisdzwiek :P
Katharsislol
Katharsisale klaps ;]
20:48adek05;D
Katharsisskoro nie ma pytan