fonto: http://inventwithpython.com/chapter18.html
Temoj Kovritaj En tiu ĉapitro:
- Kolizio Detección
- Ne Modifu a Listo Dum ripetanta Over It
- Klavaro Eniro en Pygame
- Muso Eniro en Pygame
Poste en ĉi tiu ĉapitro, ni rigardu kiel nian Pygame programoj povas akcepti enigon el la uzanto tra la klavaro kaj la muso. Estas iom pli komplika ol nomi la enigo () funkcio kiel ni faris por nia teksto programoj. Sed uzante la klavaron estas multe pli interaga en GUI programoj, kaj uzante la muso estas eĉ ebla en nia teksto ludoj. Sciante tiujn du konceptojn faros niaj ludoj pli progresintaj kaj ekscita!
La Collision Detection Programo de Fonta Kodo
Granda parto de tiu kodo estas simila al la kuraĝigo programo, tiel ke ni salti super klarigante kiel fari la bouncer movado kaj rebotar ekstere de la muroj. (Vidu la kuraĝigo programo en la antaŭa ĉapitro por klarigo de tiu kodo.) Ni uzos listo de pygame.Rect objektoj por reprezenti la manĝo kvadratoj. Ĉiu pygame.Rect objekto en la listo reprezentas sola nutraĵo kvadrato. Sur ĉiu ripeto tra la ludo buklo, nia programo legos ĉiun pygame.Rect objekto en la liston kaj desegni verda kvadrato sur la fenestro. Ĉiu kvardek iteraciones tra la ludo buklo ni aldonos novajn pygame.Rect al la listo por ke la ekrano senĉese havas novajn manĝo kvadratoj en ĝi.La bouncer estas reprezentita de vortaro. La vortaro havas ŝlosilon nomita 'rect' (kies valoro estas pygame.Rect objekto) kaj ŝlosila nomita 'dir' (kies valoro estas unu el la konstanta direkto variabloj samkiel ni havis en lasta ĉapitro de Kuraĝigo programo). Kiel la bouncer rebota ĉirkaŭ la fenestro, ni kontrolu ĉu ĝi koliziis kun iu el la nutraĵo kvadratoj. Se jes, ni forviŝi ke nutraĵo kvadrata por ke ĝi ne plu esti desegnita sur la ekrano.
Tajpu la sekvan en nova dosiero kaj konservi ĝin kiel collisionDetection.py. Se vi ne volas tajpi ĉio ĉi kodon, vi povas elŝuti la fonto de la libro de afiŝinto ĉe http://inventwithpython.com/chapter18 .
collisionDetection.py
Tiu kodo estas elŝutebla el http://inventwithpython.com/collisionDetection.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
Kiam vi kuros ĉi tiu kodo, ĉi tiu estas kion la programo aspektas.
La blanka kvadrato (la bouncer) estos rebotar ĉirkaŭ la fenestro, kaj
kiam koliziis kun la verdaj kvadratoj (la manĝo) malaperos el la ekrano. Tiu kodo estas elŝutebla el http://inventwithpython.com/collisionDetection.py
Se vi ricevas erarojn post tajpi tiun kodon en, kompari ĝin al la libro kodo kun la linio malsamoj ilo en http://inventwithpython.com/diff aŭ retpoŝtu la aŭtoro en al@inventwithpython.com
- importado pygame, sys, hazarda
- el pygame.locals importado *
- def doRectsOverlap (rect1, rect2):
- por a, b en [(rect1, rect2), (rect2, rect1)]:
- # Kontroli se la anguloj estas ene b
- se ((isPointInsideRect (a.left, a.top, b)) aŭ
- (IsPointInsideRect (a.left, a.bottom, b)) aŭ
- (IsPointInsideRect (a.right, a.top, b)) aŭ
- (IsPointInsideRect (a.right, a.bottom, b))):
- revenu Vera
- revenu Falsaj
- def isPointInsideRect (x, y, rect):
- if (x> rect.left) kaj (x <rect.right) kaj (y> rect.top) kaj (y <rect.bottom):
- revenu Vera
- alie:
- revenu Falsaj
- # Starigis pygame
- pygame.init ()
- mainClock = pygame.time.Clock ()
- # Starigis la fenestro
- WINDOWWIDTH = 400
- WINDOWHEIGHT = 400
- windowSurface = pygame.display.set_mode ((WINDOWWIDTH, WINDOWHEIGHT), 0, 32)
- pygame.display.set_caption ('Collision Detection')
- # Starigis direkto variabloj
- DOWNLEFT = 1
- DOWNRIGHT = 3
- UPLEFT = 7
- Piuloj = 9
- MOVESPEED = 4
- # Starigis la koloroj
- NIGRA = (0, 0, 0)
- VERDA = (0, 255, 0)
- WHITE = (255, 255, 255)
- # Starigis bouncer kaj manĝo datumstrukturoj
- foodCounter = 0
- NEWFOOD = 40
- FOODSIZE = 20
- bouncer = {'rect': pygame.Rect (300, 100, 50, 50), 'dir': UPLEFT}
- nutraĵoj = []
- por i en gamo (20):
- foods.append (pygame.Rect (random.randint (0, WINDOWWIDTH - FOODSIZE), random.randint (0, WINDOWHEIGHT - FOODSIZE), FOODSIZE, FOODSIZE))
- # Ruli la ludon buklo
- dum Vera:
- # Kontroli por la quit okazaĵo
- por evento en pygame.event.get ():
- se event.type == QUIT:
- pygame.quit ()
- sys.exit ()
- foodCounter + = 1
- se foodCounter> = NEWFOOD:
- # Aldoni novajn manĝo
- foodCounter = 0
- foods.append (pygame.Rect (random.randint (0, WINDOWWIDTH - FOODSIZE), random.randint (0, WINDOWHEIGHT - FOODSIZE), FOODSIZE, FOODSIZE))
- # Desegni la nigra fono sur la surfaco
- windowSurface.fill (BLACK)
- # Movi la bouncer datumstrukturo
- se bouncer ['dir'] == DOWNLEFT:
- bouncer ['rect']. maldekstra - = MOVESPEED
- bouncer ['rect']. supro + = MOVESPEED
- se bouncer ['dir'] == DOWNRIGHT:
- bouncer ['rect']. maldekstra + = MOVESPEED
- bouncer ['rect']. supro + = MOVESPEED
- se bouncer ['dir'] == UPLEFT:
- bouncer ['rect']. maldekstra - = MOVESPEED
- bouncer ['rect']. supro - = MOVESPEED
- se bouncer ['dir'] == virtuloj:
- bouncer ['rect']. maldekstra + = MOVESPEED
- bouncer ['rect']. supro - = MOVESPEED
- # Kontrolu se la bouncer estas movi tra la fenestro
- se bouncer ['rect']. supro <0:
- # Bouncer movis preter la supro
- se bouncer ['dir'] == UPLEFT:
- bouncer ['dir'] = DOWNLEFT
- se bouncer ['dir'] == virtuloj:
- bouncer ['dir'] = DOWNRIGHT
- se bouncer ['rect']. fundo> WINDOWHEIGHT:
- # Bouncer movis preter la malsupro
- se bouncer ['dir'] == DOWNLEFT:
- bouncer ['dir'] = UPLEFT
- se bouncer ['dir'] == DOWNRIGHT:
- bouncer ['dir'] = honesta
- se bouncer ['rect']. lasis <0:
- # Bouncer movis preter la maldekstra flanko
- se bouncer ['dir'] == DOWNLEFT:
- bouncer ['dir'] = DOWNRIGHT
- se bouncer ['dir'] == UPLEFT:
- bouncer ['dir'] = honesta
- se bouncer ['rect']. dekstra> WINDOWWIDTH:
- # Bouncer movis preter la dekstra flanko
- se bouncer ['dir'] == DOWNRIGHT:
- bouncer ['dir'] = DOWNLEFT
- se bouncer ['dir'] == virtuloj:
- bouncer ['dir'] = UPLEFT
- # Desegni la bouncer sur la surfaco
- pygame.draw.rect (windowSurface, BLANKA, bouncer ['rect'])
- # Kontrolu se la bouncer havas intersecan kun ajna manĝo kvadratoj.
- por manĝo en nutraĵoj [:]:
- se doRectsOverlap (bouncer ['rect'], nutraĵo):
- foods.remove (manĝo)
- # Desegni la manĝo
- por i en gamo (len (nutraĵoj)):
- pygame.draw.rect (windowSurface, VERDA, nutraĵoj [i])
- # Desegni la fenestro sur la ekrano
- pygame.display.update ()
- mainClock.tick (40)
Figuro 18-1: La Collision Detection programo.
Importi la Moduloj
- importado pygame, sys, hazarda
- el pygame.locals importado *
La Collision Detection Funkcio
- def doRectsOverlap (rect1, rect2):
Figuro 18-2: Ekzemploj de sekcanta rektanguloj (maldekstre) kaj ortanguloj kiu ne sekci (dekstre).
Estas tre simpla regulo oni povas sekvi por determini se rektanguloj sekci (tio estas, kolizias). Rigardu ĉiu el la kvar anguloj sur ambaŭ rektanguloj. Se almenaŭ unu el tiuj ok anguloj estas ene de la aliaj ortangulo, tiam ni scias ke la du rektanguloj esti karambolis. Ni uzos tiun fakton por determini se doRectsOverlap () redonas Vera aŭ Falsa.
- por a, b en [(rect1, rect2), (rect2, rect1)]:
- # Kontroli se la anguloj estas ene b
- se ((isPointInsideRect (a.left, a.top, b)) aŭ
- (IsPointInsideRect (a.left, a.bottom, b)) aŭ
- (IsPointInsideRect (a.right, a.top, b)) aŭ
- (IsPointInsideRect (a.right, a.bottom, b))):
- revenu Vera
La parametroj por doRectsOverlap () estas rect1 kaj rect2. Ni unue volas kontroli ĉu rect1-ejon anguloj estas ene rect2 kaj poste kontrolu ĉu rect2-ejon anguloj estas en rect1.
Ni ne volas ripeti la kodo kiu kontrolas la kvar anguloj por ambaŭ rect1 kaj rect2, do anstataŭe ni uzi a kaj b en linioj 7 al 10. La por buklo sur linio 5 uzas la multnombraj asigno lertaĵo por ke je la unua ripeto, a estas aro al rect1 kaj b estas agordita por rect2. Sur la dua iteracio tra la ciklo, ĝi estas la malo. A estas aro al rect2 kaj b estas agordita por rect1.
Ni tion faras ĉar tiam ni nur devas tajpi la kodon por la se komunikaĵo linio 7 unufoje. Tiu estas bona, ĉar tio estas tre longa se aserto. La malpli kodo ni devas tajpi por nia programo, des pli bone.
- revenu Falsaj
Determini se Punkto estas Ene de ortangulo
- def isPointInsideRect (x, y, rect):
- if (x> rect.left) kaj (x <rect.right) kaj (y> rect.top) kaj (y <rect.bottom):
- revenu Vera
Figuro 18-3 estas ekzemplo bildo de rektangulo kaj pluraj punktoj. La punktoj kaj la anguloj de la ortangulo estas etikedita kun koordinatoj.
La mastro, ke punktoj ene ortangulo havas estas X-koordinato, kiu estas pli granda ol la X-koordinato de la maldekstra flanko kaj malpli ol la X-koordinato de la dekstra flanko, kaj Y-koordinato, kiu estas pli granda ol la Y-koordinato de la supro flanko kaj malpli ol la Y-koordinato de la fundo flanko. Se iu el tiuj kondiĉoj estas falsa, do la punkto estas ekster la rektangulo.
Ni kombini ĉiujn kvar de tiuj kondiĉoj en la se aserto estas kondiĉo kun kaj operatoroj ĉar ĉiuj kvar de la kondiĉoj devas esti vera.
Figuro 18-3: Ekzemplo de koordinatoj ene kaj ekstere
de rektangulo. La (50, 30), (85, 30) kaj (50, 50) punktoj
estas ene de la rektangulo, kaj ĉiuj aliaj estas ekstere.
- alie:
- revenu Falsaj
Ĉi tiu funkcio estos nomita de la doRectsOverlap () funkcion por vidi se iu el la anguloj en la du pygame.Rect celoj estas ene de ĉiu alia. Ĉi tiuj du funkcioj donos al ni la povon por fari kolizio detekto inter du rektanguloj.
La pygame.time.Clock Objekto kaj tick () Metodo
Multe da linioj 22 al 43 faru la samon ke Animation programo en la lasta ĉapitro faris: pravalorizi la Pygame biblioteko, turnu WINDOWHEIGHT kaj WINDOWWIDTH, kaj kunmetis la koloro kaj direkto konstantoj. Tamen, linio 24 estas nova:- mainClock = pygame.time.Clock ()
Al pygame.time.Clock objekto povas fari tion por ni. Vi povas vidi sur linio 125, ke ni nomas mainClock.tick (40) ene la ludo buklo. Tiu alvoko al la Horloĝo objekto tick () metodo kontrolos se ni ripetita tra la ludo buklo pli ol 40 fojojn en la lasta sekundo. Se jes, ĝi metas mallonga dormo en la programo por ni bazita sur ofte tik () estas nomata. Tio certigas, ke la ludo neniam kuras pli rapide ol ni atendis. Certe nomi tick () nur unufoje en la ludo buklo.
Lancxi vian La Fenestro kaj Datumoj Strukturoj
- pygame.display.set_caption ('Collision Detection')
- # Starigis bouncer kaj manĝo datumstrukturoj
- foodCounter = 0
- NEWFOOD = 40
- FOODSIZE = 20
- bouncer = {'rect': pygame.Rect (300, 100, 50, 50), 'dir': UPLEFT}
- nutraĵoj = []
- por i en gamo (20):
- foods.append (pygame.Rect (random.randint (0, WINDOWWIDTH - FOODSIZE), random.randint (0, WINDOWHEIGHT - FOODSIZE), FOODSIZE, FOODSIZE))
Figuro 18-4: Por 20 por 20 ortangulo, havante la supro forlasis angulo ĉe (400, 200) en 400 por 400 fenestro metus la rektangulo ekster la fenestro. Esti ene, la supre maldekstre angulo devus esti je (380, 200) anstataŭe. La kvadrato maldekstre havas X-koordinato de gxia supro maldekstra angulo en 380. Ĉar la nutraĵo kvadrato estas 20 rastrumeroj larĝa, la dekstra rando de la manĝo kvadrato estas ĉe 400. (Ĉi tiu estas ĉar 380 + 20 = 400). La kvadrato sur la dekstra an X-koordinato de lia supro maldekstra angulo en 400. Ĉar la nutraĵo kvadrato estas 20 rastrumeroj larĝa, la dekstra rando de la manĝo kvadrato estas ĉe 420, kiu metas en la tuta placo ekstere de la fenestro (kaj ne videblas por la uzanto). La tria parametro por pygame.Rect () estas opo kiu enhavas la largxeco kaj alteco de la manĝo kvadrato. Tiel la larĝeco kaj alteco estos egala al la valoro en la FOODSIZE konstanto. |
Desegno la Bouncer sur la ekrano
Linioj 71 al 109 kaŭzi la bouncer movi ĉirkaŭ la fenestro kaj rebotar off de la randoj de la fenestro. Tiu kodo estas tre simila al linioj 44 al 83 de nia kuraĝigo programo en la lasta ĉapitro, do ni ne iros sur ili denove tie.- # Desegni la bouncer sur la surfaco
- pygame.draw.rect (windowSurface, BLANKA, bouncer ['rect'])
Memoru, ni ne faris lotadon aĵoj sur la windowSurface objekto ankoraŭ. Ni ankoraŭ bezonas por desegni verda kvadrato por ĉiu manĝo kvadrato en la nutraĵoj listo. Kaj ni nur "desegni" rektanguloj sur la windowSurface objekto, ne sur la ekrano. Ĉi pygame.Surface objekto estas nur ene de la komputilo memoro, kiu estas multe pli rapida modifi ol la rastrumeroj sur la ekrano. La fenestro sur la ekrano ne estos ĝisdatigita ĝis ni nomas la pygame.display.update () funkcio.
Karamboli kun la Food Squares
- # Kontrolu se la bouncer havas intersecan kun ajna manĝo kvadratoj.
- por manĝo en nutraĵoj [:]:
Sur ĉiu ripeto tra la por ciklo, la nuna manĝo kvadrato de la nutraĵoj (pluralo) listo estos stokitaj ene variablo nomata manĝo (unuopa).
Ne Aldoni al aŭ Forigu el Listo dum ripetanta Over It
Rimarku, ke ekzistas io iomete malsama kun ĉi por buklo. Se vi rigardas atente ĉe linio 116, ni ne ripetanta super nutraĵojn sed fakte sur nutraĵoj [:]. Ĝuste kiel nutraĵoj [: 2] revenus kopion de la listo kun la artikoloj de la komenco kaj ĝis (sed ne inkludita) la artikolon en indekso 2, kaj ĝuste kiam nutraĵoj [3:] revenus kopion de la listo kun la artikoloj de indekso 3 al la fino de la listo, nutraĵoj [:] donos al vi kopion de la listo kun la artikoloj de la komenco ĝis la fino. Esence, nutraĵoj [:] kreas novan liston kun kopio de ĉiuj la artikoloj en la nutraĵoj. (Ĉi tiu estas pli mallonga maniero kopii liston ol nia getBoardCopy () funkcio en la Tic Tac Toe ludo.)Kial ni volas persisti super kopion de la listo anstataŭ la listo mem? Estas ĉar ni ne povas aldoni aŭ forigi elementojn el listo dum ni ripetanta super ĝi. Pitono povas perdi spuro de kio la venonta valoro de nutraĵoj variablo devus esti se la grandeco de la nutraĵoj listo estas ĉiam ŝanĝas. Pensu pri kiel malfacile estus por vi se vi provus kalkulu la numeron de jelly fazeoloj en poto dum iu estis aldonante aŭ forigi ĵeleo faboj. Sed se ni persisti super kopion de la listo (kaj la kopio neniam ŝanĝas), tiam adicianta aŭ forigi erojn el la originala listo ne estos problemo.
Forigante la Manĝo Squares
- se doRectsOverlap (bouncer ['rect'], nutraĵo):
- foods.remove (manĝo)
Desegno la Food Squares sur la ekrano
- # Desegni la manĝo
- por i en gamo (len (nutraĵoj)):
- pygame.draw.rect (windowSurface, VERDA, nutraĵoj [i])
Tiuj lastaj programoj estas interese spekti, sed la uzanto ne ricevas por fakte kontroli nenion. En ĉi sekva programo, ni lernos kiel akiri enigo de la klavaro. Klavaro enigo estas manipulita en Pygame uzante okazaĵoj.
La Klavaro Eniro Programo de Fonta Kodo
Komencu novan dosieron kaj tajpu la sekvajn kodo, tiam konservi ĝin kiel pygameInput.py.
pygameInput.py
Tiu kodo estas elŝutebla el http://inventwithpython.com/pygameInput.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
Ĉi tiu programo aspektas identa al la kolizio detekto programo pli frue en ĉi tiu ĉapitro. Sed en tiu programo, la bouncer nur movas ĉirkaŭ kiam ni premadu klavoj sur la klavaro. Premante la "W" klavo movas la bouncer supren. La "A" klavo movas la bouncer al la maldekstra kaj la "D" klavo movas la bouncer al dekstre. La "S" klavo movas la bouncer sube. Vi ankaŭ povas movi la bouncer per tenas la sagoklavoj sur la klavaro. La uzanto povas ankaŭ uzi la klavaron de sagoklavoj. Tiu kodo estas elŝutebla el http://inventwithpython.com/pygameInput.py
Se vi ricevas erarojn post tajpi tiun kodon en, kompari ĝin al la libro kodo kun la linio malsamoj ilo en http://inventwithpython.com/diff aŭ retpoŝtu la aŭtoro en al@inventwithpython.com
- importado pygame, sys, hazarda
- el pygame.locals importado *
- # Starigis pygame
- pygame.init ()
- mainClock = pygame.time.Clock ()
- # Starigis la fenestro
- WINDOWWIDTH = 400
- WINDOWHEIGHT = 400
- windowSurface = pygame.display.set_mode ((WINDOWWIDTH, WINDOWHEIGHT), 0, 32)
- pygame.display.set_caption ('Enigo')
- # Starigis la koloroj
- NIGRA = (0, 0, 0)
- VERDA = (0, 255, 0)
- WHITE = (255, 255, 255)
- # Starigis la ludanto kaj manĝo datumstrukturo
- foodCounter = 0
- NEWFOOD = 40
- FOODSIZE = 20
- ludanto = pygame.Rect (300, 100, 50, 50)
- nutraĵoj = []
- por i en gamo (20):
- foods.append (pygame.Rect (random.randint (0, WINDOWWIDTH - FOODSIZE), random.randint (0, WINDOWHEIGHT - FOODSIZE), FOODSIZE, FOODSIZE))
- # Starigis movadon variabloj
- moveLeft = False
- moveRight = False
- moveUp = False
- moveDown = False
- MOVESPEED = 6
- # Ruli la ludon buklo
- dum Vera:
- # Kontroli por eventoj
- por evento en pygame.event.get ():
- se event.type == QUIT:
- pygame.quit ()
- sys.exit ()
- se event.type == KEYDOWN:
- # Ŝanĝi la klavaron variabloj
- se event.key == K_LEFT aŭ event.key == Ord ('a'):
- moveRight = False
- moveLeft = True
- se event.key == K_RIGHT aŭ event.key == Ord ('d'):
- moveLeft = False
- moveRight = True
- se event.key == K_UP aŭ event.key == Ord ('w'):
- moveDown = False
- moveUp = True
- se event.key == K_DOWN aŭ event.key == Ord ('s'):
- moveUp = False
- moveDown = True
- se event.type == KEYUP:
- se event.key == K_ESCAPE:
- pygame.quit ()
- sys.exit ()
- se event.key == K_LEFT aŭ event.key == Ord ('a'):
- moveLeft = False
- se event.key == K_RIGHT aŭ event.key == Ord ('d'):
- moveRight = False
- se event.key == K_UP aŭ event.key == Ord ('w'):
- moveUp = False
- se event.key == K_DOWN aŭ event.key == Ord ('s'):
- moveDown = False
- se event.key == Ord ('x'):
- player.top = random.randint (0, WINDOWHEIGHT - player.height)
- player.left = random.randint (0, WINDOWWIDTH - player.width)
- se event.type == MOUSEBUTTONUP:
- foods.append (pygame.Rect (event.pos [0], event.pos [1], FOODSIZE, FOODSIZE))
- foodCounter + = 1
- se foodCounter> = NEWFOOD:
- # Aldoni novajn manĝo
- foodCounter = 0
- foods.append (pygame.Rect (random.randint (0, WINDOWWIDTH - FOODSIZE), random.randint (0, WINDOWHEIGHT - FOODSIZE), FOODSIZE, FOODSIZE))
- # Desegni la nigra fono sur la surfaco
- windowSurface.fill (BLACK)
- # Movi la ludanto
- se moveDown kaj player.bottom <WINDOWHEIGHT:
- player.top + = MOVESPEED
- se moveUp kaj player.top> 0:
- player.top - = MOVESPEED
- se moveLeft kaj player.left> 0:
- player.left - = MOVESPEED
- se moveRight kaj player.right <WINDOWWIDTH:
- player.right + = MOVESPEED
- # Desegni la ludanto sur la surfaco
- pygame.draw.rect (windowSurface, BLANKA, ludanto)
- # Kontrolu se la ludanto intersecan kun ajna manĝo kvadratoj.
- por manĝo en nutraĵoj [:]:
- se player.colliderect (manĝaĵo):
- foods.remove (manĝo)
- # Desegni la manĝo
- por i en gamo (len (nutraĵoj)):
- pygame.draw.rect (windowSurface, VERDA, nutraĵoj [i])
- # Desegni la fenestro sur la ekrano
- pygame.display.update ()
- mainClock.tick (40)
Ni povas ankaŭ klaku ie ajn en la GUI fenestro kaj krei novajn manĝo objektoj ĉe la koordinatoj kie ni klakis. Krome, la ESC klavo estos quit la programo kaj la "X" ŝlosilo estos teletransportarse la bouncer al hazarda loko sur la ekrano.
Lancxi vian La Fenestro kaj Datumoj Strukturoj
Unue, ni starigis la apudskribo de la fenestro la titolon trinkejo al la ĉeno por 'muso' on line 12. Ni starigis la apudskribo de la fenestro kun alvoko al pygame.display.set_caption () la sama maniero kiel ni faris en nia antaŭa Pygame programoj. Ni tuj volas starigi kelkajn variabloj kiuj spuri la movadon de la bouncer.- # Starigis movadon variabloj
- moveLeft = False
- moveRight = False
- moveUp = False
- moveDown = False
Linioj 34 al 43 estas identaj al kodon en la antaŭa Pygame programoj. Tiuj linioj manipuli la komenco de la ludo buklo kaj uzado, kion fari, kiam la uzanto volas lasi la programon. Ni preteriru la ekspliko por ĉi tiu kodo tie kiel ni jam kovris ĝin en la lasta ĉapitro.
Okazaĵoj kaj Uzado la KEYDOWN Eventon
Okazaĵo | Priskribo | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
QUIT | Generita kiam la uzanto fermas kun fenestro. | ||||||||||||
KEYDOWN | Generita kiam la uzanto premitan ŝlosilo. Havas ŝlosilon atributo kiu rakontas kion ŝlosilo estis premita. Havas ankaŭ mod atributo kiu rakontas se la Shift, Ktrl, Alt, aŭ aliaj klavoj estis tenataj malsupren kiam ĉi ŝlosilo estis premita. | ||||||||||||
KEYUP | Generita kiam la uzanto liberigas ŝlosilo. Havas ŝlosilon kaj mod atributo kiu estas simila al tiuj por KEYDOWN. | ||||||||||||
MOUSEMOTION | Generita ĉiufoje kiam la muso moviĝas super la fenestro. Havas post atributo kiu revenas opo (x, y) por la koordinatojn de kie la muso estas en la fenestro. La rel atributo ankaŭ redonas (x, y) opo, sed donas kunordigas parenco de la lasta MOUSEMOTION evento. Ekzemple, se la muso movas lasita de kvar rastrumeroj el (200, 200) por (196, 200), tiam rel estos (-4, 0). La butonoj atributo revenas opo de tri entjeroj. La unua entjero en la opo estas por la maldekstra musbutono, la dua entjera por la mezan musbutonon (se estas meza musbutono), kaj la tria entjero estas por la dekstra musbutono. Tiuj entjeroj estos 0 se ili ne estas premita suben kiam la muso kopiis kaj 1, se ili premis malsupren. | ||||||||||||
MOUSEBUTTONDOWN | Generita kiam musbutono estas premita suben en la fenestron. Tiu okazaĵo havas post atributo kiu estas (x, y) opo por la koordinatojn de kie la muso estis kiam la butono estis premita. Ankaŭ estas butono atributo kiu estas entjero de 1 al 5 kiu diras kion musbutonon estis premita:
| ||||||||||||
MOUSEBUTTONUP | Generita kiam la musbutono estas liberigita. Ĉi tio havas la samajn atributojn kiel MOUSEBUTTONDOWN |
- se event.type == KEYDOWN:
Lancxi la Kvar Klavaro Variabloj
- # Ŝanĝi la klavaron variabloj
- se event.key == K_LEFT aŭ event.key == Ord ('a'):
- moveRight = False
- moveLeft = True
- se event.key == K_RIGHT aŭ event.key == Ord ('d'):
- moveLeft = False
- moveRight = True
- se event.key == K_UP aŭ event.key == Ord ('w'):
- moveDown = False
- moveUp = True
- se event.key == K_DOWN aŭ event.key == Ord ('s'):
- moveUp = False
- moveDown = True
Kiam unu el tiuj klavoj estas premita suben, ni starigos la responda movado variablo al True. Ni eliris en la movado variablo de la kontraŭa direkto al False. Ekzemple, la programo ekzekutas linioj 47 kaj 48 kiam la maldekstra sago ŝlosilo estis premata. En ĉi tiu kazo, ni aro moveLeft al Vera kaj moveRight al False (kvankam moveRight povus jam esti Falsa, ni starigis gxin al falsa nur por esti certa).
Vi eble rimarkos ke sur linio 46, en event.key povas ĉu esti egala al K_LEFT aŭ Ord ('a'). La valoron en event.key estas agordita por la entjera ASCII valoro de la ŝlosilo kiu estis premita sur la klavaro. (Ne estas Askio valoro por la sagoklavoj, tial ni uzas la konstanta variablo K_LEFT.) Vi povas uzi la Ord () funkcion por atingi la ASCII valoro de ajna unuopa signo kompari ĝin kun event.key.
Por ekzekuti la kodon de la linioj 47 kaj 48 se la klavofrapo estis aŭ K_LEFT aŭ Ord ('a'), ni faras la maldekstra sago ŝlosilo kaj la Kerna fari la samon. Vi eble rimarkos ke la W, A, S, kaj D klavoj estas ĉiuj uzataj kiel alterna por ŝanĝi la movado variabloj. Ĉi tiu estas ĉar iuj personoj povas voli uzi sian maldekstran manon por premi la WASD klavoj anstataŭ ilia dekstra mano premas la sagoklavoj. Nia programo proponas ilin ambaŭ!
Uzado la KEYUP Eventon
- se event.type == KEYUP:
- se event.key == K_ESCAPE:
- pygame.quit ()
- sys.exit ()
Linioj 62 al 69 starigos movado variablo al falsa se tiu direkto la ŝlosilo estis lasita.
- se event.key == K_LEFT aŭ event.key == Ord ('a'):
- moveLeft = False
- se event.key == K_RIGHT aŭ event.key == Ord ('d'):
- moveRight = False
- se event.key == K_UP aŭ event.key == Ord ('w'):
- moveUp = False
- se event.key == K_DOWN aŭ event.key == Ord ('s'):
- moveDown = False
Teleporting la Ludanto
Se la uzanto liberigis unu el la klavoj kiuj movas la ludanto, kaj poste ni volas establi la movado variablo kiu korespondas kun la ŝlosilo al False. Ĉi diros la postaj partoj de nia programo por ne plu movi la ludanto kvadrato sur la ekrano.- se event.key == Ord ('x'):
- player.top = random.randint (0, WINDOWHEIGHT - player.height)
- player.left = random.randint (0, WINDOWWIDTH - player.width)
Uzado la MOUSEBUTTONUP Eventon
- se event.type == MOUSEBUTTONUP:
- foods.append (pygame.Rect (event.pos [0], event.pos [1], FOODSIZE, FOODSIZE))
Movante la Bouncer Ĉirkaŭ la ekrano
- # Movi la ludanto
- se moveDown kaj player.bottom <WINDOWHEIGHT:
- player.top + = MOVESPEED
- se moveUp kaj player.top> 0:
- player.top - = MOVESPEED
- se moveLeft kaj player.left> 0:
- player.left - = MOVESPEED
- se moveRight kaj player.right <WINDOWWIDTH:
- player.right + = MOVESPEED
La colliderect () metodo
# Kontrolu se la ludanto intersecan with ajna tenilo kvadratoj.
Por tenilo eo nutraĵoj [:]:
se player.colliderect (manĝaĵo):
foods.remove (tenilo)
Eo Nia antaŭa Collision Detection programo, nek havis Nian propran funkcion Por kontroli se la oni ortangulo estis karambolis with aliaj aĵoj. Tiu funkcio estis inkludita eo CI tiu libro, Por Ke vidis povus kompreni Kiel la Kodo malantaŭ kolizio detekto funkcias. Eo CI tiu programo, nek povas Uzi la kolizio detekto funkcio kiu venas with Pygame. La colliderect () metodon por pygame.Rect celoj estas pasita alia pygame.Rect objekto kiel argumento kaj redonas True se la du rektanguloj kolizias kaj Falsa se ili ne estas. Ĉi tio estas la ĝusta sama konduto kiel la doRectsOverlap () funkcion en nia antaŭa Collision Detection programo.
mainClock.tick (40)
La resto de la kodo estas simila al la kodon en la Eniro programo estas simila al la pli frua Collision Detection programo: desegni la manĝo kvadratoj kaj la ludanto kvadratoj al la windowSurface surfaco, foje aldoni novan manĝaĵon kvadrato ĉe hazarda loko por la nutraĵoj listo , kontrolu se la ludanto placo karambolis kun iu el la nutraĵo kvadratoj, kaj nomas mainClock.tick (40) fari la programon funkcii en taŭga rapido.Resumo: Collision Detection kaj Pygame Eniro
Ĉi tiu ĉapitro enkondukis la koncepton de kolizio detekto, kiu estas uzita en plej grafikaj ludoj. Detekti kolizioj inter du rektanguloj estas facila: ni simple kontroli ĉu la kvar anguloj de ĉu rektangulo estas ene de la aliaj rektangulo. Tiu estas tia komuna afero por kontroli por tiu Pygame havigas ĝia propra kolizio detekto metodo nomata colliderect () por pygame.Rect celoj.
La unuaj kelkaj ludoj de ĉi tiu libro estis teksto bazita. La programo eligo estis teksto presita al la ekrano kaj la eniro estis teksto tajpita de la uzanto sur la klavaro. Sed GUI programoj povas akcepti klavaro kaj muso enigoj. Plue, GUI programoj povas respondi al simpla keystrokes kiam la uzanto pelas malsupren aŭ supren lasas sola ŝlosilo. La uzanto ne devas tajpi en tuta respondo kaj premas Ret. Ĉi tiu permesas por tuja sugestoj kiam la ludanto premas malsupren ajna klavo de la klavaro kaj multe pli interaga ludoj.
La Pygame programoj ni montris ĝis nun nomis la rektanguloj, linioj, cirkloj, kaj eĉ individuo rastrumeroj al la ekrano. Tiuj estas nomataj desegnante primitivoj. Sed ni ankaŭ volas uzi fotojn kaj bildojn anstataŭ simpla desegno primitivoj. La venonta ĉapitro diros al vi kiom ŝarĝi bildojn kaj desegni ilin sur la ekrano. Ni ankaŭ lerni kiel ludi sonoj kaj muziko por la ludanto aŭdi.
Nenhum comentário:
Postar um comentário