Páginas

domingo, 3 de março de 2013

skribu-kun-python-cxap20

fonto: http://inventwithpython.com/chapter20.html

Temoj Kovritaj dum tiu ĉapitro:

  • La pygame.FULLSCREEN flago
  • Pygame Konstanta Variabloj por Klavaro Keys
  • La move_ip() metodo por Rect objektoj
  • La pygame.mouse.set_pos() Funkcio
  • Implementando Cheat Kodoj en Via Ludoj
  • Modifi la Dodger Ludo
La lastaj tri ĉapitroj iris super la Pygame programara biblioteko kaj pruvis kiel uzi liaj multaj trajtoj. (Vi ne bezonas legi tiujn ĉapitrojn antaŭ legi ĉi ĉapitro, kvankam ĝi povas fari ĉi ĉapitro facile kompreni.) En ĉi tiu ĉapitro, ni uzos tiun konon por krei grafikajn ludo kun sono kiu ricevas enigon el la klavaro kaj muso .
La Dodger ludo havas la ludanto kontrolo malgranda viro (kiun ni nomas la ludanto karaktero) kiu devas eviti tutan faskon da baddies kiuj falas de la supro de la ekrano. Ju pli longe la ludanto povas teni sorteando la baddies, la pli alta la partituro ili ricevos.
Nur por amuzo, ni ankaŭ aldonos iujn cheat modoj por la ludo. Se la ludanto havas sube la "x" klavon, ĉiu baddie la rapido estos reduktita al la super malrapida ritmo. Se la ludanto havas sube la "z" ŝlosilo, la baddies estos inversigi ilia direkto kaj vojaĝi laŭ la ekrano anstataŭ suben.

Recenzo de la Baza Pygame Datumaj Tipoj

Ni revizias kelkajn el la bazaj datumtipoj uzata en la Pygame biblioteko:
  • pygame.Rect - Rect objektoj reprezentas rektangulan spacon de situo kaj grandeco. La situo povas esti difinita per la Rect objekto topleft atributo (aŭ la topright, bottomleft, kaj bottomright atributojn). Tiuj angulo atributoj estas opo de entjeroj por la X-kaj Y-koordinatoj. La grandeco povas esti difinita per la larĝeco kaj alteco atributoj, kiuj estas entjeroj de kiom rastrumeroj longaj aŭ altaj la rektangulo areo estas. Rect objektoj havas colliderect() metodon por kontroli se ili sekcas kun alia Rect objekto.
  • pygame.Surface - Surfacaj celoj estas areoj de koloraj bilderoj. Surfacaj objektoj reprezentas rektangulan bildon, dum Rect celas nur reprezentas rektangulan spacon kaj loko. Surfacaj objektoj havas blit() metodo kiu uzas por desegni la bildon sur unu surfaca objekto sur alia surfaca objekto. La Surfaca objekto revenis por la pygame.display.set_mode() funkcio estas speciala ĉar nenio desegnita sur tiu Surfaca objekto estos montrata sur la uzanto ekrano.
  • Memoru ke Surfaca esti aĵoj desegnita sur ilin, sed ni ne povas vidi ĉi tion ĉar ĝi nur ekzistas en la komputilo memoro. Ni povas nur vidi Surfaca objekto kiam "blitted" (tio estas, desegnita) al la ekrano. Tiu estas ĝuste la sama kiel estas kun iu alia peco de datumoj. Se vi pensas pri tio, vi ne povas vidi la ŝnuro kiu estas stokitaj en variablo ĝis la variablo estas presita en la ekrano.
  • pygame.event.Event - La Evento datumtipo en la pygame.event modulo generas Eventon celoj kiam la uzanto havigas klavaro, muso, aŭ alia speco de enigo. La pygame.event.get () funkcio redonas liston de Eventon celoj. Vi povas kontroli kio tipo de okazaĵo la Eventon objekto estas kontrolante lia tipo atributo. QUIT, KEYDOWN, kaj MOUSEBUTTONUP estas ekzemploj de iu okazaĵo tipoj.
  • pygame.font.Font - La pygame.font modulo havas la Font datumtipo kiuj reprezentas la litero uzata por teksto en Pygame. Vi povas krei Font objekto nomante la pygame.font.SysFont () konstruilo funkcio. La argumentoj por pasi estas ĉeno de la tiparo nomon kaj entjero el la tiparo grandeco, tamen estas komuna pasi Neniu por la tiparo nomo por akiri la defaŭlta sistemo tiparon. Ekzemple, la komuna funkcio vokas krei Font objekto estas pygame.font.SysFont (None, 48).
  • pygame.time.Clock - La Horloĝo objekto en la pygame.time modulo estas tre helpema por teni nian ludoj de kuranta tiel rapide kiel eble. (Ĉi tiu estas ofte tro rapida por la ludanto por subteni supren kun la komputilo, kaj faras la ludoj ne amuza.) La Horloĝo objekto havas tick () metodo, kiun ni pasas kiom kadroj sekunde (fps) ni deziras la ludon kuri al. La pli alta la fps, la rapida la ludo kuras. Kutime ni uzas 40 fps. Rimarku ke la pygame.time modulo estas malsama modulo ol la tempo modulo kiu enhavas la dormo () funkcio.
Enskribu la sekvan kodon kaj savos al dosiero nomata dodger.py. Ĉi tiu ludo ankaux postulas iu alia bildo kaj sondosieroj kiujn vi povas elŝuti el la URL http://inventwithpython.com/resources .

Dodger la Fonta Kodo

Vi povas elŝuti tiun kodon de la URL http://inventwithpython.com/chapter20 .
dodger.py
Tiu kodo estas elŝutebla el http://inventwithpython.com/dodger.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, hazarda, sys
  2. el pygame.locals importado *

  3. WINDOWWIDTH = 600
  4. WINDOWHEIGHT = 600
  5. TextColor = (255, 255, 255)
  6. BACKGROUNDCOLOR = (0, 0, 0)
  7. FPS = 40
  8. BADDIEMINSIZE = 10
  9. BADDIEMAXSIZE = 40
  10. BADDIEMINSPEED = 1
  11. BADDIEMAXSPEED = 8
  12. ADDNEWBADDIERATE = 6
  13. PLAYERMOVERATE = 5

  14. def eksigi ():
  15. pygame.quit ()
  16. sys.exit ()

  17. def waitForPlayerToPressKey ():
  18. dum Vera:
  19. por evento en pygame.event.get ():
  20. se event.type == QUIT:
  21. finiĝi ()
  22. se event.type == KEYDOWN:
  23. se event.key == K_ESCAPE: # premante ellasilon fermas
  24. finiĝi ()
  25. reveni

  26. def playerHasHitBaddie (playerRect, baddies):
  27. por b en baddies:
  28. se playerRect.colliderect (b ['rect']):
  29. revenu Vera
  30. revenu Falsaj

  31. def drawText (teksto, tiparo, surfaco, x, y):
  32. textobj = font.render (teksto, 1, TextColor)
  33. textrect = textobj.get_rect ()
  34. textrect.topleft = (x, y)
  35. surface.blit (textobj, textrect)

  36. # Starigis pygame, la fenestro, kaj la muso kursoro
  37. pygame.init ()
  38. mainClock = pygame.time.Clock ()
  39. windowSurface = pygame.display.set_mode ((WINDOWWIDTH, WINDOWHEIGHT))
  40. pygame.display.set_caption ('Dodger')
  41. pygame.mouse.set_visible (Falsa)

  42. # Starigis tiparoj
  43. tiparo = pygame.font.SysFont (None, 48)

  44. # Starigis sonoj
  45. gameOverSound = pygame.mixer.Sound ('gameover.wav')
  46. pygame.mixer.music.load ('background.mid')

  47. # Starigis bildoj
  48. playerImage = pygame.image.load ('player.png')
  49. playerRect = playerImage.get_rect ()
  50. baddieImage = pygame.image.load ('baddie.png')

  51. # Montras la "Starto" ekrano
  52. drawText ('Dodger', tiparo, windowSurface, (WINDOWWIDTH / 3), (WINDOWHEIGHT / 3))
  53. drawText ('Klaku ŝlosila por komenci.', tiparo, windowSurface, (WINDOWWIDTH / 3) - 30, (WINDOWHEIGHT / 3) + 50)
  54. pygame.display.update ()
  55. waitForPlayerToPressKey ()


  56. topScore = 0
  57. dum Vera:
  58. # Starigis la komenco de la ludo
  59. baddies = []
  60. partituron = 0
  61. playerRect.topleft = (WINDOWWIDTH / 2, WINDOWHEIGHT - 50)
  62. moveLeft = moveRight = moveUp = moveDown = False
  63. reverseCheat = slowCheat = False
  64. baddieAddCounter = 0
  65. pygame.mixer.music.play (-1, 0.0)

  66. dum Vera: # la ludo buklo kuras dum la ludo parto ludas
  67. partituron + = 1 # kresko partituro

  68. por evento en pygame.event.get ():
  69. se event.type == QUIT:
  70. finiĝi ()

  71. se event.type == KEYDOWN:
  72. se event.key == Ord ('z'):
  73. reverseCheat = True
  74. se event.key == Ord ('x'):
  75. slowCheat = True
  76. se event.key == K_LEFT aŭ event.key == Ord ('a'):
  77. moveRight = False
  78. moveLeft = True
  79. se event.key == K_RIGHT aŭ event.key == Ord ('d'):
  80. moveLeft = False
  81. moveRight = True
  82. se event.key == K_UP aŭ event.key == Ord ('w'):
  83. moveDown = False
  84. moveUp = True
  85. se event.key == K_DOWN aŭ event.key == Ord ('s'):
  86. moveUp = False
  87. moveDown = True

  88. se event.type == KEYUP:
  89. se event.key == Ord ('z'):
  90. reverseCheat = False
  91. partituron = 0
  92. se event.key == Ord ('x'):
  93. slowCheat = False
  94. partituron = 0
  95. se event.key == K_ESCAPE:
  96. finiĝi ()

  97. se event.key == K_LEFT aŭ event.key == Ord ('a'):
  98. moveLeft = False
  99. se event.key == K_RIGHT aŭ event.key == Ord ('d'):
  100. moveRight = False
  101. se event.key == K_UP aŭ event.key == Ord ('w'):
  102. moveUp = False
  103. se event.key == K_DOWN aŭ event.key == Ord ('s'):
  104. moveDown = False

  105. se event.type == MOUSEMOTION:
  106. # Se la muso movas, movi la ludanto kie la kursoro estas.
  107. playerRect.move_ip (event.pos [0] - playerRect.centerx, event.pos [1] - playerRect.centery)

  108. # Aldoni novan baddies sur la supro de la ekrano, se necese.
  109. se ne reverseCheat kaj ne slowCheat:
  110. baddieAddCounter + = 1
  111. se baddieAddCounter == ADDNEWBADDIERATE:
  112. baddieAddCounter = 0
  113. baddieSize = random.randint (BADDIEMINSIZE, BADDIEMAXSIZE)
  114. newBaddie = {'rect': pygame.Rect (random.randint (0, WINDOWWIDTH-baddieSize), 0 - baddieSize, baddieSize, baddieSize),
  115. 'Rapido': random.randint (BADDIEMINSPEED, BADDIEMAXSPEED),
  116. 'Surfaco': pygame.transform.scale (baddieImage, (baddieSize, baddieSize)),
  117. }

  118. baddies.append (newBaddie)

  119. # Movu la ludanto ĉirkaŭe.
  120. se moveLeft kaj playerRect.left> 0:
  121. playerRect.move_ip (-1 * PLAYERMOVERATE, 0)
  122. se moveRight kaj playerRect.right <WINDOWWIDTH:
  123. playerRect.move_ip (PLAYERMOVERATE, 0)
  124. se moveUp kaj playerRect.top> 0:
  125. playerRect.move_ip (0, -1 * PLAYERMOVERATE)
  126. se moveDown kaj playerRect.bottom <WINDOWHEIGHT:
  127. playerRect.move_ip (0, PLAYERMOVERATE)

  128. # Movu la muson kursoron por kongrui al la ludanto.
  129. pygame.mouse.set_pos (playerRect.centerx, playerRect.centery)

  130. # Movu la baddies sube.
  131. por b en baddies:
  132. se ne reverseCheat kaj ne slowCheat:
  133. b ['rect']. move_ip (0, b ['rapido'])
  134. elif reverseCheat:
  135. b ['rect']. move_ip (0, -5)
  136. elif slowCheat:
  137. b ['rect']. move_ip (0, 1)

  138. # Delete baddies kiuj falis preter la fundo.
  139. por b en baddies [:]:
  140. se b ['rect']. supro> WINDOWHEIGHT:
  141. baddies.remove (B)

  142. # Eltiru la ludo mondo sur la fenestro.
  143. windowSurface.fill (BACKGROUNDCOLOR)

  144. # Eltiru la partituro kaj supro partituro.
  145. drawText ('Interpunkcio:% ​​s'% (interpunkcio), tiparo, windowSurface, 10, 0)
  146. drawText ('Supraj Score:% s'% (topScore), tiparo, windowSurface, 10, 40)

  147. # Eltiru la ludanto rektangulo
  148. windowSurface.blit (playerImage, playerRect)

  149. # Eltiru ĉiu baddie
  150. por b en baddies:
  151. windowSurface.blit (b ['surfaco'], b ['rect'])

  152. pygame.display.update ()

  153. # Kontroli se iu el la baddies trafis la ludanto.
  154. se playerHasHitBaddie (playerRect, baddies):
  155. se partituro> topScore:
  156. topScore = partituro # starigis novan supro partituro
  157. rompi

  158. mainClock.tick (FPS)

  159. # Haltu la ludo kaj montri la "Game Over" ekrano.
  160. pygame.mixer.music.stop ()
  161. gameOverSound.play ()

  162. drawText ('GAME OVER', tiparo, windowSurface, (WINDOWWIDTH / 3), (WINDOWHEIGHT / 3))
  163. drawText ('Klaku ŝlosilon por ludi denove.', tiparo, windowSurface, (WINDOWWIDTH / 3) - 80, (WINDOWHEIGHT / 3) + 50)
  164. pygame.display.update ()
  165. waitForPlayerToPressKey ()

  166. gameOverSound.stop ()
Kiam vi kuros ĉi programo, la ludo aspektos tiel ĉi:

Figuro 20-1: A ekrankopio de la Dodger ludo en ago.

Importi la Moduloj

  1. importado pygame, hazarda, sys
  2. el pygame.locals importado *
La Dodger ludo importi la sama moduloj kiuj nia antaŭa Pygame ludoj havas: pygame, hazarda, sys, kaj pygame.locals. La pygame.locals modulo enhavas plurajn konstanta variabloj ke la Pygame biblioteko uzas kiel la evento tipoj (QUIT, KEYDOWN, ktp) kaj klavaro klavoj (K_ESCAPE, K_LEFT, ktp). Uzante la de pygame.locals importado * sintakso, ni povas simple tajpi QUIT anstataŭ pygame.locals.QUIT.

Lancxi vian la Konstanta Variabloj

Estas pluraj konstantaj variabloj en ĉi tiu ludo. Ni uzas konstantan variabloj ĉar la variablo nomo estas multe pli priskriba ol nombro. Ekzemple, de la linio windowSurface.fill (BACKGROUNDCOLOR) ni scias ke la argumento estas senditaj estas koloro por la fono. Tamen, la linio windowSurface.fill (BACKGROUNDCOLOR) ne kiel certe kio la argumento aprobotaj rimedoj.
Ni povas ankaŭ facile ŝanĝi kelkajn simplajn aspektoj pri nia ludo sen havi la ŝanĝon parton de la kodo ŝanĝante la valoroj stokitaj en tiuj konstantaj variabloj. Ŝanĝante WINDOWWIDTH on line 4, ni aŭtomate ŝanĝi la kodon ĉie WINDOWWIDTH estas uzita. Se ni uzas la valoron 600 anstataŭe, tiam ni devus ŝanĝi ĉiun okazon de 600 en la kodo. Ĉi tiu estus speciale konfuza ĉar 600 estus ankaŭ esti uzata por la alteco de la fenestro tiel, kaj ni ne volas ŝanĝi tiujn valorojn.
  1. WINDOWWIDTH = 600
  2. WINDOWHEIGHT = 600
  3. TextColor = (255, 255, 255)
  4. BACKGROUNDCOLOR = (0, 0, 0)
Ĉi tie ni starigu la alteco kaj larĝeco de la ĉefa fenestro. Ekde la resto de nia kodo funkcias ekstere de tiuj konstantaj variabloj, ŝanĝante la valoron tie ŝanĝos ĝin ĉie en nia programo.
Anstataŭ stokante koloro opoj en variablo nomata WHITEBLACK, ni uzos konstanta variabloj por la koloro de la teksto kaj fono. Memoru ke la tri entjeroj en la koloro opoj varias de 0 ĝis 255 por montri kie aperos ruĝa, verda, kaj blua.
  1. FPS = 40
Ĝuste tial la komputilo ne ruli la ludon tro rapida por la uzanto por manipuli, ni nomos mainClock.tick () sur ĉiu ripeto de la ludo buklo por prokrasti ĝin. Ni devas pasi entjero al mainClock.tick () por ke la funkcio scias kiom longe paŭzi la programo. Tiu entjero estos la nombro de kadroj sekunde ni volas ke la ludo kuri. Al "kadro" estas la desegno de grafikaĵoj en la ekrano por sola ripeto tra la ludo buklo. Ni starigos konstanta variablo FPS al 40, kaj ĉiam nomas mainClock.tick (FPS). Vi povas ŝanĝi FPS al pli alta valoro havi la ludo kuri pli rapide aŭ pli malaltan valoron por prokrasti la ludo sube.
  1. BADDIEMINSIZE = 10
  2. BADDIEMAXSIZE = 40
  3. BADDIEMINSPEED = 1
  4. BADDIEMAXSPEED = 8
  5. ADDNEWBADDIERATE = 6
Ĉi tie ni metis iujn pli konstanta variabloj kiu priskribas la falanta baddies. La larĝeco kaj alteco de la baddies estos inter BADDIEMINSIZE kaj BADDIEMAXSIZE. La rapideco, je kiu la baddies falos la ekrano estos inter BADDIEMINSPEED kaj BADDIEMAXSPEED rastrumeroj por ripeto tra la ludo buklo. Kaj nova baddie estos aldonitaj al la supro de la fenestro ĉiu ADDNEWBADDIERATE iteraciones tra la ludo buklo.
  1. PLAYERMOVERATE = 5
La PLAYERMOVERATE stokos la nombro de rastrumeroj de la ludanto karaktero movas en la fenestro en ĉiu ripeto tra la ludo buklo (se la karaktero estas movanta). Por pliigi tiun numeron, vi povas pliigi la rapidon la karaktero movojn. Se vi turnos PLAYERMOVERATE al 0, tiam la ludanto karaktero ne povos movi ajn (la ludanto movus 0 rastrumeroj por ripeto). Tiu ne estus tre amuza ludo.

Difinanta Funkcioj

Ni kreos plurajn funkciojn por nia ludo. Metante kodon en funkcioj, ni povas eviti devi tajpi la saman kodon plurfoje en nia programo. Kaj ĉar la kodo estas en unu loko, se ni trovos cimon la kodo nur bezonas riparon en unu loko.
  1. def eksigi ():
  2. pygame.quit ()
  3. sys.exit ()
Ekzistas pluraj lokoj en nia ludo kiu ni volas nuligi la programo. En niaj aliaj programoj, ĉi ĵus postulis sola alvoko al sys.exit (). Sed ĉar Pygame postulas ke ni nomas ambaŭ pygame.quit () kaj sys.exit (), ni metos ilin en funkcio nomita eksigi () kaj simple nomas la funkcio. Ĉi subtenas nin el ripetante la saman kodon denove kaj denove. Kaj memoru, des pli ni tipo, la pli verŝajna ni faros eraron kaj krei cimon en nia programo.
  1. def waitForPlayerToPressKey ():
  2. dum Vera:
  3. por evento en pygame.event.get ():
Ankaŭ estas kelkaj lokoj, kie ni volas ke la ludo paŭzi kaj atendi la ludanto premi klavon. Ni kreos novan funkcion nomita waitForPlayerToPressKey () por fari ĉi tion. Ene de tiu funkcio, ni havas senfina ciklo ke nur rompas kiam KEYDOWNquit okazaĵo estas ricevita. Je la komenco de la ciklo, ni nomas pygame.event.get () kaj redonas liston de Eventon celoj ekiri.
  1. se event.type == QUIT:
  2. finiĝi ()
Se la ludanto fermis la fenestron dum la programo atendas la ludanto premi klavon, Pygame generos quit evento kaj ni devus nuligi la programo. Ni nomos nia eksigi () funkcio ĉi tie, anstataŭ alvoko pygame.quit () kaj sys.exit () samaj.
  1. se event.type == KEYDOWN:
  2. se event.key == K_ESCAPE: # premante ellasilon fermas
  3. finiĝi ()
  4. reveni
Se ni ricevos KEYDOWN evento, tiam ni devus unue kontroli se ĝi estas la Esk ŝlosilo kiu estis premita. Se ni atendas la ludanto premi klavon, kaj la ludanto premas la Esk ŝlosilo, ni volas nuligi la programo. Se tio ne estis la kazo, tiam ekzekuto salti la se-bloko on line 27 kaj iri rekte al la reveno deklaro, kiu eliroj la waitForPlayerToPressKey () funkcio.
Se quit aux KEYDOWN okazaĵo ne generita, tiam ĉi tiu buklo gardos looping ĝis ĝi estas. Tio frostigi la ludo ĝis la ludanto premas klavon aŭ fermas la fenestron.
  1. def playerHasHitBaddie (playerRect, baddies):
  2. por b en baddies:
  3. se playerRect.colliderect (b ['rect']):
  4. revenu Vera
  5. revenu Falsaj
Ni ankaŭ difini funkcio nomata playerHasHitBaddie () kiu revenos True se la ludanto karaktero karambolis kun unu el la baddies. La baddies parametro estas listo de baddie datumstrukturoj. Ĉi tiuj datumoj strukturoj estas nur vortaroj, tiel ĝi estas precize diri ke baddies estas listo de vortaro objektoj. Ĉiu el tiuj vortaroj havas 'rect' klavo, kaj la valoro por tiu ŝlosilo estas Rect objekto kiu reprezentas la baddie la grandeco kaj situo.
playerRect estas ankaŭ Rect objekto. Memoru ke Rect celoj havas metodon nomata colliderect () kiu redonas True se la Rect objekto karambolis kun la Rect celo kiu pasis al la metodo. Alie, colliderect () revenos False.
Ni povas uzi tiun metodon en nia playerHasHitBaddie () funkcio. Unue ni persisti tra ĉiu baddie datumstrukturo en la baddies listo. Se iu el tiuj baddies karambolas kun la ludanto karaktero, tiam playerHasHitBaddie () revenos Vera. Se la kodo sukcesas persisti tra ĉiuj baddies en la baddies listo sen kolizii kun iu ajn el ili, ni revenos False.
  1. def drawText (teksto, tiparo, surfaco, x, y):
  2. textobj = font.render (teksto, 1, TextColor)
  3. textrect = textobj.get_rect ()
  4. textrect.topleft = (x, y)
  5. surface.blit (textobj, textrect)
Desegno teksto sur la fenestro engaĝas multaj malsamaj ŝtupoj. Unue, ni devas krei Surfaca objekto kiu havas la kordoj pruntis en specifa tiparo sur ĝi. La render () metodo faras tion. Poste, ni bezonas scii la grandecon kaj lokon de la Surfaca objekto ni ĵus faris. Ni povas ricevi Rect objekto kun ĉi tiu informo kun la get_rect () metodon por Surfaca celoj.
Ĉi Rect objekto ne havas specialan rilaton al la Surfaca objekto kun la teksto desegnita sur ĝi, aliaj ol la fakto ke ĝi havas kopion de la larĝeco kaj alteco informoj el la Surfaca objekto. Ni povas ŝanĝi la situon de la Rect objekto per opcio nova opo valoro por lia topleft atributo.
Fine, ni blit la Surfaca celo de la pruntitaj teksto sur la Surfaca objekto kiu pasis al nia drawText () funkcio. Montrante teksto en Pygame preni kelkajn pli paŝoj ol simple nomi la impreso () funkcio, sed se ni metas tiun kodon en sola funkcio (drawText ()), tiam ni nur bezonas voki la funkcion anstataŭ tajpi cxiujn kodo ĉiu tempo ni volas montri teksto sur la ekrano.

Inicializar Pygame kaj Lancxi vian La Fenestro

Nun ke la konstanta variabloj kaj funkcioj estas finita, ni povas komenci nomante la Pygame funkcioj kiuj starigos Pygame por uzo en nia kodo. Multaj el tiuj funkcio alvokoj estas starigi la GUI fenestro kaj krei celojn ke ni uzos en la ludo.
  1. # Starigis pygame, la fenestro, kaj la muso kursoro
  2. pygame.init ()
  3. mainClock = pygame.time.Clock ()
  4. windowSurface = pygame.display.set_mode ((WINDOWWIDTH, WINDOWHEIGHT))
  5. pygame.display.set_caption ('Dodger')
  6. pygame.mouse.set_visible (Falsa)
Linio 43 konstituas la Pygame biblioteko. Memoru, la pygame.init () funkcio devas esti nomata antaŭ ol ni povas utiligi gxin Pygame la funkcioj aŭ datumtipoj. Linio 44 kreas pygame.time.Clock () objekto kaj stokas ĝin en la mainClock variablo. Ĉi tiu celo helpos nin konservi la programon el kurante tro rapide.
Linio 45 kreas novan Surfaca objekto kiu estos uzata por la fenestro montras sur la ekrano. Ni specifi la largxeco kaj alteco de ĉi Surfaca objekto (kaj la fenestro) por pasi opo kun la WINDOWWIDTH kaj WINDOWHEIGHT konstanta variabloj. Rimarku, ke ekzistas nur unu argumenton pasis al pygame.display.set_mode (): opo. La argumentoj por pygame.display.set_mode () ne estas du entjeroj sed opo de du entjeroj.
On line 46, apudskribo de la fenestro estas metita al la ĉeno 'Dodger'. Ĉi apudskribo aperos en la titolo trinkejo sur la supro de la fenestro.
En nia ludo, ni ne volas ke la musmontrilo (la musmontrilo estas la sagon kiu movas ĉirkaŭ la ekrano kiam ni movas la muson) por esti videbla. Tio estas ĉar ni volas ke la muso por povi movi la ludanto karaktero ĉirkaŭ la ekrano, kaj la sago kursoro devus eniri la vojon de la gravulo bildo sur la ekrano. Ni pasas Falsa diri Pygame fari la kursoro nevidebla. Se ni volas fari la kursoro videblas denove en iu punkto en la programo, ni povus nomi pygame.mouse.set_visible (Vera).

Fullscreen Mode

La pygame.display.set_mode () funkcio havas duan, nedeviga parametro, ke vi povas pasi al ĝi. La valoro povas pasi por ĉi parametro estas pygame.FULLSCREEN, kiel ĉi modifo al linio 45 en nia Dodger programo:
  1. windowSurface = pygame.display.set_mode ((WINDOWWIDTH, WINDOWHEIGHT), pygame.FULLSCREEN)
Pasante pygame.FULLSCREEN faros la programo portas la tutan spacon de la ekrano. Ĝi ankoraŭ WINDOWWIDTH kaj WINDOWHEIGHT en grandeco por la fenestroj largxeco kaj alteco, sed la bildo estos etendiĝis grandaj por ĝustigi la ekrano. Povas esti malŝparis spaco laŭlonge de la supro kaj malsupro (aŭ la maldekstra kaj dekstra) flankoj de la ekrano, se vi ne agordis la fenestro grandeco en proporcio kun la ekrano la rezolucio.) Por eviti la malŝparis spaco, vi devus agordi la grandecon de la fenestro al 4:3 rilatumo (por ĉiu 4 rastrumeroj de larĝa, havas 3 rastrumeroj por alteco).
Se vi ne uzas la fullscreen mode, tiam vi ne bezonas zorgi pri uzanta 4:3 rilatumo por la larĝeco kaj alteco. Simple uzu kion ajn largxeco kaj alteco laboras plej bona por via ludo.
  1. # Starigis tiparoj
  2. tiparo = pygame.font.SysFont (None, 48)
Ni bezonas krei Font objekto uzi kiam ni krei Surfaca objekto kun la bildo de teksto desegnita sur ĝi. (Ĉi tiu procezo estas nomata "rendering".) Ni volas krei generic tiparon, do ni uzos la defaŭltan tiparon celo kiun la pygame.font.SysFont () konstruilo funkcio redonas. Ni pasas Neniu tiel ke la defaŭlta tiparo estas uzata, kaj ni pasas 48 tiel ke la tiparo havas grandecon de 48 punktoj.
  1. # Starigis sonoj
  2. gameOverSound = pygame.mixer.Sound ('gameover.wav')
  3. pygame.mixer.music.load ('background.mid')
Ni tuj volas krei la Sono objektoj kaj ankaŭ starigis la fono muziko. La fono muziko konstante esti ludante dum la ludo, sed Sono celoj estos nur tiam, kiam ni ludis specife volas ilin. En ĉi tiu kazo, la Sono objekto estos luditaj kiam la ludanto malvenkas la ludon.
Vi povas uzi neniun. Wav aŭ. Meze dosieron por tiu ĉi ludo. Vi povas elŝuti tiujn sondosieroj el tiu libro de afiŝinto ĉe la URL http://inventwithpython.com/resources . Aŭ vi povas uzi vian propran sondosieroj por ĉi tiu ludo, tiel longe, kiel ili havas la dosiernomojn de gameover.wav kaj background.mid. (Aŭ vi povas ŝanĝi la kordoj uzitaj sur linioj 53 kaj 54 por kongrui la dosiernomojn.)
La pygame.mixer.Sound () konstruilo funkcio kreas novan Sono objekto kaj stokas referenco al tiu celo en la gameOverSound variablo. En via propra ludoj, vi povas krei tiom da Sono celoj kiel vi volas, ĉiu kun malsama sondosiero ke ĝi ludas.
La pygame.mixer.music.load () funkcio ŝarĝas sondosiero ludi por la fono muziko. Ĉi tiu funkcio ne kreas neniun celoj, kaj nur unu sono dosiero povas esti ŝarĝitaj samtempe.
  1. # Starigis bildoj
  2. playerImage = pygame.image.load ('player.png')
  3. playerRect = playerImage.get_rect ()
  4. baddieImage = pygame.image.load ('baddie.png')
Ni tuj montru la bildon dosieroj uzitaj por la ludanto karaktero kaj la baddies en la ekrano. La bildo por la karaktero estas stokita en player.png kaj la bildon por la baddies stokas en baddie.png. Ĉiuj baddies rigardi la sama, tiel ni nur bezonas unu bildo dosiero por ili. Vi povas elŝuti tiujn bildojn el la libro de afiŝinto ĉe la URL http://inventwithpython.com/resources .

Montri la Komenco Ekrano

Kiam la ludo unua komencas, ni volas montri la nomon de la ludo en la ekrano. Ni ankaŭ volas instrui la ludanto kiu ili povas komenci la ludon per pelante ajna klavo. Ĉi tiu ekrano aperas tiel ke la ludanto havas tempon por varbi por komenci ludi post kuri la programon. Ankaŭ, antaŭ ĉiu ludo komencas, ni volas nuligi la valoro de la supro partituro reen al 0.
  1. # Montras la "Starto" ekrano
  2. drawText ('Dodger', tiparo, windowSurface, (WINDOWWIDTH / 3), (WINDOWHEIGHT / 3))
  3. drawText ('Klaku ŝlosila por komenci.', tiparo, windowSurface, (WINDOWWIDTH / 3) - 30, (WINDOWHEIGHT / 3) + 50)
  4. pygame.display.update ()
  5. waitForPlayerToPressKey ()
Sur linioj 62 kaj 63, ni nomas nian drawText () funkcio kaj fordoni kvin argumentoj: 1) la linio de la teksto ni volas prezenti, 2) la tiparo kiun ni volas ke la kordoj aperi en, 3) la Surfaca objekto sur kiu por kapitulacigi la teksto, kaj 4) kaj 5) la X kaj Y kunordigi la Surfaca objekto por desegni la teksto en.
Tiu eble ŝajnas kiel multaj argumentoj por pasi por funkcio alvoko, sed pripensu ke tiu funkcio alvoko anstataŭas kvin linioj de kodo ĉiufoje ni nomas ĝin. Ĉi mallongigas nian programon kaj faciligante trovi erarojn ĉar estas malpli kodo por kontroli.
La waitForPlayerToPressKey () funkcio volo paŭzo la ludo por eniri en buklo kiun kontrolas por ajna KEYDOWN okazaĵoj. Iam KEYDOWN okazaĵo estas generita, la ekzekuto rompas el la ciklo kaj la programo daŭre funkcias.

Komenci de la Ĉefa Ludo Kodo

  1. topScore = 0
  2. dum Vera:
Ni finis difinanta la helpanto funkcioj kaj variabloj kiujn ni bezonas por tiu ĉi ludo. Linio 68 estas la komenco de la ĉefa ludo kodo. La valoron en la topScore variablo startas je 0 nur kiam la programo unue kuras. Krom se la ludanto malvenkas kaj havas partituro granda ol la nuna supro partituro, la supro partituro estas anstataŭita per la ludanto partituro.
La senfina ciklo komenciĝis on line 69 estas teknike ne la "ludo loop". (La ĉefa ludo buklo manipulas eventoj kaj tirante la fenestro dum la ludo kuras.) Anstataŭe, tiu dum buklo estos persisti ĉiufoje la ludanto komencas novan ludon. Ni starigos la kodon tiel ke kiam la ludanto malvenkas kaj ni bezonas nuligi la ludo, la programo ekzekuto reiros al la komenco de ĉi tiu ciklo.
  1. # Starigis la komenco de la ludo
  2. baddies = []
  3. partituron = 0
Je la komenco, ni volas establi la baddies listo al malplena listo. La baddies listo estas listo de vortaro objektoj kun la sekva klavoj:
  • 'Rect' - La Rect objekto kiu priskribas kie kaj kio grandeco la baddie estas.
  • 'Rapido' - Kiel rapide la baddie falas la ekrano. Tiu entjero reprezentas rastrumeroj por ripeto tra la ludo buklo.
  • 'Surfaco' - La Surfaca objekto kiu havas la skalo bildon de la baddie bildo desegnita sur ĝi. Ĉi tiu estas la Surfaca objekto kiu estos blitted al la Surfaca objekto revenis por pygame.display.set_mode () kaj desegnita sur la ekrano.
Poste, ni volas nuligi la ludanto partituro al 0.
  1. playerRect.topleft = (WINDOWWIDTH / 2, WINDOWHEIGHT - 50)
La komenca situo de la ludanto estos en la centro de la ekrano kaj 50 rastrumeroj el la fundo. La opo, ke ni starigu la topleft atributo por ŝanĝos la situo de la playerRect objekto. La unua ero en la opo estas la X-koordinato de la maldekstra rando. La dua listero en la opo estas la Y-koordinato de la supro eĝo.
  1. http://twistedmatrix.com/users/jh.twistd/python/moin.cgi/MoinMoinColorizermoveLeft = moveRight = moveUp = moveDown = False
  2. reverseCheat = slowCheat = False
  3. baddieAddCounter = 0
Ankaŭ ĉe la komenco de la ludo, ni volas havi la movado variabloj moveLeft, moveRight, moveUp, kaj moveDown aro al False. La reverseCheat kaj slowCheat variabloj estos metita al Vera nur kiam la ludanto ebligas tiujn cheats by tenas la "z" kaj "x" klavojn, respektive.
La baddieAddCounter variablo estas uzata por nombrilo diri la programo kiam aldoni novan baddie sur la supro de la ekrano. La valoron en baddieAddCounter estos incremented de unu ĉiufoje, kiam la ludo buklo iterates. Kiam la baddieAddCounter vendotablo estas egala al la valoro en ADDNEWBADDIERATE, tiam la baddieAddCounter vendotablo estas retrovu reen al 0 kaj nova baddie aldonas al la supro de la ekrano.
  1. pygame.mixer.music.play (-1, 0.0)
Je la komenco de la ludo, ni volas ke la fono muziko komenci ludi. Ni povas fari ĉi tion kun alvoko al pygame.mixer.music.play (). La unua argumento estas la nombro da fojoj la muziko devas ripeti. -1 Estas speciala valoro kiu rakontas Pygame ni volas ke la muziko ripeti senfine. La dua argumento estas kaleŝego kiu diras kiom da sekundoj en la muziko ni volas komenci ludi. Pasante 0.0 per ni volas ludi la muzikon ekde la komenco de la muziko dosiero. (Pasante 2.0, ekzemple, estus komencis la muziko du sekundoj en la muziko dosiero.)

La Ludo Cirkla

La ludo buklo enhavas la kodon kiu estas ekzekutita dum la ludo estas ludita. La ludo buklo senĉese ĝisdatigas la stato de la ludo mondo por ŝanĝi la pozicion de la ludanto kaj baddies, manipulante eventoj generita per Pygame, kaj tirante la stato de la ludo mondo sur la ekrano. Ĉio ĉi okazas pluraj dekdufoje en dua, kiu faras ĝin ŝajnas ke la ludo okazas en reala tempo al la ludanto.
  1. dum Vera: # la ludo buklo kuras dum la ludo parto ludas
  2. partituron + = 1 # kresko partituro
Linio 79 estas la komenco de la ĉefa ludo buklo. En la ĉefa ludo buklo, ni pliigos la ludanto partituro, manipuli ajna okazaĵoj kiuj generis, aldoni ajnan baddies al la supro de la ekrano, se necesa, movi la baddies malsupren iom, kaj deturnigxu ĉiu sur la ekrano. Ĉi tiu kodo estos ekzekutita denove kaj denove kiel la programo ekzekuto iterates tra la ludo buklo. La ciklo nur eliri kiam la ludanto ĉu perdas la ludon aŭ fermas la programon.
Unue, ni pliigo de la ludanto partituro. Ju pli longe la ludanto povas iri sen perdi, la pli altaj siaj partituro estos.

Okazaĵo Uzado

Estas kvar malsamaj tipoj de eventoj ni manipuli en nia ludo: quit, KEYDOWN, KEYUP, kaj MOUSEMOTION. La QUIT okazaĵo estas generita per Pygame se la ludanto fermas la programo fenestro aŭ elŝaltas la komputilo. En tiu kazo, ni volas ke la programo por fermi sin. La KEYDOWN kaj KEYUP evento generitaj kiam la ludanto puŝas sin kaj liberigas la klavaro klavoj, respektive. Tiuj eventoj estos kiel ni povas scii kiu direkto la ludanto volas movi la karaktero. La ludanto povas ankaŭ esti premitaj la Esk ŝlosilo por signali ke ili volas fermi la programon. Ĉiufoje la ludanto movas la muson, Pygame generos MOUSEMOTION okazaĵo kiu diros al ni la X-kaj Y-koordinatoj de la muso kursoro super la fenestro.
  1. por evento en pygame.event.get ():
  2. se event.type == QUIT:
  3. finiĝi ()
Linio 82 estas la komenco de la evento-uzado kodo. Unue ni nomas pygame.event.get (), kiu resendas liston de Eventon celoj. Ĉiu Eventon objekto reprezentas okazaĵon kiu estis kreita post la lasta alvoko por pygame.event.get (). Ni kontrolu la tipo atributo de la evento objekto por vidi kio tipo de okazaĵo estas, kaj manipuli la evento laŭe.
Se la tipo atributo de la Evento objekto estas egala al QUIT, tiam ĉi tiu diras ni, ke la uzanto fermis la programon iel. La QUIT konstanta variablo estis importitaj de la pygame.locals modulo, sed ĉar ni importis tiu modulo kun la linio de pygame.locals importado * anstataŭ simple importado pygame.locals, ni nur bezonas tajpi QUIT kaj ne pygame.locals.QUIT.
  1. se event.type == KEYDOWN:
  2. se event.key == Ord ('z'):
  3. reverseCheat = True
  4. se event.key == Ord ('x'):
  5. slowCheat = True
Se la evento tipo estas KEYDOWN, tiam ni scias ke la ludanto premitan ŝlosilo. La Evento objekto por klavaro eventoj ankaŭ havos ŝlosilan atributo kiu estas metita al la nombraj ASCII valoro de la klavo premita. La Ord () funkcio estos redoni la ASCII valoro de la letero pasis al ĝi.
Ekzemple, sur linio 87, ni povas kontroli se la okazaĵo priskribas la "z" klavo premita suben kontrolante se event.key == Ord ('z'). Se ĉi tiu kondiĉo estas vera, tiam ni volas establi la reverseCheat variablo al Vera por indiki ke la inversa cheat estis aktivigita. Ni ankaŭ kontroli se la "x" klavon estis premitaj por aktivigi la malrapida cheat en simila maniero.
Pygame la klavaro eventoj ĉiam uzi la ASCII valoroj de minuskla literoj, ne majuskle. Kion tio signifas por via kodo estas ke vi devus ĉiam uzi event.key == Ord ('z') anstataŭ event.key == Ord ('Z'). Alie, via programo povas agi kvazaŭ la ŝlosilo ne premis ajn.
  1. se event.key == K_LEFT aŭ event.key == Ord ('a'):
  2. moveRight = False
  3. moveLeft = True
  4. se event.key == K_RIGHT aŭ event.key == Ord ('d'):
  5. moveLeft = False
  6. moveRight = True
  7. se event.key == K_UP aŭ event.key == Ord ('w'):
  8. moveDown = False
  9. moveUp = True
  10. se event.key == K_DOWN aŭ event.key == Ord ('s'):
  11. moveUp = False
  12. moveDown = True
Ni ankaŭ volas kontroli ĉu la okazaĵo estis generita de la ludanto premante unu el la sagoklavoj. Tie ne estas Askio valoron por ĉiu klavo de la klavaro, kiel la sagoklavoj aŭ la Esk ŝlosilo. Anstataŭe, Pygame havigas iu konstanto variabloj uzi anstataŭe.
Ni povas kontroli se la ludanto premis la maldekstran sago ŝlosilo kun la kondiĉo: event.key == K_LEFT. Denove, la kialo povas uzi K_LEFT anstataŭ pygame.locals.K_LEFT estas ĉar ni importis pygame.locals kun la linio de pygame.locals importado * anstataŭ importado pygame.locals.
Rimarkis ke premante sur unu el la sagoklavoj ne nur difinas unu el la movado variabloj al Vera, sed ankaŭ difinas la movadon variablo en la kontraŭa direkto al False. Ekzemple, se la maldekstra sago ŝlosilo estas puŝita malsupren, tiam la kodo en linio 93 aroj moveLeft al Vera, sed ankaŭ establas moveRight al False. Ĉi malhelpas la ludanto de konfuzi la programo en pensante ke la ludanto karaktero devus movi en du kontraŭaj direktoj samtempe.
Jen listo da ofte uzataj konstanta variabloj por la ŝlosilo atributo de klavaro-rilatajn Eventon celoj:

[insert table here]

Iam ajn dum la ludo, la ludanto povas premi la klavon Esc sur la klavaro lasi la ludon. Ĉi tie ni kontrolu se la ŝlosilo kiu estis ĵetita estis la Esk ŝlosilo kontrolante event.key == K_ESCAPE. Se jes, ni nomas nian eksigi () funkcio kiu eliras la programo.

    
se event.key == K_LEFT AU event.key == Ord ('a'):
    
moveLeft = False
    
se event.key == K_RIGHT AU event.key == Ord ('d'):
    
moveRight = False
    
se event.key == K_UP AU event.key == Ord ('w'):
    
moveUp = False
    
se event.key == K_DOWN AU event.key == Ord ('s'):
    
moveDown = False
Linioj 114 al 121 ĉeko se la ludanto haltis premante unu el la sagoklavoj (aŭ la respondajn WASD klavo). En tiu kazo, ni starigos la responda movado variablo al False. Ekzemple, se la ludanto tenas la maldekstra sago ŝlosilo, tiam la moveLeft estus aro al Vera on line 93. Kiam ili liberigas ĝin, la kondiĉo sur linio 114 taksos al Vera, kaj la moveLeft variablo estos agordita por malvera.La move_ip () Metodo por Rect objektoj

    
se event.type == MOUSEMOTION:
    
# Se la muso movas, movi la ludanto kie la kursoro estas.
    
playerRect.move_ip (event.pos [0] - playerRect.centerx, event.pos [1] - playerRect.centery)
Nun ke ni manipulis la klavaro eventoj, ni manipuli ajna muso eventoj kiuj povas esti generita. En la Dodger ludo ni ne faru ion se la ludanto clicked muso butonon, sed la ludo ne respondas kiam la ludanto movas la muson. Tio donas al la ludanto du manieroj de kontroli la ludanto karaktero en la ludo: la klavaro kaj la muso.
Se la evento tipo estas MOUSEMOTION, tiam ni volas movi la ludanto karakteron al la situo de la muso kursoro. La MOUSEMOTION okazaĵo estas generita ĉiufoje kiam la muso estas movita. Okazaĵo objektoj kun tipo de MOUSEMOTION ankaŭ atributo nomata post. La post atributo stokas opo de la X-kaj Y-kunordigas de kie la musmontrilo movis en la fenestron.
La move_ip () metodon por Rect celoj movos la situo de la Rect objekto horizontale aŭ vertikale per nombro de rastrumeroj. Ekzemple, playerRect.move_ip (10, 20) movus la Rect objekto 10 rastrumeroj dekstre kaj 20 rastrumeroj sube. Por movi la Rect objekto maldekstra aŭ supren, pasi negativaj valoroj. Ekzemple, playerRect.move_ip (-5, -15) movos la Rect objekto lasita de 5 rastrumeroj kaj ĝis 15 rastrumeroj.
La "ip" fine de move_ip () staras por "en loko". Ĉi tiu estas ĉar la metodo ŝanĝas la Rect objekto mem, en sia propra loko. Ankaŭ estas movado () metodo kiu ne ŝanĝas la Rect objekto, sed anstataŭ kreas novan Rect objekto kiu havas la novan lokon. Ĉi tio estas utila, se vi volas konservi la originalan Rect objekto situo la sama sed ankaŭ havas Rect objekto kun la nova loko.Aldonante Nov Baddies

    
# Aldoni novan baddies sur la supro de la ekrano, se necese.
    
se ne reverseCheat kaj ne slowCheat:
    
baddieAddCounter + = 1
Sur ĉiu ripeto de la ludo buklo, ni volas pliigo la baddieAddCounter variablo al oni. Tamen, ni nur volas fari tion ĉi se la cheats ne estas ebligitaj. Memoru ke reverseCheat kaj slowCheat: nur aro al Vera kiel longa kiel la "z" kaj "x" klavoj estas tenis malsupren, respektive. Kaj dum tiuj klavoj estas tenis malsupren, baddieAddCounter ne incremented. Tio signifas ke neniu nova baddies aperos sur la supro de la ekrano.

    
se baddieAddCounter == ADDNEWBADDIERATE:
    
baddieAddCounter = 0
    
baddieSize = random.randint (BADDIEMINSIZE, BADDIEMAXSIZE)
    
newBaddie = {'rect': pygame.Rect (random.randint (0, WINDOWWIDTH-baddieSize), 0 - baddieSize, baddieSize, baddieSize),
    
'Rapido': random.randint (BADDIEMINSPEED, BADDIEMAXSPEED),
    
'Surfaco': pygame.transform.scale (baddieImage, (baddieSize, baddieSize)),
    
}
Kiam la baddieAddCounter atingas la valoron en ADDNEWBADDIERATE, tiam la kondiĉo sur linio 130 estas Vera kaj estas tempo por aldoni novan baddie al la supro de la ekrano. Unue, la baddieAddCounter vendotablo estas retrovu reen al 0 (alie, kiam subtenas pliigante ĝin ĉiam estos pli granda ol ADDNEWBADDIERATE kaj neniam egala al ĝi. Tiu kaŭzos baddies halti aperi sur la supro de la ekrano.)
Linio 132 generas grandeco por la baddie en rastrumeroj. La grandeco estos inter BADDIEMINSIZE kaj BADDIEMAXSIZE, kiujn ni starigis al 10 kaj 40 en tiu programo.
Linio 133 estas kie nova baddie datumstrukturo estas kreita. Memoru, la datumstrukturo por baddies estas simple vortaro kun klavoj 'rect', 'rapido', kaj 'surfaco'. La 'rect' klavo tenas referencon al objekto kiu Rect stokas la situo kaj grandeco de la baddie. La alvoko al la pygame.Rect () konstruilo funkcio havas kvar parametroj: la X-koordinato de la supro eĝo de la areo, la Y-koordinato de la maldekstra rando de la areo, la larĝa en rastrumeroj, kaj la alto en rastrumeroj.
Ni volas ke la baddie aperi hazarde trans la supro de la fenestro, tiel ni pasas random.randint (0, WINDOWWIDTH-baddieSize) por la X-koordinato de la maldekstra rando. Ĉi taksos al hazarda loko trans la supro de la fenestro. La kialo ni pasas WINDOWWIDTH-baddieSize anstataŭ WINDOWWIDTH estas ĉar ĉi tiu valoro estas por la maldekstra rando de la baddie. Se la maldekstra rando de la baddie estas tro malproksime sur la dekstra flanko de la ekrano, kaj poste parto de la baddie estos for la bordo de la fenestro kaj ne estas videbla.
Ni volas ke la fundo rando de la baddie esti ĝuste super la supro eĝo de la fenestro. La Y-koordinato de la supro eĝo de la fenestro estas 0, do meti la baddie la fundo rando tie, ni volas establi la supro eĝo al 0 - baddieSize.
La baddie la largxeco kaj alteco devus esti la sama (la bildo estas kvadrato), do ni pasos baddieSize por la tria kaj kvara argumento.
La kurzo de rapido, ke la baddie movas laŭ la ekrano estos metita en la 'rapido' klavo, kaj estas metita al hazarda entjero inter BADDIEMINSPEED kaj BADDIEMAXSPEED.

    
baddies.append (newBaddie)
Linio 138 aldonos la nove kreita baddie datumstrukturo al la listo de baddie datumstrukturoj. Nia programo uzos tiun liston por kontroli se la ludanto karambolis kun iu el la baddies kaj scii kie desegni baddies sur la fenestro.Movante la ludanto Karaktero

    
# Movu la ludanto ĉirkaŭe.
    
se moveLeft kaj playerRect.left> 0:
    
playerRect.move_ip (-1 * PLAYERMOVERATE, 0)
La kvar movado variabloj moveLeft, moveRight, moveUp kaj moveDown estas aro al Vera kaj Falsa kiam Pygame generas la KEYDOWN kaj KEYUP okazaĵoj, respektive. (Ĉi tiu kodo estas de linio 86 al vicigas 121.)
Se la ludanto karaktero estas movanta lasis kaj la maldekstra rando de la ludanto karaktero estas pli granda ol 0 (kiu estas la maldekstra rando de la fenestro), tiam ni volas movi la gravulo Rect objekto (stokita en playerRect).
Ni ĉiam movi la playerRect objekto per la nombro de rastrumeroj en PLAYERMOVERATE. Por ricevi la negativan formon de entjera, vi povas simple multnombraj ĝin -1. Do on line 142, ekde 5 stokas en PLAYERMOVERATE, la esprimo -1 * PLAYERMOVERATE taksas al -5.
Tio signifas, ke voko playerRect.move_ip (-1 * PLAYERMOVERATE, 0) ŝanĝos la situon de playerRect per 5 rastrumeroj maldekstren de ĝia aktuala loko.

    
se moveRight kaj playerRect.right <WINDOWWIDTH:
    
playerRect.move_ip (PLAYERMOVERATE, 0)
    
se moveUp kaj playerRect.top> 0:
    
playerRect.move_ip (0, -1 * PLAYERMOVERATE)
    
se moveDown kaj playerRect.bottom <WINDOWHEIGHT:
    
playerRect.move_ip (0, PLAYERMOVERATE)
Ni volas fari la samon por la aliaj tri direktoj: dekstra, supren kaj malsupren. Ĉiu el la tri se deklaroj en linioj 143 al 148 ĉekojn ke ilia movado variablo estas agordita por Vera kaj ke la rando de la Rect celo de la ludanto estas ene de la fenestro antaux nomante la move_ip () metodon por movi la Rect objekto.La pygame.mouse.set_pos () Funkcio

    
# Movu la muson kursoron por kongrui al la ludanto.
    
pygame.mouse.set_pos (playerRect.centerx, playerRect.centery)
Linio 151 movas la muson kursoron al la sama pozicio kiel la ludanto karaktero. La pygame.mouse.set_pos () funkcio movas la muson kursoron al la X-kaj Y-koordinatoj kiuj pasas ĝin. Specife, la kursoro estos ĝuste en la mezo de la gravulo Rect objekto ĉar ni pasos la centerx kaj centery atributoj de playerRect por la koordinatojn. La muso kursoro ankoraŭ ekzistas kaj povas esti movita, kvankam ĝi estas nevidebla, ĉar ni nomas pygame.mouse.set_visible (Falsa) on line 47.
La kialo ni volas ke la muso kursoron por kongrui la situo de la ludanto karaktero estas eviti subitan saltojn. Imagu ke la muso kursoro kaj la ludanto karaktero estas je la sama loko en la maldekstra flanko de la fenestro. Kiam la ludanto tenas malsupren dekstren sago ŝlosilo, la karaktero movas al la dekstra rando de la fenestro sed la muso kursoro devus resti ĉe la maldekstra rando de la ekrano. Se la ludanto tiam movas la muson malmulta, la ludanto karaktero estus tuj salti al la situo de la muso kursoron sur la maldekstra rando de la ekrano. Por movi la muson kursoro kune kun la ludanto karakteron, neniu muso movadoj ne rezultos en subita salto trans la fenestro.

    
# Movu la baddies sube.
    
por b en baddies:
Nun ni volas buklo tra ĉiu baddie datumstrukturo en la baddies listo movi ilin iomete.

    
se ne reverseCheat kaj ne slowhttp://twistedmatrix.com/users/jh.twistd/python/moin.cgi/MoinMoinColorizerCheat:
    
b ['rect']. move_ip (0, b ['rapido'])
Se neniu el la cheats estis aktivigitaj (de la ludanto puŝas la "z" aŭ "x" klavojn kiuj aroj reverseCheat aŭ slowCheat al Vera, respektive), tiam movi la baddie la situo malsupren kelkaj rastrumeroj egala al ĝia rapido, kiu estas stokita en la 'rapido' klavo.Realiganta la Cheat Kodoj

    
elif reverseCheat:
    
b ['rect']. move_ip (0, -5)
Se la mala cheat estis aktivigitaj, tiam la baddie devus reale esti movita far kvin bilderojn. Pasante -5 por la dua argumento al move_ip () movos la Rect objekto supren de kvin bilderojn.

    
elif slowCheat:
    
b ['rect']. move_ip (0, 1)
Se la malrapida cheat estis aktivigitaj, tiam la baddie devus movi sube, sed nur por la malrapida rapideco de unu bildero por ripeto tra la ludo buklo. La baddie la normala rapido (kiu estas stokitaj en la 'rapido' ŝlosilon de la baddie la datumstrukturo) estos ignorata dum la malrapida cheat estas aktivigita.Forigante la Baddies

    
# Delete baddies kiuj falis preter la fundo.
    
por b en baddies [:]:
Post kopii la baddies malsupren la fenestro, ni volas forigi ajnan baddies kiu falis sub la fundo rando de la fenestro de la baddies listo. Memoru ke ni dum ni ripetanta tra listo, ni ne devas modifi la enhavon de la listo per aldono aŭ forigo erojn. Do anstataŭ ripetanta tra la baddies listo kun niaj baddies buklo, ni persisti tra kopion de la baddies listo.
Memoru ke liston tranĉaĵo taksos kopion de listo de artikoloj. Ekzemple, spamado [2:4] revenos nova listo kun la artikoloj el indekso 2 ĝis (sed ne inkludita) indekso 4. Lasante la unua indico malplenan indikos ke indico 0 devus esti uzita. Ekzemple, spamado [: 4] revenos lerta kun eroj de la komenco de la listo ĝis (sed ne inkludita) la artikolon en indekso 4. Lasante la dua indico malplenan indikos ke ĝis (kaj inkluzive de) la lasta indekso devus esti uzita. Ekzemple, spamado [2:] revenos lerta kun eroj el indekso 2 tutan vojon al (kaj inkluzive de) la lastan eron en la listo.
Sed lasante ambaŭ indeksas en la tranĉaĵo malplenan estas maniero por reprezenti la tutan liston. La baddies [:] esprimo estas listo tranĉaĵo de la tuta listo, do ĝi taksas al kopio de la tuta listo. Ĉi tiu estas utila ĉar dum ni ripetanta la kopion de la listo, ni povas modifi la originalan liston kaj forigi ajnan baddie datumstrukturoj kiuj falis preter la fundo rando de la fenestro.
Nia por buklo sur linio 163 uzas variablon b por la nuna ero en la ripeta tra baddies [:].

    
se b ['rect']. supro> WINDOWHEIGHT:
    
baddies.remove (B)
Ni taksas la esprimon b ['rect']. Supro. b estas la nuna baddie datumstrukturo de la baddies [:] listo. Ĉiu baddie datumstrukturo en la listo estas vortaro kun 'rect' klavo, kiu stokas Rect objekto. Do b ['rect'] estas la Rect objekto por la baddie. Fine, la pinto estas la Y-koordinato de la supro eĝo de la rektangula areo. Memoru, ke en la koordinata sistemo, la Y-koordinatojn kresko subiro. Do b ['rect']. Supro> WINDOWHEIGHT kontrolos se la supro eĝo de la baddie estas sub la malsupro de la fenestro.
Se ĉi tiu kondiĉo estas vera, tiam la ni forigos la baddie datumstrukturo de la baddies listo.Desegno la Fenestro
Ne estas sufiĉe ke niaj ludo ĝisdatigas la stato de la ludo mondo en lia memoro. Nia programo havos ankaŭ por montri la ludo mondo al la ludanto. Ni povas fari ĉi per desegnaĵo la grafiko de la baddies kaj ludanto karaktero sur la ekrano. Ĉar la ludo buklo estas ekzekutita plurfoje duan, tirante la baddies kaj ludanto en nova pozicioj faras lia movado aspektas mildaj kaj natura. Sed ĉiu ero en la ekrano devas esti desegnita unuope nomante la taŭga Pygame funkcio.

    
# Eltiru la ludo mondo sur la fenestro.
    
windowSurface.fill (BACKGROUNDCOLOR)
Nun ke ni ĝisdatigis ĉiujn datumojn strukturoj por la baddies kaj la ludanto karaktero, ni desegni ĉiu sur la ekrano. Unue, antaŭ ol ni desegni ion alian pri la Surfaca objekto nomita per windowSurface, ni volas nigra el la tuta ekrano viŝi ion desegnita sur ĝi en antaŭa ripeto tra la ludo buklo.
Memoru ke la Surfaca objekto en windowSurface estas la speciala Surfaca objekto ĉar ĝi estis la redonata de pygame.display.set_mode (). Tio signifas, ke io desegnita sur tiu Surfaca objekto aperos sur la ekrano, sed nur post la pygame.display.update () funkcio estas nomita.Desegno la ludanto Interpunkcio

    
# Eltiru la partituro kaj supro partituro.
    
drawText ('Interpunkcio:% ​​s'% (interpunkcio), tiparo, windowSurface, 10, 0)
    
drawText ('Supraj Score:% s'% (topScore), tiparo, windowSurface, 10, 40)
Ni tuj redonu la teksto por interpunkcio kaj supro partituro la supron maldekstra angulo de la fenestro. La 'Interpunkcio:% ​​s'% (interpunkcio) uzas ĉenon interpola insertar la valoron en la partituro variablo en la kordo. Ĉi tiu estas la sama afero kiel "Score: '+ str (interpunkcio). Ni pasas ĉi ŝnuro, la Font objekto stokitaj en la tiparo variablo, la Surfaca objekto sur kiu desegnas la teksto sur, kaj la X-kaj Y-kunordigas de kie la teksto devas esti metita. Memoru ke nia drawText () manipulos la alvoko al la render () kaj blit () metodoj.
Por la supro partituro, ni faru la ĝustan samon. Ni pasas 40 por la Y-koordinato anstataŭ 0 (kiel oni faru kun la interpunkcio) por ke la supro partituro teksto aperas sub la partituro tekston.Desegno la ludanto Karaktero

    
# Eltiru la ludanto rektangulo
    
windowSurface.blit (playerImage, playerRect)
Memoru ke la informo pri la ludanto estas gardata en du malsamaj variabloj. playerImage estas Surfaca objekto kiu enhavas ĉiujn koloraj bilderoj, kiuj konsistigas la ludanto gravulo bildo. playerRect estas Rect objekto kiu stokas la informojn pri la grandeco kaj situo de la ludanto karaktero.
Ni nomas la blit () metodo en windowSurface kaj pasi playerImage kaj playerRect. Tiu tiras la ludanto gravulo bildon sur windowSurface ĉe la taŭga loko.

    
# Eltiru ĉiu baddie
    
por b en baddies:
    
windowSurface.blit (b ['surfaco'], b ['rect'])
Ni uzas por buklo tie por desegni ĉiu baddie la windowSurface objekto. Memoru ke ĉiu ero en la baddies listo estas vortaro kun 'surfaco' kaj 'rect' klavoj enhavas la Surfaca objekto kun la baddie bildo kaj la Rect objekto kun la pozicio kaj grandeco informojn, respektive.

    
pygame.display.update ()
Nun ke ni finos desegni ĉiu al la windowSurface objekto, ni devus desegni tiun surfacon por la ekrano kun alvoko al pygame.display.update ().Kolizio Detección

    
# Kontroli se iu el la baddies trafis la ludanto.
    
se playerHasHitBaddie (playerRect, baddies):
    
se partituro> topScore:
    
topScore = partituro # starigis novan supro partituro
    
rompi
Nun ni kontrolu se la ludanto karambolis kun iu el la baddies. Ni jam skribis funkcio por kontroli por tio: playerHasHitBaddie (). Ĉi tiu funkcio estos redoni Vera se la ludanto karaktero karambolis kun iu el la baddies en la baddies listo. Alie, la funkcio estos redoni False.
Se la ludanto karaktero batis baddie, tiam ni kontrolu se la ludanto nuna partituro estas pli granda ol la supro partituro. Se jes, ni starigis la novan supro partituro esti la ludanto nuna partituro. Ajna formo, ni rompi la ludon buklo. La programo ekzekuto saltos malsupren al linio 191.

    
mainClock.tick (FPS)
Por subteni la komputilo de kurante tra la ludo buklo kiel eble plej rapide (kio estus multe tro rapida por la ludanto por subteni supren kun), ni nomas mainClock.tick () paŭzi por mallonga kvanto de tempo. La paŭzo estos sufiĉe longe por certigi ke ĉirkaŭ 40 (la valoron ni stokita en la FPS variablo) iteraciones tra la ludo buklo okazas ĉiun duan.La Game Over Ekrano

    
# Haltu la ludo kaj montri la "Game Over" ekrano.
    
pygame.mixer.music.stop ()
    
gameOverSound.play ()
Kiam la ludanto malvenkas, ni volas halti ludas la fono muziko kaj ludi la "ludo finita" sono efekton. Ni nomas la halto () funkcio en la pygame.mixer.music modulo por halti la fono muziko. Tiam ni nomas la ludon () metodon por Sono objekto stokitaj en gameOverSound.

    
drawText ('GAME OVER', tiparo, windowSurface, (WINDOWWIDTH / 3), (WINDOWHEIGHT / 3))
    
drawText ('Klaku ŝlosilon por ludi denove.', tiparo, windowSurface, (WINDOWWIDTH / 3) - 80, (WINDOWHEIGHT / 3) + 50)
    
pygame.display.update ()
    
waitForPlayerToPressKey ()
Nun ni volas montri teksto sur la fenestro por diri al la ludanto kiu la ludo estas finita, kaj ili devus premi klavon por komenci ludi nova ludo. La du alvokojn al nia drawText () funkcio eltiros ĉi tekston al la windowSurface objekto, kaj la alvokon al pygame.display.update () eltiros ĉi Surfaca celo al la ekrano.
Post montri ĉi tiun tekston, ni volas la ludo halti ĝis la ludanto premas klavon, do ni nomas nian waitForPlayerToPressKey () funkcio.

    
gameOverSound.stop ()
Post la ludanto premas klavon, la programo ekzekuto revenos el la waitForPlayerToPressKey () alvoko on line 198. Depende kiel longe la ludanto prenas premi klavon, la "ludo finita" sono efekto povas aŭ ne ankoraŭ povas ludi. Ni volas haltigi tiun sonon efekto antaŭ ĉi buklo ekstremaj kaj ni komenci novan ludon, do ni havas alvokon al gameOverSound.stop () tie.Modifi la Dodger Ludo
Estas tio por nia grafika ludo. Vi povas trovi ke la ludo estas tro facila aŭ tro peza. Sed la ludo estas tre facila por modifi ĉar ni prenis la tempon por uzi konstanta variabloj anstataŭ tajpi en la valoroj rekte. Kaj cxio ni devas fari por ŝanĝi la ludo estas modifi la valoro starigis en la konstanta variabloj.
Ekzemple, se vi volas ke la ludo kuri pli malrapida ĝenerale, ŝanĝi la FPS variablo en linio 8 al pli malgranda valoro kiel 20. Ĉi faros tiel la baddies kaj la ludanto karaktero movi malrapida ekde la ludo buklo nur esti ekzekutita 20 fojoj duan anstataŭ 40.
Se vi volas nur malrapidigos baddies kaj ne la ludanto, kaj poste ŝanĝi BADDIEMAXSPEED al plej malgranda valoro kiel 4. Ĉi faros cxiujn baddies movas inter 1 (la valoron en BADDIEMINSPEED) kaj 4 rastrumeroj por ripeto tra la ludo buklo anstataŭ 1 kaj 8.
Se vi volas ke la ludo havi malpli sed pli granda baddies anstataŭ multaj rapida baddies, tiam pliigi ADDNEWBADDIERATE al 12, BADDIEMINSIZE al 40, kaj BADDIEMAXSIZE al 80. Nun tiu baddies estas aldonita ĉiun 12 iteraciones tra la ludo buklo anstataŭ ĉiu 6 iteraciones, estos la duono kiel multaj baddies kiel antaŭe. Sed, por gardi la ludo interesa, la baddies estas nun multe pli granda ol antaŭe.
Dum la baza ludo restas la sama, oni povas modifi iun el la konstanta variabloj draste tuhttp://twistedmatrix.com/users/jh.twistd/python/moin.cgi/MoinMoinColorizerŝas la konduto de la ludo. Konservu provu novajn valorojn por la konstanta variabloj ĝis vi trovas aron de valoroj vi plej ŝatas.Resumo: Krei Your Own Ludoj
Kontraste nia antaŭa teksto bazita ludoj, Dodger vere aspektas kiel la speco de moderna komputila ludo ni kutime ludas. Ĝi havas grafiko kaj muziko kaj uzas la muson. Dum Pygame provizas funkciojn kaj datumtipoj kiel blokoj, estas vi, la programisto kiu metas ilin kune krei amuzaj, interaktiva ludoj.
Tio estás Nur aŭto vidis scias ĝuste Kiel instrui la komputilon Por fari ĝino, Paso post Paso, linio Por linio. Vi povas paroli la komputilo lingvo, kaj akiri ĝin fari grandajn kvantojn de numero disigan kaj desegno por vi. Ĉi tiu estas tre utila lertecon, kaj mi esperas ke vi daŭre lerni pli pri Pitono programado. (Kaj ekzistas ankoraŭ pli lerni!)
Jen estas kelkaj retejoj kiuj povas instrui al vi pli pri programado Python:

    
http://www.python.org/doc/ - Pli Python lernilojn kaj la dokumentado de ĉiuj Python moduloj kaj funkcioj.
    
http://www.pygame.org/docs/ - Kompleta dokumentado sur la moduloj kaj funkcioj por Pygame.
    
http://inventwithpython.com - Ĉi tiu libro de afiŝinto, kiu inkluzivas la tutan fontkodon por tiuj programoj kaj pliaj informoj. Ĉi tiu retejo havas ankaŭ la bildo kaj sondosieroj uzata en la Pygame programoj.
    
http://inventwithpython.com/traces - A apliko retejo kiu helpas vin spuri tra la ekzekuto de la programoj en tiu libro, paŝo post paŝo.
    
http://inventwithpython.com/videos - Filmetoj kiuj akompanas la programoj en tiu libro.
    
http://gamedevlessons.com - A helpema retejo pri kiel desegni kaj programo videoludoj.
    
al@inventwithpython.com - La aŭtoro retadreso. Bonvolu retpoŝti Al viaj demandoj pri tiu libro aŭ pri Pitono programado.
Aŭ vi povas eltrovi pli pri Python per serĉado la TTT. Iru al la serĉilon afiŝinto http://google.com kaj serĉo por "Python programado" aŭ "Python lernilojn" por trovi retejojn kiuj povas instrui al vi pli pri Pitono programado.
Nun ek al kaj elpensi vian propran ludoj. Kaj bonŝancon!
 

Nenhum comentário:

Postar um comentário