fonto: http://inventwithpython.com/chapter19.html
Temoj Kovrite En tiu ĉapitro:
- Bildo kaj Sono Dosieroj
- Desegno Sprites
- La pygame.image.load () Funkcio
- La pygame.mixer.Sound Datumtipo
- La pygame.mixer.music Modulo
Al sprite estas nomo por unu du-dimensia bildo kiu estas uzata kiel parto de la grafiko en la ekrano. Jen kelkaj ekzemple sprites:
Figuro 19-1: Iuj ekzemploj de sprites.
Figuro 19-2: Ekzemplo de kompletaj scenejo, kun sprites desegnita sur supro de fono.
La sekva programo ni faras pruvos kiel ludi sonojn kaj desegni sprites uzante Pygame.
Bildo kaj Sono Dosieroj
Sprites estas stokitaj en bildo dosierojn en via komputilo. Estas pluraj malsamaj bildo formatojn ke Pygame povas uzi. Vi povas diri kion formato bildo dosiero uzas per rigardado al la fino de la dosiero nomo (post la lasta periodo). Tiu nomiĝas la sufikso. Ekzemple, la dosiero happy.png estas en la PNG formato. La bildo formatojn Pygame elportas inkluzivas BMP, PNG, JPG (kaj JPEG), kaj GIF.Vi povas elŝuti bildoj de via retumilo. Sur plej foliumiloj, vi nur devas dekstre-klaku sur la bildo en la retpaĝo kaj elektu Gardi de la menuo kiu aperas. Memoru kie sur la malmola disko vi savis la bildo dosiero. Vi povas ankaŭ krei vian propran bildoj kun desegnante programon kiel MS Paint aŭ Tux Paint.
La sondosiero formatojn ke Pygame apogoj estas MID, WAV, kaj MP3. Vi povas elŝuti sono efektoj de la interreto nur kiel bildo dosierojn, tiel longe kiel la sono efektoj estas en unu el tiuj tri formatoj. Se vi havas mikrofonon, vi ankaŭ povas registri sonojn kun via komputilo mem kaj uzi ilin en viaj ludoj.
Sprites kaj Sonoj Programo
Tiu programo estas la sama kiel la klavaro kaj muso Eniro programo de la lasta ĉapitro. Tamen, en tiu programo, ni uzos sprites anstataŭ ebenaĵo rigardante kvadratoj. Ni uzos sprite de vireto anstataŭ la blanka ludanto kvadrataj, kaj sprite de ĉerizoj anstataŭ la verda manĝaĵo kvadratoj. Ni ankaŭ ludas fono muziko kaj sono efekton kiam la ludanto sprite manĝas unu el la ĉerizo sprites.La Sprites kaj Sonoj Programo de Fonta Kodo
Se vi scias kiel uzi grafikaj programaron kiel Photoshop aŭ MS Paint, vi povas desegni vian propran bildoj kaj uzu la bildo dosierojn en via partioj. Se vi ne scias kiel uzi tiujn programojn, vi povas simple elŝuti grafiko de retejoj kaj uzi tiujn bildo dosieroj anstataŭe. La sama validas por la muziko kaj sondosieroj. Vi ankaŭ povas trovi bildojn sur TTT-ejoj aŭ bildoj el cifereca fotilo. Vi povas elŝuti la bildon kaj sondosieroj el tiu libro de afiŝinto ĉe http://inventwithpython.com/resources/ . Vi povas elŝuti la fontkodon en ĉi tiu ĉapitro de la URL http://inventwithpython.com/chapter19 .
spritesAndSounds.py
Tiu kodo estas elŝutebla el http://inventwithpython.com/spritesAndSounds.py
Se vi ricevas erarojn post tajpi tiun kodon en, kompari ĝin al la libro kodo kun la linio malsamoj ilo en http://inventwithpython.com/diff aŭ retpoŝtu la aŭtoro en al@inventwithpython.com
Tiu kodo estas elŝutebla el http://inventwithpython.com/spritesAndSounds.py
Se vi ricevas erarojn post tajpi tiun kodon en, kompari ĝin al la libro kodo kun la linio malsamoj ilo en http://inventwithpython.com/diff aŭ retpoŝtu la aŭtoro en al@inventwithpython.com
- importado pygame, sys, tempo, hazarda
- el pygame.locals importado *
- # Starigis pygame
- pygame.init ()
- mainClock = pygame.time.Clock ()
- # Starigis la fenestro
- WINDOWWIDTH = 400
- WINDOWHEIGHT = 400
- windowSurface = pygame.display.set_mode ((WINDOWWIDTH, WINDOWHEIGHT), 0, 32)
- pygame.display.set_caption ('Sprites kaj Sound')
- # Starigis la koloroj
- NIGRA = (0, 0, 0)
- # Starigis la bloko datumstrukturo
- ludanto = pygame.Rect (300, 100, 40, 40)
- playerImage = pygame.image.load ('player.png')
- playerStretchedImage = pygame.transform.scale (playerImage, (40, 40))
- foodImage = pygame.image.load ('cherry.png')
- nutraĵoj = []
- por i en gamo (20):
- foods.append (pygame.Rect (random.randint (0, WINDOWWIDTH - 20), random.randint (0, WINDOWHEIGHT - 20), 20, 20))
- foodCounter = 0
- NEWFOOD = 40
- # Starigis klavaro variabloj
- moveLeft = False
- moveRight = False
- moveUp = False
- moveDown = False
- MOVESPEED = 6
- # Starigis muziko
- pickUpSound = pygame.mixer.Sound ('pickup.wav')
- pygame.mixer.music.load ('background.mid')
- pygame.mixer.music.play (-1, 0.0)
- musicPlaying = True
- # Ruli la ludon buklo
- dum Vera:
- # Kontroli por la quit okazaĵo
- por evento en pygame.event.get ():
- se event.type == QUIT:
- pygame.quit ()
- sys.exit ()
- se event.type == KEYDOWN:
- # Ŝanĝi la klavaron variabloj
- se event.key == K_LEFT aŭ event.key == Ord ('a'):
- moveRight = False
- moveLeft = True
- se event.key == K_RIGHT aŭ event.key == Ord ('d'):
- moveLeft = False
- moveRight = True
- se event.key == K_UP aŭ event.key == Ord ('w'):
- moveDown = False
- moveUp = True
- se event.key == K_DOWN aŭ event.key == Ord ('s'):
- moveUp = False
- moveDown = True
- se event.type == KEYUP:
- se event.key == K_ESCAPE:
- pygame.quit ()
- sys.exit ()
- se event.key == K_LEFT aŭ event.key == Ord ('a'):
- moveLeft = False
- se event.key == K_RIGHT aŭ event.key == Ord ('d'):
- moveRight = False
- se event.key == K_UP aŭ event.key == Ord ('w'):
- moveUp = False
- se event.key == K_DOWN aŭ event.key == Ord ('s'):
- moveDown = False
- se event.key == Ord ('x'):
- player.top = random.randint (0, WINDOWHEIGHT - player.height)
- player.left = random.randint (0, WINDOWWIDTH - player.width)
- se event.key == Ord ('m'):
- se musicPlaying:
- pygame.mixer.music.stop ()
- alie:
- pygame.mixer.music.play (-1, 0.0)
- musicPlaying = ne musicPlaying
- se event.type == MOUSEBUTTONUP:
- foods.append (pygame.Rect (event.pos [0] - 10, event.pos [1] - 10, 20, 20))
- foodCounter + = 1
- se foodCounter> = NEWFOOD:
- # Aldoni novajn manĝo
- foodCounter = 0
- foods.append (pygame.Rect (random.randint (0, WINDOWWIDTH - 20), random.randint (0, WINDOWHEIGHT - 20), 20, 20))
- # Desegni la nigra fono sur la surfaco
- windowSurface.fill (BLACK)
- # Movi la ludanto
- se moveDown kaj player.bottom <WINDOWHEIGHT:
- player.top + = MOVESPEED
- se moveUp kaj player.top> 0:
- player.top - = MOVESPEED
- se moveLeft kaj player.left> 0:
- player.left - = MOVESPEED
- se moveRight kaj player.right <WINDOWWIDTH:
- player.right + = MOVESPEED
- # Desegni la bloko sur la surfaco
- windowSurface.blit (playerStretchedImage, ludanto)
- # Kontrolu se la bloko intersecan kun ajna manĝo kvadratoj.
- por manĝo en nutraĵoj [:]:
- se player.colliderect (manĝaĵo):
- foods.remove (manĝo)
- ludanto = pygame.Rect (player.left, player.top, player.width + 2, player.height + 2)
- playerStretchedImage = pygame.transform.scale (playerImage, (player.width, player.height))
- se musicPlaying:
- pickUpSound.play ()
- # Desegni la manĝo
- por manĝo en nutraĵoj:
- windowSurface.blit (foodImage, nutraĵo)
- # Desegni la fenestro sur la ekrano
- pygame.display.update ()
- mainClock.tick (40)
Figuro 19-3: La Sprites kaj Sonoj ludo.
Lancxi vian La Fenestro kaj la datumoj Strukturo
La plejparto de la kodo en tiu programo estis klarigita en la antaŭa ĉapitro, tiel ni nur koncentriĝas pri la partoj kiuj aldonas sprites kaj sono.- pygame.display.set_caption ('Sprites kaj Sound')
- # Starigis la bloko datumstrukturo
- ludanto = pygame.Rect (300, 100, 40, 40)
- playerImage = pygame.image.load ('player.png')
- playerStretchedImage = pygame.transform.scale (playerImage, (40, 40))
- foodImage = pygame.image.load ('cherry.png')
La dua variablo kiu reprezentas la ludanto estos playerImage. La pygame.image.load () funkcio estas pasita ĉenon de la dosiernomo de la bildo por ŝarĝi. La reveno valoro de pygame.image.load () estas Surfaca objekto kiu havas la bildon en la bildo dosieron desegnita sur lia surfaco. Ni stokas tiun Surfaca objekto ene de playerImage.
La pygame.transform.scale () Funkcio
On line 20, ni uzos nova funkcio en la pygame.transform modulo. La pygame.transform.scale () funkcio povas malpliigi aŭ pligrandigi oni sprite. La unua argumento estas pygame.Surface objekto kun la bildo desegnita sur ĝi. La dua argumento estas opo por la nova largxeco kaj alteco de la bildo en la unua argumento. La pygame.transform.scale () funkcio redonas pygame.Surface objekto kun la bildo desegnita en nova grandeco. Ni stokas la originala bildo en la playerImage variablo sed la tirita bildo en la playerStretchedImage variablo.On line 21, ni nomas pygame.image.load () denove krei Surfaca objekto kun la ĉerizo bildo desegnita sur ĝi.
Estu certa, ke vi havas la player.png kaj cherry.png dosiero en la sama dosierujo kiel la spritesAndSounds.py dosiero, alie Pygame ne povos trovi ilin kaj donos eraron.
La Surfaca celoj kiuj estas konservataj en playerImage kaj foodImage estas la sama kiel la Surfaca objekto ni uzas por la fenestro. En nia ludo, ni blit tiuj surfacoj sur la fenestro la surfaco por krei la fenestro, ke la uzanto vidas. Tiu estas ĝuste la sama kiel la kiam ni akiris Surfaca objekto revenis de la render () metodon por Font objektoj en nia Saluton Mondo programo. Por reale montras la tekston, ni devis blit ĉi Surfaca objekto (kiu la teksto estis desegnita sur) al la fenestro la Surfaca objekto. (Kaj poste, kompreneble, nomita la ĝisdatigo () metodon sur la fenestro la Surfaca objekto.)
Lancxi vian the Music kaj Sonoj
- # Starigis muziko
- pickUpSound = pygame.mixer.Sound ('pickup.wav')
- pygame.mixer.music.load ('background.mid')
- pygame.mixer.music.play (-1, 0.0)
- musicPlaying = True
Ni vokos la pygame.mixer.Sound () konstruilo funkcio por krei pygame.mixer.Sound objekto (kiu ni simple nomas Sono objekto). Tiu objekto havas ludon () metodo kiu vokita ludos la sono efekton.
On line 39 ni nomas pygame.mixer.music.load () ŝarĝi la fono muziko. Ni komencos ludi la fono muziko tuj por nomi pygame.mixer.music.play (). La unua parametro diras Pygame kiom da fojoj por ludi la fono muziko post la unua fojo ni ludas ĝin. Do pasas 5 kaŭzos Pygame ludi la fono muziko 6 fojoj super. Se vi pasas -1 por la unua parametro, la fono muziko ripetos mem ĉiam.
La dua parametro al pygame.mixer.music.play () diras je kiu punkto en la sondosiero por komenci ludi. Pasante 0.0 ludos la fono muziko ekde la komenco. Se vi pasis 2,5 por la dua parametro, ĉi kaŭzos la fono muziko komenci ludi du kaj duono sekundojn post la komenco de la muziko.
Fine, ni havas simplan Bulea variablo nomata musicPlaying ke rakontos nia programo se ĝi devus ludi la fono muziko kaj sono efektoj aŭ ne. Estas agrable doni la ludanto la eblo ruli la programon sen la sono ludado.
Toggling la Sono Sur kaj Off
- se event.key == Ord ('m'):
- se musicPlaying:
- pygame.mixer.music.stop ()
- alie:
- pygame.mixer.music.play (-1, 0.0)
- musicPlaying = ne musicPlaying
Fine, ne gravas kion ni volas Baskuligi la valoron en musicPlaying. Toggling Bulea valoro signifas ke ni metu gxin al la malo de ĝia aktuala valoro. La linio musicPlaying = ne musicPlaying starigos la variablo por Falsa se ĝi estas aktuale Vera aŭ starigis gxin al Vera se ĝi estas aktuale False. Pensu pri toggling kiel kio okazas kiam vi klaki malpezan ŝaltilo sur aŭ for.
Toggling la valoron en musicPlaying certigos ke la venontan fojon la uzanto premas la M ŝlosilo, ĝi faros la malon de tio, kion ĝi faris antaŭe.
Desegno la Ludanto en la fenestro
- # Desegni la bloko sur la surfaco
- windowSurface.blit (playerStretchedImage, ludanto)
La dua parametro al la blit () metodo estas Rect celo kiu specifas kie la sprite devus blitted. La Rect objekto stokitaj en ludanto estas kio subtenas trako de la pozicio de la ludanto en la fenestron.
Kontrolanta se la ludanto Ĉu karambolis kun Ĉerizoj
- se player.colliderect (manĝaĵo):
- foods.remove (manĝo)
- ludanto = pygame.Rect (player.left, player.top, player.width + 2, player.height + 2)
- playerStretchedImage = pygame.transform.scale (playerImage, (player.width, player.height))
- se musicPlaying:
- pickUpSound.play ()
Kiam la ludanto manĝas unu el la ĉerizoj, tuj pligrandigi la grandeco de la ludanto por du pixeles en alteco kaj larĝeco. On line 116, ni kreu novan Rect objekto por stoki la ludanto variablo kiu havos la saman ampleksoj kiel la malnova Rect objekto stokitaj en ludanto. Krom la largxeco kaj alteco de la nova Rect objekto estos 2 rastrumeroj granda.
Kiam la Rect objekto kiu reprezentas la pozicio kaj grandeco de la ludanto, sed la bildo de la ludanto estas stokitaj en playerStretchedImage kiel Surfaca objekto. Ni volas krei novan tirita bildo por voko pygame.transform.scale (). Nepre pasi la originala Surfaca objekto en playerImage kaj ne playerStretchedImage. Etendinte bildo ofte misformas ĝin iomete. Se ni observas restretching plilongigita bildo super plus la distordoj adicii rapide. Sed per tiri la originala bildo al la nova grandeco, ni nur distordi la bildon unufoje. Jen kial ni pasas playerImage kiel la unua argumento por pygame.transform.scale ().
Eltiru la Ĉerizoj sur la fenestro
- # Desegni la manĝo
- por manĝo en nutraĵoj:
- windowSurface.blit (foodImage, nutraĵo)
Ni uzas nur la nutraĵon variablo (kiu enhavas ĉiu el la Rect objektoj en nutraĵoj en ĉiu ripeto tra la por buklo) sincere blit () metodon kie desegni la foodImage.
Resumo: Ludoj kun Graphics kaj Sonoj
Tiu ludo aldonis eĉ pli plibonigita grafika kaj enkondukis uzante sono en niaj ludoj. La bildoj (nomita sprites) aspektas multe pli bone ol la simpla desegno primitivoj uzitaj en niaj antaŭaj programoj. La ludo prezentita en tiu ĉapitro ankaŭ havas muzikon ludas en la fono dum ludante ankaŭ sono efektoj.Sprites povas grimpi (tio estas, tirita) al pli granda aŭ pli malgranda amplekso. Tiel ni povas montri sprites en ajna grandeco ni volas. Ĉi venos en oportuna en la ludo prezentita en la sekva ĉapitro.
Nun ke ni scias kiel krei GUI fenestro, ekrano sprites kaj desegno primitivoj, kolekti klavaro kaj muso enigo, ludi sonojn, kaj efektivigu kolizio detekto, ni estas nun preta por krei grafikajn ludo en Pygame. La venonta ĉapitro alportas ĉiuj tiuj elementoj kune por nia plej progresintaj ludo ankoraŭ.
Nenhum comentário:
Postar um comentário