Hvordan å lage en 2D-spill med Python og Arcade bibliotek

Python er et fremragende språk for folk å lære å programmere, og perfekt for alle som ønsker å «få ting gjort» og ikke bruke masse tid på boilerplate-koden. Arcade er en Python-bibliotek for å lage 2D-spill som er enkelt å ta i bruk, og meget dyktig som du får erfaring. I denne artikkelen, vil jeg forklare hvordan du kan begynne å bruke Python og Arcade å programmere spill.

jeg startet utviklingen av Arcade etter å lære elevene å bruke PyGame bibliotek., Jeg har undervist i-person som bruker PyGame for nesten 10 år, og jeg utviklet ProgramArcadeGames.com å lære på nettet. PyGame er stor, men etter hvert følte jeg at jeg ble å kaste bort tid på å ha for å dekke for bugs, som aldri ble rettet.

jeg var bekymret for å lære ting som arrangementet loop, som ikke lenger var den måten vi kode. Jeg hadde en hel del som jeg har forklart hvorfor y-koordinatene ble reversert. Fordi PyGame var sjelden oppdatert, og det er basert på en gammel SDL 1 bibliotek, snarere enn noe som mer moderne som OpenGL, jeg holder ikke mye håp for fremtiden.,

jeg ville ha et bibliotek som var enklere å bruke, mer kraftig, og brukt noen av de nye funksjonene i Python 3, som dekoratører og type-antydet. Arcade er det. Og dette er hvordan man skal komme i gang.

Installasjon

Arcade, som mange andre pakker, som er tilgjengelige via PyPi, som betyr at du kan installere Arcade bruke pip – kommandoen (eller pipenv kommandoen)., Hvis du allerede har Python installert, kan du sannsynligvis bare åpne opp en ledetekst i Windows og skriv:

pip install arcade

Eller på MacOS og Linux, skriv:

pip3 install arcade

For mer detaljerte installasjonsinstruksjoner, kan du se Arcade-installasjon dokumentasjon.

Enkel tegning

Du kan åpne et vindu og lage enkle tegninger med bare noen få linjer med kode. La oss skape et eksempel som trekker en smiley ansikt som figuren nedenfor:

skriptet nedenfor viser hvordan du kan bruke Arcade tegning kommandoer for å gjøre dette., Merk at du ikke trenger å vite hvordan du skal bruke klasser eller til og med definere funksjoner. Programmering med rask visuell tilbakemelding er flott for alle som ønsker å begynne å lære å programmere.

ved Hjelp av funksjoner

selvfølgelig, å skrive kode i global sammenheng er ikke god form. Heldigvis å forbedre ditt program ved hjelp av funksjoner er lett. Her kan vi se et eksempel på en tegning av en furu på en bestemt (x, y) posisjon ved hjelp av en funksjon:

For hele eksempel, se tegning med funksjoner.,

De mer erfarne programmerere vet at moderne grafikk-programmer først laste tegning informasjon på grafikk kortet, og deretter be grafikk-kort til det senere som en gruppe. Arcade støtter dette så godt. Tegning 10,000 rektangler individuelt tar ca 0.800 sekunder. Tegning dem som en gruppe tar mindre enn 0.001 sekunder.

– Vinduet klasse

Større programmer vil typisk stammer fra Vinduet i en klasse, eller bruk dekoratører. Dette gjør at en programmerer til å skrive kode for å håndtere tegning, oppdatering og håndtering av input fra brukeren., En mal for en starte en Window-basert program nedenfor.

Window klassen har flere metoder som programmene kan overstyre å gi funksjonaliteten til programmet. Her er noen av de mest brukte de:

  • on_draw: All koden til å tegne på skjermen går her.
  • update: All koden for å flytte elementer og utføre spillet logikk går her. Dette kalles ca 60 ganger per sekund.,
  • on_key_press: Håndtere hendelser når en tast trykkes ned, slik som å gi en spiller en fart.
  • on_key_release: Håndtaket når en tast slippes, her kan du stoppe en spiller fra å flytte.
  • on_mouse_motion: Dette kalles hver gang musen beveger seg.
  • on_mouse_press: Kalles når en museknapp trykkes ned.
  • set_viewport: Denne funksjonen er brukt i rulle spill, når du har en verden som er mye større enn det som kan vises på én skjerm., Ringer set_viewport gjør en programmerer for å angi hvilken del av verden er i dag synlig.

Sprites

Sprites er en enkel måte å lage en 2D punktdefinerte objekt i Arcade. Arcade har metoder som gjør det lett å trekke, flytte og animere sprites. Du kan også enkelt bruke sprites å oppdage kollisjoner mellom objekter.

Opprette en sprite

Opprette en forekomst av Arcade Sprite klasse ut av grafikken er enkel. En programmerer trenger bare filnavnet for et bilde for å basere sprite av, og eventuelt et nummer for å skalere bildet opp eller ned., For eksempel:

SPRITE_SCALING_COIN = 0.2
coin = arcade.Sprite("coin_01.png", SPRITE_SCALING_COIN)

Denne koden vil lage en sprite bruke bilde som er lagret i coin_01.png. Bildet vil bli skalert ned til 20% av sin opprinnelige høyde og bredde.

Sprite lister

Sprites er normalt organisert i lister. Disse listene gjøre det lettere å administrere sprites. Sprites i en liste vil bruke OpenGL til batch-tegne sprites som en gruppe. Koden nedenfor setter opp et spill med en spiller, og en haug med mynter for spilleren å samle inn. Vi bruker to lister, en for spilleren og en for mynter.,

Vi kan lett trekke alle myntene i mynt lister:

def on_draw(self):
""" Draw everything """
arcade.start_render()
self.coin_list.draw()
self.player_list.draw()

å Oppdage sprite kollisjoner

funksjon check_for_collision_with_list gjør det mulig for oss å se om en sprite går inn i en annen sprite i en liste. Vi kan bruke dette til å se alle mynter spilleren sprite er i kontakt med. Ved hjelp av en enkel for loop, kan vi bli kvitt mynt fra spillet og øke vår score.

For hele eksempel, se collect_coins.py.

Spill fysikk

Mange spill er en slags fysikk., Det enkleste er top-down-programmer som forhindret fra å gå gjennom vegger. Plattformspill legge til mer kompleksitet med tyngdekraften og plattformer som flytter. Noen spill bruker en full 2D fysikk motor med masse, friksjon, fjærer, og mer.

Topp-ned spill

For enkel topp-ned-basert spill, er en Arcade-programmet er behov for en liste av vegger som spilleren (eller noe annet), kan ikke bevege seg gjennom. Jeg pleier å kalle dette wall_list., Deretter en fysikkmotor som er laget i Window klassen er oppsett av koden med:

self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite, self.wall_list)

player_sprite er gitt en bevegelse vektor med sine to attributter change_x og change_y. Et enkelt eksempel for å gjøre dette ville være å ha den spilleren som flytter med tastaturet. For eksempel kan dette være tilpasset barn Window class:

Selv om at koden angir spillerens fart, er det ikke å bevege spilleren., I update metode for Window klasse, ringer physics_engine.update() vil flytte spilleren, men ikke gjennom vegger.

def update(self, delta_time):
""" Movement and game logic """
self.physics_engine.update()

For en full eksempel se sprite_move_walls.py.

Plattformspill

du går til en side-visning plattformspill er ganske enkel. En programmerer bare trenger å bytte fysikk motoren til PhysicsEnginePlatformer og legg til i gravitasjonskonstant.

self.physics_engine = arcade.PhysicsEnginePlatformer(self.player_sprite,
self.wall_list,
gravity_constant=GRAVITY)

Du kan bruke et program som Flislagt å legge fliser/blokkene som utgjør ditt nivå.

For et eksempel, se sprite_tiled_map.,py.

For full 2D fysikk du kan integrere PyMunk bibliotek.

Lærer ved eksempel

En av de beste måter å lære på er ved eksempel. Arcade biblioteket har en lang liste over eksempel programmer som en person kan trekke på for å lage spill. Disse eksemplene hvert vise et spillkonsept som elevene har bedt for i mine klasser eller online gjennom årene.

du Kjører noen av disse demoene er lett når Arcade har blitt installert., Hver av prøvene har en kommentar i begynnelsen av programmet med kommandoen kan du skrive inn på kommandolinjen til å kjøre prøven, for eksempel:

python -m arcade.examples.sprite_moving_platforms

Oppsummering

Arcade lar deg starte programmering, grafikk og spill med enkel å forstå koden. Mange nye programmerere har laget gode spill ikke lenge etter å komme i gang. Gi det et forsøk!

for Å lære mer, delta Paul Vincent Craven ‘ s talk, Enkel 2D-Spill Creation Med Arcade, på PyCon Cleveland 2018.

Share

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *