Escrivint el teu primer joc Android amb Corona SDK

Autora: Randy Alexander
Data De La Creació: 1 Abril 2021
Data D’Actualització: 26 Juny 2024
Anonim
Java Multithreading : AtomicReference, ScheduledExecutorService и монада Either. Многопоточность.
Vídeo: Java Multithreading : AtomicReference, ScheduledExecutorService и монада Either. Многопоточность.

Content


La categoria més popular a Google Play Store sempre ha estat Games. Tot i que probablement tots utilitzem aplicacions clau de productivitat com un navegador web, un client de correu electrònic i una aplicació de missatgeria instantània, el joc continua sent una part important de l’experiència mòbil. Així que no és d'estranyar que moltes persones que vulguin aprendre a desenvolupar-se per Android vulguin començar fent un joc. A més, siguem sincers, escriure un joc és molt més divertit que desenvolupar una aplicació de productivitat.

L’idioma oficial d’Android és Java i l’entorn de desenvolupament oficial és Android Studio. Si voleu analitzar Java, us proposo el nostre tutorial bàsic de Java i si voleu aprendre a escriure una aplicació mitjançant Android Studio, us recomano que consulteu el nostre tutorial per escriure la vostra primera aplicació per a Android. Tot i això, Java i Android studio no són les úniques maneres de desenvolupar-se per a Android. Podeu trobar una visió general dels idiomes i SDK disponibles a la nostra guia: vull desenvolupar aplicacions per a Android: quins idiomes he d’aprendre?


Un dels SDK mencionats a la guia de llenguatges de programació és Corona, un SDK de tercers dissenyat principalment per a jocs d’escriptura. En lloc de Java, Corona utilitza Lua, un llenguatge de script ràpid que és fàcil d’aprendre però alhora potent. Tot i això, Corona no és l’únic SDK de jocs mòbils que utilitza Lua, entre altres exemples coneguts són Cocos2d-X, Marmellada i Gideros.

Baixar i instal·lar

Per començar amb Corona, haureu de descarregar i instal·lar l’SDK. Vés al lloc web de Corona i toca el botó de descàrrega. Haureu de crear un compte (gratuït) abans de descarregar el kit. Si voleu crear un fitxer .apk real en lloc de només executar el programa a l’emulador, haureu d’instal·lar Java 7, però no haureu d’instal·lar l’SDK d’Android. Per instal·lar Java 7 Development Kit, aneu al lloc web d'Oracle, busqueu la secció anomenada "Java SE Development Kit 7u79" i descarregueu la versió per al vostre PC.


Un cop hàgiu instal·lat Corona, l'heu d'activar. Aquest és un procés únic i gratuït. Inicia el Corona Simulator i accepta la llicència. Introduïu l’adreça de correu electrònic i la contrasenya que heu utilitzat per a la descàrrega i feu clic a Iniciar sessió.

Iniciar el projecte

Des de dins del Corona Simulator, feu clic a "Projecte nou". Introduïu un nom per a la vostra aplicació al camp "Nom de l'aplicació:" i deixeu la resta de configuracions per defecte. Feu clic a "D'acord".

Ara apareixeran tres finestres. Els dos primers són Corona Simulator i Corona Simular Output. Corona també obrirà una finestra d'explorador de fitxers que mostra els fitxers del vostre projecte.

La majoria dels fitxers (23 d’ells) del directori del projecte són per a la icona de l’aplicació. El fitxer més important per a nosaltres és ara principal.lua, ja que aquí escriurem el codi per a la nostra aplicació.

Introducció a Lua

Abans d’entrar a escriure el codi, hem de fer un recorregut per xiulació a Lua. L’intèrpret Lua (recordeu que es tracta d’un llenguatge de script, no un llenguatge compilat) està disponible per a Windows, OS X i Linux. Tot i això, està integrat a Corona, per la qual cosa en aquest moment no necessita instal·lar res addicional. La manera més senzilla de jugar amb Lua és utilitzar la demostració en línia en línia.

Podeu trobar molts bons tutorials sobre Lua en línia i heu de fer un cop d'ull al Manual de referència de Lua, Programació a Lua, The.Lua.Tutorial i Tutorials Point Lua.

Aquí teniu un petit programa Lua que us mostrarà algunes de les característiques principals de Lua:

funció local doubleIt (x) torna x * 2 final per i = 1,10,1 do x = doubleIt (i) si (x == 10) aleshores imprimeix ("deu") més imprimeix (doubleIt (i)) final final

El codi anterior mostra tres construccions importants de Lua: funcions, bucles i instruccions if. La funció dobleIt () és molt senzill, simplement duplica el paràmetre passat x.

El codi principal és a per bucle de l’1 al 10. Truca dobleIt () per a cada iteració. Si el valor de devolució és 10 (és a dir, quan jo és 5) llavors el codi imprimeix "deu" en cas contrari només imprimeix el resultat de dobleIt ().

Si teniu alguna experiència de codificació, el codi d'exemple ha de ser prou fàcil de seguir. Si voleu aprendre alguna programació bàsica, us recomano que utilitzeu alguns dels recursos enllaçats anteriorment per perfeccionar-vos les habilitats.

Escriure el joc

Escriure programes bàsics a Corona és senzill. Només us cal preocupar-vos amb un sol fitxer, main.lua, i deixem que Corona faci tot el fort aixecament. El joc que anem a escriure és un simple joc de “tap”. Un globus o una bomba fallarà a la pantalla. Si el jugador toca el globus marca un punt, toca una bomba, el marcador es dividirà per 2, com a penalització. Per escriure el codi que cal editar principal.lua. Podeu fer-ho en qualsevol editor de text.

El Corona SDK té un motor de física 2D integrat, que facilita la construcció de jocs. El primer pas per escriure el joc és inicialitzar el motor de la física:

local physics = requerir ("física") physics.start ()

El codi és força explicatiu. La física del mòdul es carrega i s'inicialitza, s'assigna a la variable física. Per activar el motorphysics.start () es diu.

A continuació, creem algunes variables útils que seran útils no només per a aquest joc senzill, sinó també per a jocs més complexos. mig W i mitjaH manteniu els valors de la meitat de l'amplada de la pantalla i la meitat de l'alçada de la pantalla:

halfW = display.contentWidth * 0,5 halfH = display.contentHeight * 0,5

El visualització object és un objecte predefinit que Corona posa a disposició del món.

Ara arriba el primer pas que realment fa que passi alguna cosa a la pantalla:

local bkg = display.newImage ("night_sky.png", halfW, halfH)

Així com propietats com contingut Alçada i Amplada de contingut, la visualització l'objecte també té moltes funcions útils. El newImage () funció llegeix un fitxer d’imatge (en aquest cas un .png) i el mostra a la pantalla. Els objectes de visualització es mostren en capes, de manera que aquesta és la primera imatge que posem a la pantalla, sempre serà el fons (tret que el codi expliqui explícitament alguna cosa). Els paràmetres mig W i mitjaH Digues a Corona que col·loqui la imatge al centre.

En aquest punt podeu executar el codi a l'emulador i veure la imatge de fons. Si guardeu el fitxer, l'emulador notarà que el fitxer ha canviat i l'ofereixen per tornar a iniciar. Si això no passa, utilitzeu Fitxer-> Reengega.

Atès que l'usuari anotarà punts per tocar en globus, hem de inicialitzar una variable de puntuació i mostrar la puntuació a la pantalla:

puntuació = 0 scoreText = display.newText (puntuació, mitjaW, 10)

La puntuació es conservarà a la variable anomenada imaginativament puntuació,i puntuacióText és l'objecte que mostra la partitura. M'agrada newImage (), newText () posa alguna cosa a la pantalla, en aquest cas, text. Des que puntuacióText és una variable global, llavors podem canviar el text en qualsevol moment. Però aviat arribarem a això.

Podeu tornar a posar en marxa l'emulador i veure la puntuació de 0 a la part superior de la pantalla.

Esquerra: Només el fons. Dreta: antecedents i puntuació.

Ara és una mica més complicat, però no us preocupeu, ho explicaré línia per línia:

funció local balloonTouched (event) if (event.phase == "començat"), llavors Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = puntuació + 1 scoreText.text = finalització finalització

El codi anterior defineix una funció anomenada globus tocat () que s’anomenarà cada cop que es toqui un globus. Encara no li hem dit a Corona que cridés aquesta funció cada cop que es toca el globus, que vindrà més tard, però quan fem això és la funció que es truca.

Els esdeveniments de toqueu o toqueu diverses etapes, moltes que permeten arrossegar. L'usuari posa el dit sobre un objecte, aquesta és la fase de "començament". Si llisquen el dit cap a qualsevol direcció, aquesta és la fase de "moviment". Quan l'usuari aixeca el dit de la pantalla, aquesta és la fase de "finalització".

La primera línia de globus tocat () comprovem que estem en la fase de "començament" Volem treure el globus i augmentar la puntuació tan aviat com sigui possible. Si la funció es torna a trucar per a altres fases com "finalitzada", la funció no fa res.

Dins de l’interiorsi instrucció són quatre línies de codi. Abordem els dos últims primers, ja que són més senzills.puntuació = puntuació + 1 només augmenta la puntuació per un ipuntuacióText.text = puntuació canvia el text de la puntuació a la pantalla per reflectir la nova puntuació. Recordeu com he dit aixòpuntuacióText era global i es podia accedir a qualsevol lloc, bé això és el que fem aquí.

Ara per a les dues primeres línies. Un cop que un globus o bomba caigui a la part inferior de la pantalla encara existeix a la memòria de l’aplicació, només no el podreu veure. A mesura que el joc avança, el nombre d'aquests objectes fora de la pantalla augmentarà constantment. Per tant, hem de tenir un mecanisme que elimini els objectes un cop fora de la vista. Ho fem en una funció anomenadafora de pantalla, que encara no hem escrit encara Aquesta funció s'anomenarà una vegada per fotograma durant el joc. Un cop tocat un globus, hem de suprimir-lo i eliminar la trucada que comprova si el globus s’ha quedat fora de pantalla.

La líniaevent.target:removeSelf () esborra el globus. Quan es produeix un esdeveniment tàctil, un dels paràmetres de la funció d'oient ésesdeveniment paràmetre. Explica la funció sobre l’esdeveniment i quin tipus d’esdeveniment es tracta, p.esdeveniment. També ens explica quin globus es va tocar,esdeveniment.target. ElremoveSelf () funció fa el que diu que fa, elimina l'objecte (en aquest cas un globus).

La línia anterior a això elimina l'oient "enterframe", que és la funció que s'anomena cada fotograma per veure si el globus ha caigut a la part inferior de la pantalla. Ho veurem amb més detall quan arribem a escriure el documentfora de pantalla funció d'oient.

Per tant, per recaptar.globus tocat ()comprova que aquest és el començament de la seqüència tàctil. A continuació, elimina l'oient "enterframe", que és la funció que es diu a tots els fotogrames per veure si el globus ha caigut a la part inferior de la pantalla. Després esborra el globus, augmenta la puntuació i mostra la nova puntuació.

Això va ser per a globus, ara necessitem alguna cosa similar per a bombes:

funció local bombTouched (event) if (event.phase == "begin"), després Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = math.floor (score * 0.5) scoreText.text = finalització final de puntuació

Com podeu veure, el codi és molt similar a l'excepció que, en lloc d'augmentar la puntuació, la puntuació es multiplica per 0,5 (és a dir, es divideix per 2). El math.floor () la funció arrodoneix la puntuació al nombre enter més proper. De manera que si el jugador tingués una puntuació de 3 i tocés una bomba, la nova puntuació seria 1, i no 1,5.

He esmentat el fora de pantalla () funció anteriorment. Aquesta funció s'anomenarà a tots els fotogrames per comprovar si un objecte s'ha desviat de la pantalla. Aquí teniu el codi:

funció local fora de pantalla (auto, esdeveniment) if (self.y == nil) després torna end si (self.y> display.contentHeight + 50), després Runtime: removeEventListener ("enterFrame", self) self: removeSelf () end end

En informàtica hi ha una situació coneguda com a condició de cursa. Aquí és on van a passar dues coses, però una podria succeir primer o, de vegades, l’altra podria passar. És una carrera. Algunes condicions de la carrera no es veuen perquè sempre sembla que una cosa passa primer, però poden causar errors interessants aquell dia, en les condicions adequades, l’altra passa primer i després el sistema es trenca.

Hi ha una condició de cursa en aquest joc senzill, perquè poden passar-hi dues coses molt a prop, les que es troben: un globus fora de pantalla () una funció que s'ha trucat per veure si el globus ha sortit de la pantalla. El resultat és que es pot anomenar el codi per eliminar el globus i, a continuació, el fora de pantalla () s’anomena funció (que passa com 30 vegades per segon). Per obtenir aquesta seqüència d’esdeveniments estranys fora de pantalla () la funció necessita comprovar si la i el valor de l'objecte és nil (nul) o no. Si és nil aleshores significa que l'objecte ja s'ha suprimit, de manera que seguiu, no són els droids que busquem.

Si l'objecte encara està en joc, comproveu la seva posició, si ha passat a 50 píxels fora de la pantalla, elimineu-lo i traieu l'oient perquè fora de pantalla () la funció no es tornarà a trucar per a aquest objecte. El codi per assegurar-se quefora de pantalla () Es diu que tots els fotogrames formen part de la secció següent del codi.

Tota la premissa d’aquest joc és que els nous globus o bombes continuaran caient a la pantalla. Per tant, necessitem una funció que crei un globus nou o una nova bomba:

funció local addNewBalloonOrBomb () local startX = math.random (display.contentWidth * 0.1, display.contentWidth * 0.9) if (math.random (1,5) == 1) llavors - BOMB! local bom = display.newImage ("bomb.png", startX, -300) physics.addBody (bomba) bomb.enterFrame = fora de pantalla Runtime: addEventListener ("enterFrame", bomba) bomba: addEventListener ("toca", bomba tocat) més - Globus local globus = display.newImage ("red_balloon.png", startX, -300) physics.addBody (globus) balloon.enterFrame = fora de pantalla Runtime: addEventListener ("enterFrame", globus) globus: addEventListener ("toc"), balloonTouched) final final

La primera línia de la funció decideix a on sortirà el globus x avió. Si el globus o la bomba sempre caiguessin al centre, no serà molt interessant! TanstartX és un nombre aleatori entre el 10 i el 90 per cent de l'amplada de la pantalla.

A continuació, es selecciona entre 1 i 5 un nombre aleatori.Si el número és 1, es deixarà caure una bomba. Si són 2, 3, 4 o 5, es deixarà caure un globus. Això significa que es cauen les bombes al voltant del 20 per cent de les vegades.

El codi bomba i globus són força similars. Primer es mostra la imatge (ja sigui una bomba o un globus) ambnewImage(). La seva x la posició és la destartX mentre que el seu i la posició està ajustada a -300, és a dir, a la part superior de la pantalla. El motiu és que volem que l’objecte caigui des de fora de la zona de la pantalla a l’àrea visible i després a la part inferior. Com que utilitzem el motor de física 2D, és bo donar a l’objecte una mica de distància inicial per caure, de manera que pot obtenir una mica de velocitat.

La trucada aphysics.addBody () agafa la imatge carregada per newImage () i el converteix en un objecte del motor de física. Això és molt potent. Qualsevol fitxer d'imatge es pot convertir en un cos que respon a la gravetat i les col·lisions només amb una trucadafísica.addBody ().

Les tres últimes línies del codi bomba o globus configuren els oients. Configuració delenterFrame la propietat indica a Corona a quina funció ha de cridar tots els fotogrames i les trucadesRuntime: addEventListener () ho configura. Finalment, la trucada aglobus: addEventListener () indica a Corona quina funció ha de cridar si es toca la bomba o el globus.

I ara el joc està gairebé complet. Només necessitem dues línies de codi més:

addNewBalloonOrBomb () timer.performWithDelay (500, addNewBalloonOrBomb, 0)

La primera línia fa que la primera bomba o globus caigui cridant explícitamentaddNewBalloonOrBomb (). La segona línia configura un temporitzador que trucaràaddNewBalloonOrBomb () cada mig segon (500 mil·lisegons). Això significa que un nou globus o bomba caurà cada mig segon.

Ja podeu executar el joc a l’emulador.

Aquí hi ha la llista completa de main.lua, el codi font del projecte complet per a aquest joc es troba aquí a GitHub.

---------------------------------------------------------------------------------------------------------- --------------------------------------- - - Joc de bombes i bombes que cau - Escrit per Gary Sims per a -------------------------------------------------- ---------------------------------------------- - Comença el physics engine local physics = require ("physics") physics.start () - Calcula la meitat de l'amplada de la pantalla i l'alçada halfW = display.contentWidth * 0,5 halfH = display.contentHeight * 0,5 - Estableix el fons local bkg = display.newImage ("night_sky.png", halfW, halfH) - Puntuació = 0 scoreText = display.newText (puntuació, halfW, 10) - Trucada quan el jugador toca el globus - Augmenta la puntuació per 1 funció local globusTouched ( event) if (event.phase == "va començar"), a continuació, Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = score + 1 scoreText.text = finalització de la puntuació final - S'ha trucat quan el el jugador toca bomba - La meitat de la puntuació com a funció local de penal bomTouched (event) if (event.phase == "va començar") i després Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = math.floor (puntuació * 0,5) scoreText.text = puntuació final final: elimina els objectes que han caigut del a la part inferior de la pantalla, la funció local és fora de pantalla (auto, esdeveniment) si (self.y == nil) llavors torna el final si (self.y> display.contentHeight + 50), a continuació, Runtime: removeEventListener ("enterFrame", self) self: removeSelf () end end - Afegiu una nova funció local de globus o bombes que cau addNewBalloonOrBomb () - Podeu trobar red_ballon.png i bomb.png al local de reemplaçament de GitHub startX = math.random (display.contentWidth * 0.1, display.contentWidth * 0.9) si (math.random (1,5) == 1) llavors - BOMB! local bom = display.newImage ("bomb.png", startX, -300) physics.addBody (bomba) bomb.enterFrame = fora de pantalla Runtime: addEventListener ("enterFrame", bomba) bomba: addEventListener ("toca", bomba tocat) més - Globus local globus = display.newImage ("red_balloon.png", startX, -300) physics.addBody (globus) balloon.enterFrame = fora de pantalla Runtime: addEventListener ("enterFrame", globus) globus: addEventListener ("toc"), balloonTouched) final final - Afegiu ara un nou globus o bomba addNewBalloonOrBomb (): continueu afegint un globus o bomba nou cada 0,5 segons. timer.performWithDelay (500, addNewBalloonOrBomb, 0)

Propers passos

El següent pas és jugar el joc en un dispositiu Android real. Per crear un fitxer .apk, feu clic a Fitxer-> Construeix per a Android ... i empleneu els camps. El resultat serà un fitxer .apk que podeu copiar al dispositiu i després instal·lar-lo. Haureu d’assegurar-vos que heu configurat el dispositiu per permetre la instal·lació d’aplicacions des de fonts desconegudes. Amazon té una bona documentació al respecte, ja que també cal establir-la per instal·lar Amazon Appstore. Corona també té una guia sobre com signar, crear i provar l'aplicació en dispositius Android.

Amb el joc instal·lat amb èxit al vostre dispositiu, el següent que cal fer és millorar el joc. Per exemple, per què no intentar afegir un so "pop" o "bang" tot allò que es toca un globus o una bomba. Corona té una API per això:media.playEventSound ().

O per què no proveu d’afegir un tercer tipus d’objectes, per exemple, un super impuls que duplica la puntuació actual, o què passa amb alguna música de fons?

Embolicar

Els jocs d'escriptura amb Corona són força senzills, ja que el SDK gestiona coses com OpenGL i inclou un motor de física 2D integrat. A més, Lua és fàcil d’aprendre i no hauria de ser difícil per a ningú amb el mínim d’experiència de programació. El lloc web de Coronalabs ofereix molta documentació, incloent-hi moltes guies i tutorials.

En menys de 100 línies de codi tenim un joc de treball. D'acord, no guanyarà cap premi, però demostra el poder i la flexibilitat del Corona SDK.

Que tingueu un preupot reduït no vol dir que no pugueu tenir coe bone. L'expoició A é el auricular i10 TW Bluetooth 5.0, que podeu recollir a Geekbuying per nomé 18,99 dòl...

Un itema de previió heretada (L) en comparació amb el nou itema d’IBM.Hi ha miler de milion de telèfon intel·ligent en ú avui en dia que podem aprofitar per a coe com el infor...

Llegiu Avui