Páginas

domingo, 3 de março de 2013

skribu-kun-python-cxap19

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
En la lastaj du ĉapitroj, ni lernis kiel fari GUI programoj kiuj havas grafiko kaj povas akcepti enigon el la klavaro kaj muso. Ni ankaŭ lernis kiel desegni formojn en malsamaj koloroj en la ekrano. En ĉi tiu ĉapitro, ni lernos kiel montri bildojn kaj bildoj (nomita sprites) kaj ludi sonoj kaj muziko en nia ludojn.
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.
Ĉi tio estas ekzemplo de sprites uzata en kompleta sceno.

Figuro 19-2: Ekzemplo de kompletaj scenejo, kun sprites desegnita sur supro de fono.
La sprite bildoj estas desegnitaj sur la fono. Rimarku ke ni povas klaki la sprite bildo horizontale por ke la spiritoj alfrontas la alia vojo. Ni povas desegni la sama sprite bildo multnombraj fojoj en la sama fenestro. Ni povas ankaŭ regrandigi la spiritoj por esti pli grandaj aŭ pli malgrandaj ol la originala sprite bildo. La fono bildo povas ankaŭ esti konsiderata unu granda sprite.
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

  1. importado pygame, sys, tempo, hazarda
  2. el pygame.locals importado *

  3. # Starigis pygame
  4. pygame.init ()
  5. mainClock = pygame.time.Clock ()

  6. # Starigis la fenestro
  7. WINDOWWIDTH = 400
  8. WINDOWHEIGHT = 400
  9. windowSurface = pygame.display.set_mode ((WINDOWWIDTH, WINDOWHEIGHT), 0, 32)
  10. pygame.display.set_caption ('Sprites kaj Sound')

  11. # Starigis la koloroj
  12. NIGRA = (0, 0, 0)

  13. # Starigis la bloko datumstrukturo
  14. ludanto = pygame.Rect (300, 100, 40, 40)
  15. playerImage = pygame.image.load ('player.png')
  16. playerStretchedImage = pygame.transform.scale (playerImage, (40, 40))
  17. foodImage = pygame.image.load ('cherry.png')
  18. nutraĵoj = []
  19. por i en gamo (20):
  20. foods.append (pygame.Rect (random.randint (0, WINDOWWIDTH - 20), random.randint (0, WINDOWHEIGHT - 20), 20, 20))

  21. foodCounter = 0
  22. NEWFOOD = 40

  23. # Starigis klavaro variabloj
  24. moveLeft = False
  25. moveRight = False
  26. moveUp = False
  27. moveDown = False

  28. MOVESPEED = 6

  29. # Starigis muziko
  30. pickUpSound = pygame.mixer.Sound ('pickup.wav')
  31. pygame.mixer.music.load ('background.mid')
  32. pygame.mixer.music.play (-1, 0.0)
  33. musicPlaying = True

  34. # Ruli la ludon buklo
  35. dum Vera:
  36. # Kontroli por la quit okazaĵo
  37. por evento en pygame.event.get ():
  38. se event.type == QUIT:
  39. pygame.quit ()
  40. sys.exit ()
  41. se event.type == KEYDOWN:
  42. # Ŝanĝi la klavaron variabloj
  43. se event.key == K_LEFT aŭ event.key == Ord ('a'):
  44. moveRight = False
  45. moveLeft = True
  46. se event.key == K_RIGHT aŭ event.key == Ord ('d'):
  47. moveLeft = False
  48. moveRight = True
  49. se event.key == K_UP aŭ event.key == Ord ('w'):
  50. moveDown = False
  51. moveUp = True
  52. se event.key == K_DOWN aŭ event.key == Ord ('s'):
  53. moveUp = False
  54. moveDown = True
  55. se event.type == KEYUP:
  56. se event.key == K_ESCAPE:
  57. pygame.quit ()
  58. sys.exit ()
  59. se event.key == K_LEFT aŭ event.key == Ord ('a'):
  60. moveLeft = False
  61. se event.key == K_RIGHT aŭ event.key == Ord ('d'):
  62. moveRight = False
  63. se event.key == K_UP aŭ event.key == Ord ('w'):
  64. moveUp = False
  65. se event.key == K_DOWN aŭ event.key == Ord ('s'):
  66. moveDown = False
  67. se event.key == Ord ('x'):
  68. player.top = random.randint (0, WINDOWHEIGHT - player.height)
  69. player.left = random.randint (0, WINDOWWIDTH - player.width)
  70. se event.key == Ord ('m'):
  71. se musicPlaying:
  72. pygame.mixer.music.stop ()
  73. alie:
  74. pygame.mixer.music.play (-1, 0.0)
  75. musicPlaying = ne musicPlaying

  76. se event.type == MOUSEBUTTONUP:
  77. foods.append (pygame.Rect (event.pos [0] - 10, event.pos [1] - 10, 20, 20))

  78. foodCounter + = 1
  79. se foodCounter> = NEWFOOD:
  80. # Aldoni novajn manĝo
  81. foodCounter = 0
  82. foods.append (pygame.Rect (random.randint (0, WINDOWWIDTH - 20), random.randint (0, WINDOWHEIGHT - 20), 20, 20))

  83. # Desegni la nigra fono sur la surfaco
  84. windowSurface.fill (BLACK)

  85. # Movi la ludanto
  86. se moveDown kaj player.bottom <WINDOWHEIGHT:
  87. player.top + = MOVESPEED
  88. se moveUp kaj player.top> 0:
  89. player.top - = MOVESPEED
  90. se moveLeft kaj player.left> 0:
  91. player.left - = MOVESPEED
  92. se moveRight kaj player.right <WINDOWWIDTH:
  93. player.right + = MOVESPEED


  94. # Desegni la bloko sur la surfaco
  95. windowSurface.blit (playerStretchedImage, ludanto)

  96. # Kontrolu se la bloko intersecan kun ajna manĝo kvadratoj.
  97. por manĝo en nutraĵoj [:]:
  98. se player.colliderect (manĝaĵo):
  99. foods.remove (manĝo)
  100. ludanto = pygame.Rect (player.left, player.top, player.width + 2, player.height + 2)
  101. playerStretchedImage = pygame.transform.scale (playerImage, (player.width, player.height))
  102. se musicPlaying:
  103. pickUpSound.play ()

  104. # Desegni la manĝo
  105. por manĝo en nutraĵoj:
  106. windowSurface.blit (foodImage, nutraĵo)

  107. # Desegni la fenestro sur la ekrano
  108. pygame.display.update ()
  109. 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.
  1. pygame.display.set_caption ('Sprites kaj Sound')
Unue, ni starigis la apudskribo de la titolo trinkejo al ĉeno kiu priskribas tiun programon linion 12. Pasigi la ĉeno 'Sprites kaj Sound' al la pygame.display.set_caption () funkcio.
  1. # Starigis la bloko datumstrukturo
  2. ludanto = pygame.Rect (300, 100, 40, 40)
  3. playerImage = pygame.image.load ('player.png')
  4. playerStretchedImage = pygame.transform.scale (playerImage, (40, 40))
  5. foodImage = pygame.image.load ('cherry.png')
Ni tuj uzos tri malsamaj variabloj por reprezenti la ludanto, kontraste kun la antaŭaj programoj kiuj nur uzas unu. La ludanto variablo estos stoki Rect objekto kiu tenas spuro de kie kaj kiel granda la ludanto estas. La ludanto variablo ne enhavas la ludanto bildo, nur la ludanto grandeco kaj situo. Komence de la programo, la supera maldekstra angulo de la ludanto estos lokita ĉe (300, 100) kaj la ludanto havos alteco kaj larĝeco de 40 rastrumeroj komenci.
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

  1. # Starigis muziko
  2. pickUpSound = pygame.mixer.Sound ('pickup.wav')
  3. pygame.mixer.music.load ('background.mid')
  4. pygame.mixer.music.play (-1, 0.0)
  5. musicPlaying = True
Ni tuj devas ŝarĝi la sondosieroj. Estas du moduloj por sono en Pygame. La pygame.mixer modulo estas respondeca por ludi mallonga sono efektojn dum la ludo. La pygame.mixer.music modulo estas uzata por ludi la fono muziko.
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

  1. se event.key == Ord ('m'):
  2. se musicPlaying:
  3. pygame.mixer.music.stop ()
  4. alie:
  5. pygame.mixer.music.play (-1, 0.0)
  6. musicPlaying = ne musicPlaying
Ni kontrolu se la uzanto premis la M ŝlosilo. La M ŝlosilo igos la fono muziko sur aŭ for. Se musicPlaying estas agordita por Vera, tiam kiu signifas la fono muziko nuntempe ludante kaj ni devus haltigi la muzikon per la alvoko pygame.mixer.music.stop (). Se musicPlaying estas agordita por Falsa, tiam kiu signifas la fono muziko nuntempe ne ludas kaj devus esti komencita de nomante pygame.mixer.music.play (). La parametroj ni pasas al la pygame.mixer.music.play () funkcio estas samaj kiel ni pasis sur linio 40.
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

  1. # Desegni la bloko sur la surfaco
  2. windowSurface.blit (playerStretchedImage, ludanto)
Memoru ke la valoro stokita en playerStretchedImage estas Surfaca objekto. "Blitting" estas la procezo de desegni la enhavon de unu Surfaca objekto al alia Surfaca objekto. En ĉi tiu kazo, ni volas tiri la sprite de la ludanto sur la fenestro la Surfaca objekto (kiu estas stokitaj en windowSurface). (Ankaŭ memoru ke la surfaco uzata por vidigi sur la ekrano estas la Surfaca celo kiu revenis por pygame.display.set_caption ().)
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

  1. se player.colliderect (manĝaĵo):
  2. foods.remove (manĝo)
  3. ludanto = pygame.Rect (player.left, player.top, player.width + 2, player.height + 2)
  4. playerStretchedImage = pygame.transform.scale (playerImage, (player.width, player.height))
  5. se musicPlaying:
  6. pickUpSound.play ()
Tiu kodo estas simila al la kodon en la antaŭaj programoj. Sed ĉi tie ni estas aldonante paron da novaj linioj. Ni volas nomi la teatraĵo () metodon por Sono objekto stokitaj en la pickUpSound variablo. Sed ni nur volas fari ĉi tion se musicPlaying estas agordita por Vera (kiu diras al ni ke la sono ŝaltis).
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

  1. # Desegni la manĝo
  2. por manĝo en nutraĵoj:
  3. windowSurface.blit (foodImage, nutraĵo)
En nia antaŭaj programoj, ni nomas la pygame.draw.rect () funkcion por desegni verda kvadrato por ĉiu Rect objekto stokitaj en la nutraĵoj listo. Tamen, en tiu programo, ni volas tiri la ĉerizo sprites anstataŭe. Ni vokos la blit () metodo kaj pasigi la Surfaca objekto stokitaj en foodImage. (Ĉi tiu estas la surfaco kiu havas la bildon de ĉerizoj desegnita sur ĝi.)
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