Páginas

domingo, 3 de março de 2013

skribu-kun-python-cxap17



Temoj Kovritaj En tiu ĉapitro:

  • Programaro Bibliotekoj
  • Instalado Pygame
  • Grafikaj interfacoj (GUI)
  • Desegno primitivoj
  • Kreante GUI fenestro kun Pygame
  • Koloro en Pygame
  • Tiparoj en Pygame
  • Aliased kaj Anti-Aliased Graphics
  • Atributoj
  • La pygame.font.Font Datumtipo
  • La pygame.Surface Datumtipo
  • La pygame.Rect Datumtipo
  • La pygame.PixelArray Datumtipo
  • Konstruilo Funkcioj
  • La tipo () Funkcio
  • Pygame la Desegno Funkcioj
  • La blit () Metodo por Surfaca Celoj
  • Eventoj
  • La Ludo Cirkla
  • Kuraĝigo
Ĝis nun, ĉiuj niaj ludoj uzata nur teksto. Teksto estas montrata en la ekrano kiel eliro, kaj la ludanto tipoj en tekston de la klavaro kiel enigo. Tiu estas simpla, kaj facila maniero por lerni programadon. Sed en ĉi tiu ĉapitro, ni faros iun pli ekscita ludoj kun antaŭita grafiko kaj sono uzante la Pygame biblioteko. Ĉapitroj 17, 18, kaj 19 Mi instruos vin, kiel uzi la Pygame biblioteko fari ludojn kun grafikaĵoj, kuraĝigo, muso enigo, kaj sono. En ĉi tiuj ĉapitroj ni skribi fontkodon por simplaj programoj, kiuj ne estas ludoj, sed evidentigas la Pygame konceptojn ni lernis. Ĉapitro 20 prezentos la fontkodon por kompleta Pygame ludo uzante ĉiuj konceptoj vi lernis.
Al programaro biblioteko estas kodo kiu ne intencis esti gvidata de mem, sed inkludis en aliaj programoj por aldoni novajn funkciojn. Uzante biblioteko programisto ne devas skribi la tutan programon, sed povas uzi la verkon kiu alia programisto faris antaux ili. Pygame estas programaro biblioteko kiu havas modulojn por grafikaĵoj, sono, kaj aliajn funkciojn ludoj komune uzi.

Instalado Pygame

Pygame ne venas kun Python. Kiel Python, Pygame estas havebla senpage. Vi devos elŝuti kaj instali Pygame, kiu estas tiel facila kiel elŝuti kaj instali la Python interpretisto. Per foliumilo, iru al la URL http://pygame.org kaj klaku sur la "Downloads" ligilo sur la maldekstra flanko de la TTT-ejo. Ĉi tiu libro supozas vi havas la mastruma sistemo Windows, sed Pygame funkcias same por ĉiu mastruma sistemo. Vi devas elŝuti la Pygame instalilo por via mastruma sistemo kaj la versio de Python vi instalis (3.1).
Vi ne volas elŝuti la "fonto" por Pygame, sed prefere la Pygame "duuma" por via mastruma sistemo. Por Vindozo, elŝutu la pygame-1.9.1.win32-py3.1.msi dosiero. (Ĉi tiu estas Pygame por Python 3.1 sur Vindozo. Se vi instalis malsama versio de Python (kiel 2,5 aŭ 2,4) elŝuti la. MSI dosiero por via versio de Python.) La nuna versio de Pygame tiutempe ĉi libro estis skribita estas 1.9.1. Se vi vidas pli nova versio sur la retejo, elŝutu kaj instalu la pli novaj Pygame. Por Mac OS X kaj Linukso, sekvu la direktojn sur la elŝuta paĝo instaladaj instrukcioj.

Figuro 17-1: La pygame.org retejo.
En Windows, duobla alklaku la elŝutitan dosieron por instali Pygame. Por kontroli, ke Pygame estas instali korekte, tajpu la sekvajn en la interaga konko:
>>> Importado pygame
Se nenio aperas post vi batis la Eniga klavo, tiam vi scias Pygame sukcese instalita. Se la eraro ImportError: Neniu modulo nomata pygame aperas, tiam provu instali Pygame denove (kaj certigi vin tajpis importado pygame korekte).
Ĉi tiu ĉapitro havas kvin malgrandajn programojn kiuj pruvas kiel uzi la malsamaj trajtoj kiuj Pygame provizas. En la lasta ĉapitro, vi uzos tiujn trajtojn por kompleta ludo skribita en Python kun Pygame.
Video tutorial de kiel instali Pygame estas havebla de ĉi tiu libro de afiŝinto ĉe http://inventwithpython.com/videos/ .

Saluton Mondo en Pygame

Ni iras al krei novan "Saluton Mondo!" programo, kiel vi kreis ĉe la komenco de la libro. Ĉi-foje, ni uzos Pygame fari "Saluton mondo!" aperas en grafika uzulinterfaco (GUI, kiu estas prononcata "gooey") fenestro. Grafika uzulinterfaco donas fenestro tiu koloro, formoj, kaj la bildoj povas esti desegnita sur per via programo, tiel kiel akcepti muso enigo (kaj ne nur klavaro enigo). La baza formoj kiujn ni desegni sur la ekrano estas nomitaj desegnante primitivoj. GUI fenestroj estas uzitaj anstataŭ la teksto fenestro (ankaŭ nomata konzolo fenestroterminala fenestro) kiun ni uzas por nia tuta antaŭa ludoj.
Pygame ne funkcias bone kun la interaga konko ĉar dependas de ludo buklo (ni priskribos ludo maŝojn poste). Pro tio, vi nur povas skribi Pygame programoj kaj ne povas sendi instrukciojn al Pygame unuope tra la interaga ŝelo.
Pygame programoj ankaŭ ne uzas la enigo () funkcio. Ne estas teksto enigo kaj eligo. Anstataŭe, la programo montras eligo en fenestro per desegnaĵo grafiko kaj teksto al la fenestro. Pygame programo enigo venas de la klavaro kaj la muso tra aĵoj nomata eventoj, kiujn ni iros en la sekva ĉapitro. Tamen, se nia programo havas erarojn kiuj kaŭzas Python por montri erarmesagxon, la eraro mesaĝo aperas en la konzolo fenestro.
Vi povas ankaŭ serĉi informojn pri kiel uzi la Pygame biblioteko vizitante la retejon http://pygame.org/docs/ref/ .

Saluton Mondo Fonta Kodo

Enskribu la sekvan kodon en la dosiero redaktoro, kaj konservi ĝin kiel pygameHelloWorld.py. Aŭ vi povas elŝuti ĉi fontkodon irante al ĉi tiu libro de afiŝinto ĉe http://inventwithpython.com/chapter17
pygameHelloWorld.py
Tiu kodo estas elŝutebla el http://inventwithpython.com/pygameHelloWorld.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
  2. el pygame.locals importado *

  3. # Starigis pygame
  4. pygame.init ()

  5. # Starigis la fenestro
  6. windowSurface = pygame.display.set_mode ((500, 400), 0, 32)
  7. pygame.display.set_caption ('Saluton mondo!')

  8. # Starigis la koloroj
  9. NIGRA = (0, 0, 0)
  10. WHITE = (255, 255, 255)
  11. RED = (255, 0, 0)
  12. VERDA = (0, 255, 0)
  13. BLUA = (0, 0, 255)

  14. # Starigis tiparoj
  15. basicFont = pygame.font.SysFont (None, 48)

  16. # Starigis la teksto
  17. teksto = basicFont.render ('Saluton mondo!', vere, blankaj, bluaj)
  18. textRect = text.get_rect ()
  19. textRect.centerx = windowSurface.get_rect (). centerx
  20. textRect.centery = windowSurface.get_rect (). centery

  21. # Desegni la blanka fono sur la surfaco
  22. windowSurface.fill (WHITE)

  23. # Desegni verda plurlatero sur la surfaco
  24. pygame.draw.polygon (windowSurface, VERDA, ((146, 0), (291, 106), (236, 277), (56, 277), (0, 106)))

  25. # Desegni iujn blua linioj sur la surfaco
  26. pygame.draw.line (windowSurface, BLUA, (60, 60), (120, 60), 4)
  27. pygame.draw.line (windowSurface, BLUA, (120, 60), (60, 120))
  28. pygame.draw.line (windowSurface, BLUA, (60, 120), (120, 120), 4)

  29. # Desegni blua cirklo sur la surfaco
  30. pygame.draw.circle (windowSurface, BLUA, (300, 50), 20, 0)

  31. # Desegni ruĝa elipso al la surfacon
  32. pygame.draw.ellipse (windowSurface, RED, (300, 250, 40, 80), 1)

  33. # Desegni la teksto de fono rektangulo sur la surfaco
  34. pygame.draw.rect (windowSurface, RED, (textRect.left - 20, textRect.top - 20, textRect.width + 40, textRect.height + 40))

  35. # Akiri rastrumeroj tabelo de la surfaco
  36. pixArray = pygame.PixelArray (windowSurface)
  37. pixArray [480] [380] = BLACK
  38. del pixArray

  39. # Desegni la teksto sur la surfaco
  40. windowSurface.blit (teksto, textRect)

  41. # Desegni la fenestro sur la ekrano
  42. pygame.display.update ()

  43. # Ruli la ludon buklo
  44. dum Vera:
  45. por evento en pygame.event.get ():
  46. se event.type == QUIT:
  47. pygame.quit ()
  48. sys.exit ()

Kurante la Saluton Mondo Programo

Kiam vi kuros ĉi programon, vi devus vidi novan GUI fenestro aperas kiu aspektas kiel Figuro 17-2.
Kio estas agrabla en uzi la GUI anstataŭ konzolo estas ke la teksto povas aperi ie ajn en la fenestro, ne nur post la antaŭa teksto ni presita. La teksto povas esti ajna koloro aŭ grandeco.
Unu aferon vi povas rimarki estas ke Pygame uzas multan opoj anstataŭ listoj. Opoj estas nur kiel lertaj (ili povas enhavi plurajn valorojn) krom ili tajpita kun parentezoj (kaj), anstataŭ rektaj krampoj [kaj]. La ĉefa diferenco estas, ke iam vi krei opo, vi ne povas ŝanĝi, aldoni, aŭ forigi iun ajn valorojn en la opo. Por teknikaj kialoj, sciante, ke la enhavo de la opo neniam ŝanĝo permesas Python por manipuli la datumojn pli efike, tial Pygame uzas opoj anstataŭ listoj.

Figuro 17-2: La "Saluton Mondo" programo.

Importi la Pygame Modulo

Ni transiru ĉiu de ĉi tiuj linioj de kodo kaj trovi kion ili faras.
  1. importado pygame, sys
  2. el pygame.locals importado *
Unue ni devas importi la pygame modulo do ni povas nomi la funkcioj en la Pygame programaro biblioteko. Vi povas importi plurajn modulojn en la sama linio de limigi la modulo nomojn per komoj. Linio 1 importoj ambaŭ la pygame kaj sys moduloj.
La dua linio importas la pygame.locals modulo. Tiu modulo enhavas multajn konstanta variabloj kiujn ni uzos kun Pygame kiel quit aux K_ESCAPE (kiu ni klarigos poste). Tamen, uzante la formon de moduleName importado * ni povas importi la pygame.locals modulo sed ne devas tajpi pygame.locals antaŭ ĉiu tempo ni uzi la modulon de funkcioj kaj variabloj en nia programo. La * simbolo signifas ke ni devas importi ĉio ene de la modulo.
La pygame.locals modulo enhavas kelkajn konstantajn variabloj ni uzos en tiu programo.
Se vi havas de sys importado * anstataŭ importado sys en via programo, vi povus voki eliro () anstataŭ sys.exit () en via kodo. (Sed la plejparto de la tempo estas pli bone uzi la plenan funkcion nomon por ke vi sciu kion modulo la eliro () estas in)

La pygame.init () Funkcio

  1. # Starigis pygame
  2. pygame.init ()
La Pygame programaro biblioteko havas iujn komencajn kodon kiu oni devas kuri antaŭ ol ni povas uzi ĝin. Ĉiuj Pygame programoj devas funkcii ĉi tiu kodo per nomante la pygame.init () post importi la pygame modulo sed antaŭ nomante ajna alia Pygame funkcioj.

La pygame.display.set_mode () kaj pygame.display.set_caption () Funkcioj

  1. # Starigis la fenestro
  2. windowSurface = pygame.display.set_mode ((500, 400), 0, 32)
  3. pygame.display.set_caption ('Saluton mondo!')
Linio 8 kreas GUI fenestro por nia programo nomante la set_mode () metodo en la pygame.display modulo. (La ekrano modulo estas modulo ene la pygame modulo. Pygame estas tiel antaŭita ke eĉ la pygame modulo havas siajn proprajn modulojn!)
Ĝuste por eviti konfuzon, vi devas scii la diferencon inter la fenestro kiu kredas estas malsama kaj la mastruma sistemo Windows. La grafika uzulinterfaco estas presita kiel "fenestro" (minuskloj kaj unuopa) kaj la mastruma sistemo de Microsoft estas "Vindozo" (majuskloj kaj pluralo).
Estas tri parametrojn al la set_mode () metodo. La unua parametro estas opo de du entjeroj por la larĝeco kaj alteco de la fenestro, en rastrumeroj. Al rastrumeroj estas la tiniest dot sur ​​via komputila ekrano. Sola rastrumeroj sur via ekrano povas igi iun koloron. Ĉiuj rastrumeroj sur via ekrano labori kune por montri ĉiujn fotojn vi vidos. Por vidi kiel malgranda pixel estas, rigardu la dekstra malsupra angulo de la "Saluton Mondo!" fenestro. Ĉi tiu programo aroj nur unu bildero kiel blankaj.
Ni volas ke la fenestro por esti 500 rastrumeroj larĝa kaj 400 rastrumeroj alta, do ni uzu la opo (500, 400) por la unua parametro. Por ricevi la tuta nombro de rastrumeroj en nia fenestro, multipliki la larĝa kaj la alteco. Nia fenestro konsistas el 20.000 rastrumeroj, kaj ĝi ne eĉ levu la tuta ekrano de komputilo!
La dua parametro estas por antaŭita GUI fenestro ebloj. Vi ne vere bezonas tion por viaj ludoj, do vi povas ĉiam nur pasi 0 por ĉi tiu parametro. La tria parametro estas alia antaŭita eblo nomata profundo de koloro. Vi ankaŭ ne bezonas scii kio tio signifas, kaj povas nur ĉiam pasas la valoron 32.
La set_caption () alvoko redonas pygame.Surface objekto (kiu nomos Surfaca celoj por mallonga). Celoj estas valoroj de datumtipo kiuj havas metodojn krom datumoj. Ekzemple, kordoj estas celoj en Python ĉar havas datumojn (la kordo mem) kaj metodoj (kiel malsupreniri () kaj divido ()). Vi povas stoki referencojn al celoj en variabloj samkiel listo referenco valoroj. La Surfaca objekto reprezentas la fenestro kaj ni inkludas la windowSurface variablo en ĉiuj niaj alvokoj al desegno funkcioj.
Por refreŝigi vian memoron pri la diferencoj inter valoroj kaj referenco valoroj, reiru al la ĉapitro 10.

Koloroj en Pygame

  1. # Starigis la koloroj
  2. NIGRA = (0, 0, 0)
  3. WHITE = (255, 255, 255)
  4. RED = (255, 0, 0)
  5. VERDA = (0, 255, 0)
  6. BLUA = (0, 0, 255)
Tabelo 17-1: Koloroj kaj ilia RGB valoroj.
Koloro RVB Valoroj
Aqua (0, 255, 255)
Nigra (0, 0, 0)
Blua (0, 0, 255)
Cejanoj Blua (100, 149, 237)
Fuchsia (255, 0, 255)
Griza (128, 128, 128)
Verda (0, 128, 0)
Kalko (0, 255, 0)
Maroon (128, 0, 0)
Mararmeo blua (0, 0, 128)
Olivarbo (128, 128, 0)
Purpura (128, 0, 128)
Ruĝa (255, 0, 0)
Arĝento (192, 192, 192)
Teal (0, 128, 128)
Blanka (255, 255, 255)
Flava (255, 255, 0)
Estas tri ĉefaj koloroj de lumo: ruĝa, verda kaj blua. Kombinante malsamaj kvantoj de tiuj tri kolorojn oni povas formi iu ajn alia koloro. En Python, ni reprezentas koloroj kun opoj de tri entjeroj. La unua valoro en la opo estas kiom ruĝa estas en la koloro. Valoro de 0 per ne estas ruĝa en ĉi tiu koloro, kaj valoro de 255 per ekzistas maksimuma kvanto de ruĝa en la koloro. La dua valoro estas por la verdo kaj la tria valoro estas por blua.
Ekzemple, ni kreos la opo (0, 0, 0) kaj konservas ĝin en variablo nomata BLACK. Kun neniu kvanto de ruĝa, verda, aŭ blua, la rezultanta koloro estas tute nigra. La koloro nigra estas la foresto de iu ajn koloro.
On line 13, ni uzas la opo (255, 255, 255) por maksimuma kvanto de ruĝa, verda, kaj blua por rezultigi blanka. La koloro blanka estas la plena kombino de ruĝa, verda, kaj blua. Ni stokas tiun opo en la WHITE variablo. La opo (255, 0, 0) reprezentas la maksimuman kvanton de ruĝaj sed neniu kvanto de verdo kaj bluo, do la rezultanta koloro estas ruĝa. Simile, (0, 255, 0) estas verda kaj (0, 0, 255) estas blua.
Tiuj variablo nomoj estas en la tuta ĉefurboj ĉar ili estas konstantaj variabloj. Estas nur pli facile tajpi BLACK en nia kodo ol (0, 0, 0) ĉiufoje ni volas specifi la koloro nigra, do ni starigu ĉi tiujn koloro variabloj en la komenco de nia programo.
Se vi volas fari koloro fajrilo, provu aldoni egala kvanto de cxiuj tri valoroj. Ekzemple, la RGB valoro por griza estas (128, 128, 128). Vi povas ricevi la RGB valoro por pli malpeza griza aldonante 20 al ĉiu valoro por akiri (148, 148, 148). Vi povas ricevi la RGB valoro por pli malluma griza per subtrahanta 20 de ĉiu valoro al preni (108, 108, 108). Kaj vi povas ricevi la RGB valoro por iomete pli ruĝa griza aldonante 20 al nur la ruĝa valoro por akiri (148, 128, 128). Tabelo 17-1 havas iujn komunajn koloroj kaj iliaj RGB valoroj.

Tiparoj, kaj la pygame.font.SysFont () Funkcio

  1. # Starigis tiparoj
  2. basicFont = pygame.font.SysFont (None, 48)

Figuro 17-3: Ekzemploj de malsamaj fontoj.
Al tiparo estas kompleta aro de literoj, nombroj, simboloj kaj signoj desegnita en sola stilo. Figuro 17-3 estas ekzemplo de la sama frazo presita en malsamaj tiparoj.
En nia pli frua ludoj, ni nur diris Python por presi tekston. La koloro, grandeco, kaj tiparon kiu estis uzata por montri ĉi teksto estis plene difinita per nenial tiparon via operaciumo uzas por konzolo fenestroj. Niaj programoj ne povis ŝanĝi la tiparon ajn. Tamen, ekde ni estos desegni ekster leterojn al la GUI fenestro necesas diri Pygame precize kion FONT uzi kiam desegnaĵo la tekston.
On line 19 ni krei pygame.font.Font objekto (kiu ni ĵus nomis Font celoj por mallonga) por nomi la pygame.font.SysFont () funkcio. La unua parametro estas la nomo de la tiparo, sed ni pasos la Neniu valoro por uzi la defaŭltan sistemo tiparon. La dua parametro estos la grandecon de la tiparo (kiu estas mezurata en unuoj nomitaj punktoj). En nia alvoko on line 19, ni volas la tiparon grandeco esti 48 punktoj.

La render () Metodo por Font Celoj

  1. # Starigis la teksto
  2. teksto = basicFont.render ('Saluton mondo!', vere, blankaj, bluaj)
  3. textRect = text.get_rect ()

Figuro 17-4: An aliased linio kaj anti-aliased linio.
La Font objekto kiun ni gardas en la basicFont variablo havas metodo nomata render (). Ĉi tiu metodo kreos Surfaca objekto kun la teksto desegnita sur ĝi. La unua parametro por kapitulacigi () estas la kordoj de la teksto, por cxerpi. La dua parametro estas Bulea por ĉu ni volas anti-aliasing. Anti-aliasing estas tekniko por fari desegnon aspektas malpli blocky. On line 22, ni pasas Vera diri ni volas uzi glatigo. Figuro 17-4 estas ekzemplo de tio kion linio (kiam ni vastigos la individuo rastrumeroj) aspektas kiel kun kaj sen anti-aliasing.
Anti-aliasing povas fari vian tekston kaj linioj aspektas neklara sed milda. Ĝi prenas iom pli kalkulada tempo por fari anti-aliasing, do kvankam la grafiko eble aspektas pli bona, via programo povas kuri pli malrapida (sed nur iomete).

Atributoj

  1. textRect.centerx = windowSurface.get_rect (). centerx
  2. textRect.centery = windowSurface.get_rect (). centery
La pygame.Rect datumtipo (kiu ni ĵus nomis Rect por mallonga) faras laborante kun ortangulo-forma aĵoj facila. Por krei novan Rect objekto voki la funkcion pygame.Rect (). La parametroj estas entjeroj por la XY koordinatoj de la supro maldekstro angulo, sekvita de la larĝeco kaj alteco. Tiuj entjeroj priskribi la grandeco en nombro de rastrumeroj.
La funkcio nomon kun la parametroj aspektas tiel: pygame.Rect (maldekstre, supre, larĝo, alto)
Samkiel metodoj estas funkcioj kiuj estas asociita kun celo, atributoj estas variabloj kiuj asocias kun objekto. La Rect datumtipo (tiu estas, la datumtipo de ĉiu Rect celoj) havas multajn atributojn kiuj priskribas la rektangulo ili reprezentas. Jen listo de atributoj de Rect objekto nomata myRect:
pygame.Rect Atributo Priskribo
myRect.left La int valoro de la X-koordinato de la maldekstra flanko de la rektangulo.
myRect.right La int valoro de la X-koordinato de la dekstra flanko de la rektangulo.
myRect.top La int valoro de la Y-koordinato de la supro flanko de la rektangulo.
myRect.bottom La int valoro de la Y-koordinato de la fundo flanko de la rektangulo.

myRect.centerx La int valoro de la X-koordinato de la centro de la ortangulo.
myRect.centery La int valoro de la Y-koordinato de la centro de la ortangulo.

myRect.width La int valoro de la larĝeco de la ortangulo.
myRect.height La int valoro de la alteco de la rektangulo.
myRect.size Al opo de du ints: (larĝa, alteco)

myRect.topleft Al opo de du ints: (maldekstre supre)
myRect.topright Al opo de du ints: (dekstre supre)
myRect.bottomleft Al opo de du ints: (maldekstre, malsupre)
myRect.bottomright Al opo de du ints: (dekstre sube)

myRect.midleft Al opo de du ints: (maldekstre, centery)
myRect.midright Al opo de du ints: (dekstre, centery)
myRect.midtop Al opo de du ints: (centerx, maksimuma)
myRect.midbottom Al opo de du ints: (centerx, malsupro)
La granda afero pri Rect celoj estas ke se vi modifas iun el tiuj variabloj, ĉiuj aliaj variabloj aŭtomate modifi sin tiel. Ekzemple, se vi krei Rect celo kiu estas 20 rastrumeroj larĝa kaj 20 rastrumeroj altaj, kaj havas la supro maldekstra angulo ĉe la koordinatoj (30, 40), tiam la X-koordinato de la dekstra flanko aŭtomate enkadrigeblajn por 50 ( ĉar 20 + 30 = 50). Tamen, se vi ŝanĝu la maldekstra atributo kun la linio myRect.left = 100, tiam Pygame aŭtomate ŝanĝas la rajton atributo al 120 (ĉar 20 + 100 = 120). Ĉiu alia atributo por tiu Rect objekto ankaŭ estos ĝisdatigita ankaŭ.

La get_rect () Manieroj por pygame.font.Font kaj pygame.Surface Celoj

Rimarku ke ambaŭ la Font objekto (stokita en la teksto variablo) kaj la Surfaca objekto (stokita en windowSurface variablo) ambaŭ havas metodon nomis get_rect (). Teknike, tiuj estas du malsamaj manieroj. Sed la programistoj de Pygame donis al ili la saman nomon ĉar ili ambaŭ faros la samon kaj reveni Rect celoj kiuj reprezentas la grandeco kaj pozicio de la FontSurfaca objekto.
Ankaŭ, memoru, ke pygame estas modulo kiu ni importi, kaj interne de la pygame modulo estas la tiparo kaj surfaco moduloj. Ene tiuj moduloj estas la Font kaj Surfaca datumtipoj. La Pygame programistoj faris la moduloj komenci kun minuskla litero, kaj la datumtipoj komenci kun majuskla litero. Ĉi faciligante distingi la datumtipoj kaj la moduloj ke la datumtipoj povas trovi in

Konstruilo Funkcioj kaj la tipo () funkcio.

Ni kreos pygame.Rect objekto nomante funkcio nomata pygame.Rect (). La pygame.Rect () funkcio havas la saman nomon kiel la pygame.Rect datumtipo. Funkcioj kiuj havas la saman nomon kiel ilia datumtipo kaj krei celoj aŭ valoroj de ĉi datumtipo estas nomitaj konstruilo funkcioj.
Vi povas ĉiam trovi kion la propra nomo de valoro de datumtipo kun la tipo () funkcio. Ekzemple, provu tajpi la sekva en la interaga konko:
>>> Tipo ('Ĉi tiu estas ĉeno')
<type'str'>
>>> Tipo (5)
<type'int'>
>>> Spamado = 'Alia ĉeno'
>>> Tipo (spamado)
<type'str'>
>>> Importado pygame
>>> Pygame.init ()
>>> MyRect = pygame.Rect (10, 10, 40, 50)
>>> Tipo (myRect)
<type'pygame.Rect'>
>>> Pygame.quit ()
(Vi devas alvoki pygame.quit () funkcio kiam vi finis kun tajpi Pygame funkcioj en la interaga ŝelo. Alie vi kaŭzos Python por frakasi.) Avizo, ke la reveno valoro de la tipo () funkcio estas ne ĉenon, sed valoro de datumtipo nomata "tipo"! Provu tajpi ĉi tiu enen la interaga konko:
>>> Tipo (tipo ('Ĉi tiu estas ĉeno'))
<type'type'>
Plejparte, vi ne bezonas scii pri datumtipoj kaj la tipo () funkcio kiam programado ludoj. Sed povas esti tre utila se vi bezonas elŝeligi la datumtipo de la valoro stokita en variablo en via programo.

La plenigo () Metodo por Surfaca Celoj

  1. # Desegni la blanka fono sur la surfaco
  2. windowSurface.fill (WHITE)
Tio estas la unua desegno funkcio alvokon en nia programo. Ni volas plenigi la tutan surfacon stokitaj en windowSurface kun la koloro blanka. La plenigu () funkcio estos tute kovras la tutan surfacon kun la koloro ni pasas kiel la parametro. (En ĉi tiu kazo, ni pasas WHITE fari la fono blanka.)
Grava afero scii pri Pygame estas ke la fenestro sur la ekrano ne ŝanĝos kiam ni nomas la plenigo () metodo aŭ ajnaj aliaj desegno funkcioj. Tiuj eltiros la Surfaca objekto, sed la Surfaca objekto ne estos desegnita sur la uzanto ekrano ĝis la pygame.display.update () funkcio estas nomita. Ĉi tiu estas ĉar desegnon sur la Surfaca objekto (kiu estas stokitaj en la komputilo la memoro) estas multe pli rapida ol desegno al la komputila ekrano. Ĝi estas multe pli kompetenta por desegni sur la ekrano unufoje kaj nur post ĉiu el niaj desegnante funkcioj por desegni al la surfaco.

La pygame.draw.polygon () Funkcio

  1. # Desegni verda plurlatero sur la surfaco
  2. pygame.draw.polygon (windowSurface, VERDA, ((146, 0), (291, 106), (236, 277), (56, 277), (0, 106)))
Al plurlatero estas ajna multisided formon kun flankoj kiuj estas nur rektoj. La pygame.draw.polygon () funkcio povas desegni ajna formo por ke vi donu ĝin kaj plenigi la internon spaco de la poligono. La opo de opoj pasas ĝi reprezentas la XY koordinatoj de la punktoj por desegni en ordo. La lasta opo aŭtomate konektiĝi al la unua opo por kompletigi la formon.

Figuro 17-5: Ekzemploj de Pluranguloj.
Plurlateroj nur devas rektoj por flankoj (cirkloj kaj elipsoj ne estas plurlateroj). Figuro 17-5 havas iujn ekzemplojn de plurlateroj.

La pygame.draw.line () Funkcio

  1. # Desegni iujn blua linioj sur la surfaco
  2. pygame.draw.line (windowSurface, BLUA, (60, 60), (120, 60), 4)
  3. pygame.draw.line (windowSurface, BLUA, (120, 60), (60, 120))
  4. pygame.draw.line (windowSurface, BLUA, (60, 120), (120, 120), 4)
La pygame.draw.line () funkcio eltiros linion sur Surfaca celo kiun vi provizis. Rimarku ke la lasta parametro, la larĝeco de la linio, estas laŭvola. Se vi pasas 4 por la larĝa, la linio estos kvar rastrumeroj dika. Se vi ne specifi la larĝa parametro, ĝi prenos en la defaŭlta valoro de 1.

La pygame.draw.circle () Funkcio

  1. # Desegni blua cirklo sur la surfaco
  2. pygame.draw.circle (windowSurface, BLUA, (300, 50), 20, 0)
La pygame.draw.circle () funkcio eltiros cirklo sur la Surfaca objekto vi provizis. La tria parametro estas por la X kaj Y koordinatoj de la centro de la cirklo kiel opo de du ints. La kvara parametro estas int por la radiuso (tio estas, grandeco) de la cirklo en rastrumeroj. Al larĝa de 0 signifas ke la rondo estos plena in

La pygame.draw.ellipse () Funkcio

  1. # Desegni ruĝa elipso al la surfacon
  2. pygame.draw.ellipse (windowSurface, RED, (300, 250, 40, 80), 1)
La pygame.draw.ellipse () funkcio eltiros elipso. Ĝi estas simila al la pygame.draw.circle () funkcio, escepte ke anstataŭ specifante la centro de la cirklo, opo de kvar ints estas pasita por la maldekstra, supro, larĝo, kaj alto de la elipso.

La pygame.draw.rect () Funkcio

  1. # Desegni la teksto de fono rektangulo sur la surfaco
  2. pygame.draw.rect (windowSurface, RED, (textRect.left - 20, textRect.top - 20, textRect.width + 40, textRect.height + 40))
La pygame.draw.rect () funkcio eltiros rektangulo. La tria parametro estas opo de kvar ints por la maldekstra, supro, larĝo, kaj alto de la rektangulo. Anstataŭ opo de kvar ints por tria parametro, vi ankaŭ povas pasi Rect objekto. En linio 45, ni volas la rektangulo ni desegni esti 20 rastrumeroj ĉirkaŭ ĉiuj flankoj de la teksto. Jen kial ni volas la strekita rektangulo estas maldekstra kaj supro esti la maldekstra kaj supro de textRect minus 20. (Memoru, ni subtrahi ĉar koordinatoj malgrandiĝi kiel vi iros maldekstren kaj supren.) Kaj la larĝo kaj alto estos egala al la largxeco kaj alteco de la textRect plus 40 (ĉar la maldekstra kaj supro estis revenis 20 rastrumeroj, do ni bezonas kompensi tiun spacon).

La pygame.PixelArray Datumtipo

  1. # Akiri rastrumeroj tabelo de la surfaco
  2. pixArray = pygame.PixelArray (windowSurface)
  3. pixArray [480] [380] = BLACK
On line 48 ni krei pygame.PixelArray objekto (kiu ni ĵus nomas PixelArray objekto por mallonga). La PixelArray objekto estas listo de listoj de koloro opoj kiu reprezentas la Surfaca objekto vi pasis. Ni pasis windowSurface celo kiam ni nomas la PixelArray () konstruilo funkcio sur linio 48, do atribui BLACK al pixArray [480] [380] ŝanĝos la pixel ĉe la koordinatoj (480, 380) esti nigra bildero. Pygame aŭtomate modifi la windowSurface objekto kun ĉi tiu ŝanĝo.
La unua indico en la PixelArray objekto estas por la X-koordinato. La dua indico estas por la Y-koordinato. PixelArray celoj fari simpla aro individuaj rastrumeroj sur PixelArray objekto al specifa koloro.
  1. del pixArray
Kreante PixelArray objekto de Surfaca objekto ŝlosi ke Surfaca objekto. Ŝlosita signifas ke neniu blit () funkcio alvokoj (priskribita proksima) povas esti farita en tiu Surfaca objekto. Malŝlosi la Surfaca objekto, vi devas forigi la PixelArray objekto kun la del operatoro. Se vi forgesos forigi la Surfaca objekto, vi ricevos erarmesagxon, ke diras pygame.error: Surfacoj devas ne esti ŝlosita dum blit.

La blit () Metodo por Surfaca Celoj

  1. # Desegni la teksto sur la surfaco
  2. windowSurface.blit (teksto, textRect)
La blit () metodo eltiros la enhavon de unu Surfaca objekto al alia Surfaca objekto. Linio 54 eltiros la "Saluton mondo!" teksto (kiu estis desegnita sur la Surfaca objekto stokita en la teksto variablo) kaj altiras al la Surfaca objekto stokitaj en la windowSurface variablo.
Memoru ke la teksto objekto havis la "Saluton mondo!" teksto desegnita sur ĝin sur linio 22 de la render () metodo. Surfaca objektoj estas ĝuste stokitaj en la komputilo memoro (kiel ajna alia variablo) kaj ne desegnita sur la ekrano. La Surfaca objekto en windowSurface estas desegnita sur la ekrano kiam ni nomas la pygame.display.update () funkcio sur linio 56 ĉar ĉi tiu estis la Surfaca objekto kreita de la pygame.display. Set_mode () funkcio. Aliaj Surfaca celoj ne estas desegnita sur la ekrano.
La dua parametro al blit () specifas kie sur la windowSurface surfaco la teksto surfaco estu desegnita. Ni simple pasigi la Rect objekto ni ricevis de voko text.get_rect () (kiu estis stokitaj en textRect on line 23).

La pygame.display.update () Funkcio

  1. # Desegni la fenestro sur la ekrano
  2. pygame.display.update ()
En Pygame, nenio estas desegnita por la ekrano ĝis la pygame.display.update () funkcio estas nomita. Ĉi tiu estas farita pro desegno al la ekrano estas malrapida operacio por la komputilo kompare al desegni sur la Surfaca celoj dum ili estas en memoro. Vi ne volas desegni al la ekrano post ĉiu desegno funkcio estas nomita, sed nur desegni la ekrano fojon post tuta desegnante funkcioj estis nomata.
Vi bezonos nomi pygame.display.update () ĉiufoje vi volas ĝisdatigi la ekrano por montri la enhavon de la Surfaca objekto revenis por pygame.display.set_mode (). (En ĉi tiu programo, tiu celo estas stokita en windowSurface.) Tio fariĝis pli gravaj en nia venonta programo kiun kovras kuraĝigo.

Okazaĵoj kaj la Game Cirkla

En nia antaŭa ludoj, ĉiuj la programoj presi ĉio tuj ĝis ili atingas enigo () funkcio nomita. Je tiu punkto, la programo haltas kaj atendas la uzanto tajpas ion en kaj premas Ret. Pygame programoj ne funkcias tiel. Anstataŭe, Pygame programoj estas senĉese kuras tra buklo nomis la ludo buklo. (En ĉi tiu programo, ni ekzekuti ĉiuj linioj de kodo en la ludo buklo ĉirkaŭ cent fojojn dua.)
La ludo ciklo estas ciklo kiu senĉese kontrolas por novaj okazaĵoj, ĝisdatigas la stato de la fenestro, kaj tiras la fenestro sur la ekrano. Eventoj estas objektoj de la pygame.event.Event datumtipo ke estas generitaj de Pygame ĉiufoje kiam la uzanto premas klavo, klakoj aŭ movas la muson, aŭ faras iu alia evento okazas. Voko pygame.event.get () rekuperas neniun novan pygame.event.Event celojn kiuj estis generita de la lasta alvoko por pygame.event.get ().
  1. # Ruli la ludon buklo
  2. dum Vera:
Ĉi tiu estas la komenco de nia ludo buklo. La kondiĉo por la dum deklaro estas agordita por Vera kaj ni buklo ĉiam. La sola fojo ni eliras la buklo estas se okazaĵo kaŭzas la programo por fini.

La pygame.event.get () Funkcio

  1. por evento en pygame.event.get ():
  2. se event.type == QUIT:
La pygame.event.get () funkcio redonas liston de pygame.event.Event celoj. Ĉi tiu listo havas ĉiu unuopa kazo kiu okazis ekde la lasta fojo pygame.event.get () nomiĝis. Ĉiuj pygame.event.Event celoj havas atributon nomata tipo kiu diri al ni kion tipo de okazaĵo estas. (Listo de okazaĵo tipoj estas donita en la sekva ĉapitro. En ĉi tiu ĉapitro ni nur pritrakti la quit okazaĵo.)
Pygame venas provizita per lia propra konstanta variabloj en la pygame.locals modulo. Memoru ke ni importis la pygame.locals modulo kun la linio de pygame.locals importado *, kio signifas ke ni ne devas tajpi pygame.locals antaŭ la variabloj kaj funkcioj en tiu modulo.
On line 60 ni starigis por buklo por kontroli ĉiun pygame.event.Event objekto en la liston revenis por pygame.event.get (). Se la tipo atributo de la evento estas egala al la valoro de la konstanta variablo quit (kiu estas provizita per la pygame.locals modulo), tiam ni scias ke la uzanto fermis la fenestron kaj volas nuligi la programo.
Pygame generas la quit evento kiam la uzanto klakas sur la X butonon supre dekstre de la programo fenestro. Ĝi estas ankaŭ generita se la komputilo estas fermanta suben kaj provas eksigi ĉiujn programojn kurante. Por ajna kialo la quit okazaĵo estis generita, ni scias, ke ni kuris ajna kodo kiu ni volas okazi halti la programon. Vi povus elekti ignori la quit okazaĵo tute, sed kiu povas kaŭzi la programo devas konfuzi kun la uzanto.

La pygame.quit () Funkcio

  1. pygame.quit ()
  2. sys.exit ()
Se la QUIT okazaĵo estis generita, tiam ni povas scii, ke la uzulo provis fermi la fenestron. En tiu kazo, ni devus voki la eliro funkcioj por ambaŭ Pygame (pygame.quit ()) kaj Python (sys.exit ()).
Tiu estis la simpla "Saluton mondo!" programo de Pygame. Ni kovris multajn novajn temojn, ke ni ne devas trakti en nia antaŭa ludoj. Kvankam ili estas pli komplika, la Pygame programoj povas ankaŭ esti multe pli amuza kaj engaĝi ol nia antaŭa teksto ludoj. Ni lernos kiel krei ludoj kun vigla grafiko kiu movas.

Kuraĝigo

En ĉi tiu programo ni havas pluraj malsamaj blokoj _bouncing_ for de la randoj de la fenestro. La blokoj estas malsamaj koloroj kaj grandecoj kaj movi nur en diagonala direktoj. Por animi la blokoj (tio estas, fari ilin rigardi kiel ili movas) ni movos la blokoj kelkajn rastrumeroj super sur ĉiu ripeto tra la ludo buklo.

Por desegni novaj blokoj kiuj lokas iomete malsame tiam la blokoj antaŭe, ni povas fari ĝin rigardas kiel la blokoj movas ĉirkaŭ la ekrano.La Kuraĝigo Programo de Fonta Kodo
Tajpu la sekva programo en la dosiero redaktoro kaj konservi ĝin kiel animation.py. Vi povas ankaŭ elŝuti ĉi fontkodo de http://inventwithpython.com/chapter17.animation.pyTiu kodo estas elŝutebla el http://inventwithpython.com/animation.pySe vidis ricevas erarojn post Tajpi tiun kodon en, kompari gin al la libro Kodo with la linio malsamoj ilo eo http://inventwithpython.com/diff AU retpoŝtu la aŭtoro eo al@inventwithpython.com

    
importado pygame, sys, tempo
    
el pygame.locals importado *
    
# Starigis pygame
    
pygame.init ()
    
# Starigis la fenestro
    
WINDOWWIDTH = 400
    
WINDOWHEIGHT = 400
    
windowSurface = pygame.display.set_mode ((WINDOWWIDTH, WINDOWHEIGHT), 0, 32)
    
pygame.display.set_caption ('Animation')
    
# Starigis direkto variabloj
    
DOWNLEFT = 1
    
DOWNRIGHT = 3
    
UPLEFT = 7
    
Piuloj = 9
    
MOVESPEED = 4
    
# Starigis la koloroj
    
NIGRA = (0, 0, 0)
    
RED = (255, 0, 0)
    
VERDA = (0, 255, 0)
    
BLUA = (0, 0, 255)
    
# Starigis la bloko datumstrukturo
    
b1 = {'rect': pygame.Rect (300, 80, 50, 100), 'koloro': RUĜAJ, 'dir': virtuloj}
    
b2 = {'rect': pygame.Rect (200, 200, 20, 20), 'koloro': VERDA, 'dir': UPLEFT}
    
b3 = {'rect': pygame.Rect (100, 150, 60, 60), 'koloro': BLUAJ, 'dir': DOWNLEFT}
    
blokoj = [b1, b2, b3]
    
# Ruli la ludon buklo
    
Dum Bordo:
    
# Kontroli por la quit okazaĵo
    
por evento en pygame.event.get ():
    
se event.type == QUIT:
    
pygame.quit ()
    
sys.exit ()
    
# Desegni la nigra fono sur la surfaco
    
windowSurface.fill (BLACK)
    
por b en blokoj:
    
# Movi la bloko datumstrukturo
    
se b ['dir'] == DOWNLEFT:
    
b ['rect']. maldekstra - = MOVESPEED
    
b ['rect']. supro + = MOVESPEED
    
se b ['dir'] == DOWNRIGHT:
    
b ['rect']. maldekstra + = MOVESPEED
    
b ['rect']. supro + = MOVESPEED
    
se b ['dir'] == UPLEFT:
    
b ['rect']. maldekstra - = MOVESPEED
    
b ['rect']. supro - = MOVESPEED
    
se b ['dir'] == virtuloj:
    
b ['rect']. maldekstra + = MOVESPEED
    
b ['rect']. supro - = MOVESPEED
    
# Kontrolu se la bloko movi tra la fenestro
    
se b ['rect']. supro <0:
    
# Bloko movis preter la supro
    
se b ['dir'] == UPLEFT:
    
b ['dir'] = DOWNLEFT
    
se b ['dir'] == virtuloj:
    
b ['dir'] = DOWNRIGHT
    
se b ['rect']. fundo> WINDOWHEIGHT:
    
# Bloko movis preter la malsupro
    
se b ['dir'] == DOWNLEFT:
    
b ['dir'] = UPLEFT
    
se b ['dir'] == DOWNRIGHT:
    
b ['dir'] = honesta
    
se b ['rect']. lasis <0:
    
# Bloko movis preter la maldekstra flanko
    
se b ['dir'] == DOWNLEFT:
    
b ['dir'] = DOWNRIGHT
    
se b ['dir'] == UPLEFT:
    
b ['dir'] = honesta
    
se b ['rect']. dekstra> WINDOWWIDTH:
    
# Bloko movis preter la dekstra flanko
    
se b ['dir'] == DOWNRIGHT:
    
b ['dir'] = DOWNLEFT
    
se b ['dir'] == virtuloj:
    
b ['dir'] = UPLEFT
    
# Desegni la bloko sur la surfaco
    
pygame.draw.rect (windowSurface, b ['koloro'], b ['rect'])
    
# Desegni la fenestro sur la ekrano
    
pygame.display.update ()
    
time.sleep (0,02)

Figuro 17-6: La Kuraĝigo programo.Kiel la Animation Programo Verkoj
En ĉi tiu programo, ni havos tri buntaj blokoj movi sin kaj _bouncing_ for la muroj. Por fari tion, ni bezonas unue konsideri ĝuste kiel ni volas ke la blokoj movi.Movante kaj Bouncing la blokoj
Ĉiu bloko movos en unu el kvar diagonalo direktoj: malsupren kaj maldekstren, sube kaj dekstre supre kaj maldekstre, aŭ tien kaj dekstre. Kiam la pomo batas la flanko de la fenestro, ni volas ke ĝi "rebotar" de la muro kaj movi en nova diagonala direkto. La blokoj estos rebotar kiel montrita en ĉi bildon:
La nova direkto, ke bloko movas post resalto dependas de du aferoj: kiu direkto ĝi movas antaŭ la resalto kaj kiuj muro rebotó for de. Estas tuta de ok eblaj manieroj bloko povas rebotar: du malsamaj manieroj por ĉiu el la kvar muroj. Ekzemple, se bloko movas sin kaj rajto, kaj poste saltas for de la fundo rando de la fenestro, ni volas la bloko nova direkto esti supre kaj dekstre.
Ni povas reprezenti la blokoj kun Rect objekto por reprezenti la pozicio kaj grandeco de la bloko, opo de tri ints por reprezenti la koloro de la bloko, kaj entjero por reprezenti kiu el la kvar direktoj diagonalo la bloko estas nun moviĝas. Sur ĉiu ripeto en la ludo buklo, ni ĝustigos la X kaj Y pozicio de la bloko en la Rect objekto. Ankaŭ en ĉiu ripeto trenos ĉiuj blokoj en la ekrano de sia nuna pozicio. Kiel la programo ekzekuto cikloj tra la ludo ciklo, la blokoj estos laŭgrade movas trans la ekrano tiel ke ĝi aspektas kiel ili glate movante kaj _bouncing_ ĉirkaŭ sur ilia propra.

Figuro 17-7: La diagramo de kiel blokoj estos rebotar.Kreado kaj Lancxi vian Pygame kaj la Ĉefa Fenestro

    
importado pygame, sys, tempo
En ĉi tiu programo, ni ankaŭ volas importi la tempo modulo.

    
# Starigis la fenestro
    
WINDOWWIDTH = 400
    
WINDOWHEIGHT = 400
    
windowSurface = pygame.display.set_mode ((WINDOWWIDTH, WINDOWHEIGHT), 0, 32)
En ĉi tiu programo la grandecon de la fenestro de larĝeco kaj alteco estas uzata por pli ol nur la alvoko al set_mode (). Ni uzos konstanta variabloj por fari la programon pli legebla. Memoru, legibilidad estas por la bono de la programisto, ne la komputilon. Se ni iam volas ŝanĝi la grandecon de la fenestro, ni nur devas ŝanĝi linioj 8 kaj 9.
Se ni ne uzas la konstanta variablo, ni devus ŝanĝi iam occurance de la int valoron 400. Se iu nerilata valorojn en la programo nur hazarde ankaŭ esti 400, ni povus pensi ke estis por la larĝa aŭ alteco kaj ankaŭ hazarde ŝanĝi ĝin. Ĉi metus cimon en nia programo. Ekde la fenestro largxeco kaj alteco neniam ŝanĝos dum la programo ekzekuto, konstanta variablo estas bona ideo.

    
pygame.display.set_caption ('Animation')
Por ĉi tiu programo, ni starigos apudskribo sur la supro de la fenestro por 'Animation' kun alvoko al pygame.display.set_caption ().

    
Lancxi vian Konstanta Variabloj por Direkto
    
# Starigis direkto variabloj
    
DOWNLEFT = 1
    
DOWNRIGHT = 3
    
UPLEFT = 7
    
Piuloj = 9
Ni uzos la klavoj sur la nombro pad de la klavaro por memorigi al ni kiu apartenas al kiu direkto. Ĉi tiu estos similaj al nia Tic Tac Toe ludo. 1 estas malsupren kaj restis, 3 estas malsupren kaj juste, 7 estas supren kaj maldekstra, kaj 9 estas supren kaj dekstren. Tamen, povas esti malfacile memori tion, tial anstataŭ ni uzos konstanta variabloj anstataŭ tiuj entjero valoroj.
Ni povus uzi ajnan valoroj ni volis por tiuj direktoj anstataŭ uzi konstanta variablo, tiom longe kiom ni havis malsamajn valorojn por ĉiu direkto. Ekzemple, ni povus uzi la ĉeno 'downleft' por reprezenti la malsupren kaj maldekstren diagonala direkto. Tamen, se ni iam mistype la 'downleft' string (ekzemple, kiel 'fownleft'), la komputilo ne rekonas ke ni intencis tajpi 'downleft' anstataŭ 'downleft'. Ĉi cimo kaŭzus nian programon konduti strange.
Sed se ni uzas konstantan variabloj, kaj hazarde tajpi la variablo nomo FOWNLEFT anstataŭ la nomo DOWNLEFT, Python estus rimarki, ke ne estas tia variablo nomata FOWNLEFT kaj frakasi la programo kun eraro. Ĉi tio ankoraŭ estos sufiĉe malbone cimo, sed almenaŭ ni scius tuj pri tio kaj povus ripari ĝin. Alie povas esti malfacile rimarki ke estas cimo ajn.

    
MOVESPEED = 4
Ni uzos konstanta variablo por determini kiel rapide la blokoj devus movi. Valoro de 4 tie signifas, ke ĉiu bloko movos 4 rastrumeroj sur ĉiu ripeto tra la ludo buklo.Lancxi vian Konstanta Variabloj por Koloro

    
# Starigis la koloroj
    
NIGRA = (0, 0, 0)
    
RED = (255, 0, 0)
    
VERDA = (0, 255, 0)
    
BLUA = (0, 0, 255)
Ni starigis konstantan variabloj por la koloroj ni uzos. Memoru, Pygame uzas opo de tri int valoroj por la kvantoj de ruĝa, verda, kaj blua nomiĝas RGB valoro. La entjeroj estas de 0 al 255. Kontraste nia "Saluton Mondo" programo, ĉi tiu programo ne uzas la blanka koloro, do ni lasis ĝin.
Denove, la uzo de konstanta variabloj estas por legibilidad. La komputilo ne zorgas se ni uzas variablon nomata VERDA por la koloro verda. Sed se ni poste rigardi tiun programon, estas pli facile scii ke VERDA staras por la koloro verda loko de fasko de int valoroj en opo.Lancxi vian La Bloko Datumoj Strukturoj

    
# Starigis la bloko datumstrukturo
    
b1 = {'rect': pygame.Rect (300, 80, 50, 100), 'koloro': RUĜAJ, 'dir': virtuloj}
Ni starigos vortaro esti la datumstrukturo kiu reprezentas ĉiu bloko. (Vortaroj enkondukis al la fino de la Pendumito ĉapitro.) La vortaro havos la ŝlosilojn de 'rect' (kun Rect objekto di valoro), 'koloro' (kun opo de tri ints por valoro), kaj ' dir '(kun unu el niaj direkto konstanta variabloj por valoro).
Ni stoki unu el tiuj datumstrukturoj en variablo nomata b1. Ĉi tiu bloko havos lian supre maldekstre angulo lokita ĉe X-koordinato de 300 kaj Y-koordinato de 80. Ĝi havos larĝo de 50 bilderoj kaj alto de 100 bilderoj. Lia koloro estos ruĝaj (do ni uzu nian RED konstanta variablo, kiu havas la opo (255, 0, 0) stokitaj en ĝi). Kaj lia direkto estos metita al virtuloj.

    
b2 = {'rect': pygame.Rect (200, 200, 20, 20), 'koloro': VERDA, 'dir': UPLEFT}
    
b3 = {'rect': pygame.Rect (100, 150, 60, 60), 'koloro': BLUAJ, 'dir': DOWNLEFT}
Jen ni kreas du pli simila datumstrukturoj por blokoj kiu estos malsamaj grandecoj, pozicioj, koloroj, kaj direktoj.

    
blokoj = [b1, b2, b3]
On line 31 ni metas ĉiujn tiujn datumstrukturoj en lerta kaj stoki la listo en variablo nomata blokoj.
blokoj estas listo. blokoj [0] estus la vortaro datumstrukturo en b1. blokoj [0] ['koloro'] estus la 'koloro' klavo en b1 (kiu ni stokis la valoron en RED en), do la esprimo blokoj [0] ['koloro'] estus taksi al (255, 0, 0 ). Tiamaniere ni povas raporti al iu el la valoroj en iu el la bloko datumstrukturoj per startanta kun blokoj.Kurante la Ludo Cirkla

    
# Ruli la ludon buklo
    
Dum Bordo:
Ene de la ludo buklo, ni volas movi ĉiujn blokojn ĉirkaŭ la ekrano en la direkto kiu iras, tiam rebotar la bloko se ili batis muron, tiam desegni ĉiuj blokoj de la windowSurface surfaco, kaj fine nomas pygame . display.update () por desegni la surfaco al la ekrano. Ankaŭ, ni nomos pygame.event.get () por kontroli se la QUIT okazaĵo estis generita de la uzanto fermi la fenestron.
La por buklo por kontroli ĉiuj la eventoj en la listo revenis por pygame.event.get () estas la sama kiel en nia "Saluton Mondo!" programo, tiel ke ni salti lian eksplikon, kaj iru al linio 44.

    
# Desegni la nigra fono sur la surfaco
    
windowSurface.fill (BLACK)
Antaŭ ol ni desegni iun el la blokoj de la windowSurface surfaco, ni volas plenigi la tutan surfacon kun nigraj por ke io ni antaŭe desegnis sur la surfaco estas kovrita. Iam ni havi nigra for la tutan surfacon, ni povas redibujar la blokoj kun la kodon.Movante Ĉiu Bloko

    
por b en blokoj:
Ni volas ĝisdatigi la pozicio de ĉiu bloko, do ni devas buklo tra la blokoj listo kaj realigi la saman kodon en ĉiu bloko estas datumstrukturo. Ene de la ciklo, ni rilatas al la nuna bloko kiel simple r tiel estos facila por tajpi.

    
# Movi la bloko datumstrukturo
    
se b ['dir'] == DOWNLEFT:
    
b ['rect']. maldekstra - = MOVESPEED
    
b ['rect']. supro + = MOVESPEED
    
se b ['dir'] == DOWNRIGHT:
    
b ['rect']. maldekstra + = MOVESPEED
    
b ['rect']. supro + = MOVESPEED
    
se b ['dir'] == UPLEFT:
    
b ['rect']. maldekstra - = MOVESPEED
    
b ['rect']. supro - = MOVESPEED
    
se b ['dir'] == virtuloj:
    
b ['rect']. maldekstra + = MOVESPEED
    
b ['rect']. supro - = MOVESPEED
La nova valoro kiun ni volas starigis la maldekstran kaj supro atribuas al dependas de la direkto la bloko estas movanta. Memoru ke la X-koordinatojn komencas je 0 sur la tre maldekstra rando de la fenestro, kaj plimultigos kiel vi iros dekstren. La Y-koordinatojn komencas je 0 sur la plejsupro de la fenestro, kaj pliigi kiel vi malsupreniru. Do se la direkto de la bloko (kiu, memoru, estas stokita en la 'dir' klavo) estas ĉu DOWNLEFT aŭ DOWNRIGHT, ni volas pliigi la supro atributo. Se la direkto estas UPLEFT aŭ rekte, ni volas malpliigi la supro atributo.
Se la direkton de la bloko estas DOWNRIGHT aŭ rekte, ni volas pliigi la maldekstra atributo. Se la direkto estas DOWNLEFT aŭ UPLEFT, ni volas malpliigi la maldekstra atributo.
Ni povis esti ankaŭ modifita dekstra anstataŭ la maldekstre atributo, aŭ la fundo atributo anstataŭ la supro atributo, ĉar Pygame ĝisdatigos la Rect objekto ajna maniero. Ajna formo, ni volas ŝanĝi la valoron de tiuj atributoj de la entjero stokitaj en MOVESPEED, kiu stokas kiom rastrumeroj super ni movos la bloko.Kontrolanta se la Block rebotó

    
# Kontrolu se la bloko movi tra la fenestro
    
se b ['rect']. supro <0:
    
# Bloko movis preter la supro
    
se b ['dir'] == UPLEFT:
    
b ['dir'] = DOWNLEFT
    
se b ['dir'] == virtuloj:
    
b ['dir'] = DOWNRIGHT
Post ni movis la bloko, ni volas kontroli, ĉu la pomo iris preter la rando de la fenestro. Se ĝi havas, ni volas "rebotar" la bloko, kiu en la kodo signifas establis novan valoron por la bloko de 'dir' klavo. Kiam la direkto estas metita, la bloko movos en la nova direkto en la sekvanta ripeto de la ludo buklo.
Ni bezonas kontroli ĉu la bloko movis pasis ĉiu el la kvar eĝoj de la fenestro. En la pli supre se aserto, ni decidas la bloko movis preter la supro eĝo de la fenestro, se la bloko de Rect objekto supro atributo estas malpli ol 0. Se jes, tiam ni devas ŝanĝi la direkton bazita sur kiu direkto la bloko estis moviĝas.Ŝanĝi la Direkto de la Bouncing Bloko
Rigardu la _bouncing_ diagramon antaŭe en tiu ĉi ĉapitro. Por movi preter la supro eĝo de la fenestro, la bloko devis ĉu esti movanta en la UPLEFT aŭ rekte direktoj. Se la bloko estis movanta en la UPLEFT direkto, la nova direkto (laŭ nia resalto diagramo) estos DOWNLEFT. Se la bloko estis movanta en virtuloj direkto, la nova direkto estos DOWNRIGHT.

    
se b ['rect']. fundo> WINDOWHEIGHT:
    
# Bloko movis preter la malsupro
    
se b ['dir'] == DOWNLEFT:
    
b ['dir'] = UPLEFT
    
se b ['dir'] == DOWNRIGHT:
    
b ['dir'] = honesta
Jen ni vidas ke la bloko movis preter la fundo rando de la fenestro por kontroli se la fundo atributo (ne la supro atributo) estas pli granda ol la valoro en WINDOWHEIGHT. Memoru ke la Y-koordinatojn komenco je 0 sur la supro de la fenestro kaj pliigos WINDOWHEIGHT ĉar ni pasis WINDOWHEIGHT kiel la alto en nia alvoko al pygame.display.set_mode ().
La resto de la kodo ŝanĝas la direkton bazita sur kio nia resalto diagramon diras.

    
se b ['rect']. lasis <0:
    
# Bloko movis preter la maldekstra flanko
    
se b ['dir'] == DOWNLEFT:
    
b ['dir'] = DOWNRIGHT
    
se b ['dir'] == UPLEFT:
    
b ['dir'] = honesta
Ĉi tio estas simila al la supra kodo, sed ĉekojn se la maldekstra flanko de la bloko movis al la maldekstra de la maldekstra rando de la fenestro. Memoru, la X-koordinatojn komencas je 0 sur la maldekstra rando de la fenestro kaj pliigos WINDOWWIDTH dekstre rando de la fenestro.

    
se b ['rect']. dekstra> WINDOWWIDTH:
    
# Bloko movis preter la dekstra flanko
    
se b ['dir'] == DOWNRIGHT:
    
b ['dir'] = DOWNLEFT
    
se b ['dir'] == virtuloj:
    
b ['dir'] = UPLEFT
Tiu kodo estas simila al la antaŭa pecoj de kodo, sed kontrolas se la bloko movis preter la plej dekstra rando de la fenestro.Desegno la blokoj de la Fenestro en Lia Nov Pozicioj

    
# Desegni la bloko sur la surfaco
    
pygame.draw.rect (windowSurface, b ['koloro'], b ['rect'])
Nun ke ni kopias la bloko (kaj starigis novan direkton se la bloko rebotó ekstere de la fenestro de randoj), ni volas desegni ĝin sur la windowSurface surfaco. Ni povas desegni ĉi uzanta la pygame.draw.rect () funkcio. Ni pasas windowSurface, ĉar tio estas la Surfaca objekto ni volas utiligi. Ni pasos la b ['koloro'] valoron, ĉar ĉi tiu estas la koloro ni volas uzi. Tiam ni pasas b ['rect'], ĉar tio Rect objekto havas la informon pri la pozicio kaj grandeco de la rektangulo ni volas desegni.
Ĉi tiu estas la lasta linio de la por buklo. Ni volas lanĉi la movanta, _bouncing_, kaj desegno kodo en ĉiu de la blokoj stokitaj en la blokoj listo, estas por ni buklo tra ĉiu el ili. Ankaŭ, se ni volis aldoni novajn blokoj aŭ forigi blokoj de nia programo, ni nur devas modifi la blokoj listo kaj la resto de la kodo ankoraŭ funkcias.Desegno La Fenestro sur la ekrano

    
# Desegni la fenestro sur la ekrano
    
pygame.display.update ()
    
time.sleep (0,02)
Post ni kuros ĉi kodo en ĉiu de la blokoj en la blokoj listo, ni volas fine nomas pygame.display.update () por ke la windowSurface surfaco estas desegni sur la ekrano. Post ĉi tiu linio, ni buklo reen al la komenco de la ludo loop kaj komenci la procezon ĉie denove. Tiamaniere, la blokoj estas konstante movis iom, _bouncing_ for la murojn, kaj estante desegnita sur la ekrano en liaj novaj pozicioj. Dume, ni ankaŭ kontroli se la QUIT okazaĵo estis generita per la Pygame biblioteko (kio okazas se la ludanto fermas la fenestro aŭ elŝaltas ilia komputilo). En tiu kazo ni finas la programon.
La alvoko al la time.sleep () funkcio estas tie ĉar la komputilo povas movi, rebotar, kaj desegni la blokoj tiel rapide, ke se la programo kuris al ĉiu rapido, ĉiuj blokoj estus nur aspektas kiel blur. (Provu komentante el la time.sleep (0.02) linio kaj kuri la programon por vidi tion.) Tiu alvoko al time.sleep () ĉesos la programo dum 20 milisekundoj. Ekzistas 1000 milisekundoj en dua, do 0,001 sekundojn egalas 1 milisegundo kaj 0,02 egalas 20 milisekundoj.Iuj Malgrandaj ModifojDesegno kiel eble plej rapide
Nur por amuzo, ni faru kelkajn malgrandajn modifojn al nia programo por ke ni povu vidi kion ĝi faras. Provu aldoni # fronte de linio 90 (la time.sleep (0.2) linio) de nia kuraĝigo programo. Tiu kaŭzos Python ignori tiun linion ĉar nun estas komento. Nun provu kurante la programo.
Sen la time.sleep () funkcio alvokon al intence prokrastas la programo, via komputilo kuros tra la ludo buklo tiel rapide kiel eble. Ĉi faros la rektanguloj rebotar ĉirkaŭ la ekrano tiel rapida, ili devos nur aspektas kiel blur. Nun vi povas vidi kial ĝi estas grava por ni malrapidigos programo kun ĉi tiu linio.Desegno Trails de blokoj
Forigi la # el la fronto de linio 90 por ke la linio ne plu estas komento, kaj iĝas parto de la programo denove. Ĉi-foje, komenti el linio 42 (la windowSurface.fill (BLACK) linio) por aldoni # ĉe la fronto de la linio. Nun funkcias la programo.
Sen la alvokon al windowSurface.fill (BLACK), ni ne nigra el la tuta fenestro antaux desegnaĵo la rektanguloj en lia nova pozicio. Tiu kaŭzos vojetoj de rektanguloj aperi sur la ekrano anstataŭ individuaj rektanguloj. La vojetoj aperas ĉar la tuta malnova rektanguloj ke estas desegnita en antaŭaj iteraciones tra la ludo buklo ne malaperas.
Memoru ke la blokoj ne estas vere moviĝas. Ni nur redrawing la tuta fenestro denove kaj denove. Sur ĉiu ripeto tra la ludo buklo, ni redibujar la tutan fenestron kun novaj blokoj kiuj lokas kelkaj rastrumeroj super ĉiu tempo. Kiam la programo kuras tre rapide, ni faras estas nur unu bloko ĉiufoje. Por vidi, ke ni nur redrawing la blokoj denove kaj denove, ŝanĝi linio 90 al time.sleep (1.0). Tio faras la programon (kaj la desegnon) kvindek fojojn pli malrapida ol normala. Vi vidos ĉiu desegno anstataŭitaj de la sekvanta desegnaĵo ĉiu dua.Resumo: Pygame Programado
Ĉi tiu ĉapitro estas prezentita tute nova maniero de krei komputilaj programoj. Niaj programoj antaux ĉesus kaj atendi la ludanto eniri tekston. Tamen, en nia kuraĝigo programo, ni konstante ĝisdatigi la datumstrukturoj de aĵoj ne atendante enigo de la ludanto. Memori en niaj Pendumito kaj Tic Tac Toe ludoj ni devis datumstrukturoj kiu reprezentus la staton de la tabulo, kaj ĉi tiuj datumstrukturoj estus pasinta al drawBoard () funkcio al esti montrita en la ekrano. Nia kuraĝigo programo estas tre similaj. La blokoj variablo tenis liston de datumstrukturoj reprezentas aferojn esti desegnita por la ekrano, kaj tiuj estas turnitaj al la ekrano interne de la ludo buklo.
Sed sen alvokoj al enigo (), kiel ni ricevi enigo de la ludanto? En nia sekva ĉapitro, ni kovros kiel nia programo povas scii kiam la ludanto premas ajna klavo de la klavaro. Ni ankaŭ lernas de koncepto nomata kolizio detekto, kiu estas uzata en multaj grafikaj komputilaj ludoj.
 

Nenhum comentário:

Postar um comentário