sviluppo di videogiochi su piattaforma android: tutta la potenza su due dimensioni

64
Sviluppo di videogiochi su piattaforma Android Into the game Massimo Carli Danilo Riso

Upload: danilo-riso

Post on 22-May-2015

2.573 views

Category:

Business


3 download

DESCRIPTION

Into the game. Le basi concettuali. Cosa sono sprites e i tiles. In cosa consistono gli effetti di scrolling e di parallasse. Come si realizzano le animazioni dei fondali e degli sprites . Quali sono gli strumenti adatti per realizzare la grafica, gli effetti sonori? Usare Allegro Sprites Editor, Tiled Map Editor, GiMP, GrafX2. Quali tecnologie scegliere per scrivere un gioco? Panoramica fra gli engine 2D free ed a pagamento attualmente disponibili sul mercato. Introduzione ad uno di questi. AndEngine. Come rendere redditizio lo sviluppo di un gioco. Scelta del target, scelta delle logiche di distribuzione, sceglierlo come veicolo pubblicitario.Impostare e gestire la logica del gioco con AndEngine. Come creare il corretto loop per la gestione del flusso del gioco; Impostazione del GameLoop e corrispondenti azioni. Concetti di multithreading applicati al gamingGestire le animazioni con AndEngine. Come creare grafica ed animazioni e come integrarle ed utilizzarle. Gestire gli eventi e le collisioni sprite-sprite e sprite-background. Impariamo a gestire sprites e tiles. In cosa consistono gli effetti di scrolling, parallasse e come si ottengono. Come si realizzano le animazioni dei fondali e degli sprites.

TRANSCRIPT

Page 1: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Sviluppo di videogiochi su piattaforma Android

Into the game

Massimo CarliDanilo Riso

Page 2: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI
Page 3: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Obiettivo

• Definire le basi concettuali: cosa vuol dire sviluppare un videogioco? Tipologie e categorie di videogiochi;

• Definire quali possono essere gli strumenti adatti per sviluppare un videogioco;

• Panoramica delle tecnologie e degli engine 2D utilizzabili a tal scopo;

• Introduzione ad uno di questi: AndEngine;• Elementi grafici ed effetti sonori;• Come rendere redditizio lo sviluppo di un videogioco;

Page 4: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?

• Lo sviluppo di un videogioco, per quanto possa sembrare banale come definizione, e’ la summa dell’utilizzo di effetti grafici e sonori, legato ad un certo livello di interattivita’ con l’utilizzatore, al fine di catturare parzialmente o completamente l’attenzione di quest’ultimo, con scopi totalmente ludici e di divertimento. Talvolta anche l’angoscia ed il terrore possono essere sorgente di coinvolgimento e divertimento per l’utilizzatore.

• Un po’ meno banali sono i metodi, tecnici e psicologici, attraverso i quali e’ possibile, da parte dello sviluppatore, riuscire ad ottenere questi effetti sull’utilizzatore.

Page 5: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?

Le basi concettuali

Ci possono essere diverse categorie di videogiochi. In base al tipo, cambiano gli approcci allo sviluppo e l’utilizzo degli strumenti adatti per poterli realizzare. Sicuramente e’ necessario avere tutta una serie di conoscenze di base per approcciare correttamente allo sviluppo di un gioco.

Page 6: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?

Gli ingredienti di un giocoGli elementi che vanno considerati in un gioco sono i seguenti:

• Gameplay;

• Sceneggiatura;

• Storyboard;

• Gli sfondi;

Page 7: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?

• Sprites;

• Musica;

• Effetti sonori;

• Social gaming.

Page 8: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?

Gameplay

Il gameplay e' la meccanica di gioco. E' un aspetto fondamentale da tenere in considerazione. L'interazione tra utilizzatore e gioco deve essere facile, rapida ed intuitiva. Inoltre il livello di difficolta' deve essere sempre ben calibrato, per non causare frustrazioni nel giocatore. Un gameplay molto curato aumenta le probabilita' di successo del prodotto, che non deve mai stancare. Essere vario ma mai complicato.

Page 9: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?

L'interfaccia che permette all'utente di controllare il gioco deve essere semplice. I dispositivi touchscreen beneficeranno, se possibile, di modalita' di input single touch. Per una esperienza di gioco piu' immediata e coinvolgente.

Page 10: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?

Sceneggiatura

Si indica la trama della storia e le modalita' con la quale i vari personaggi interagiscono tra di loro. All'interno della sceneggiatura vengono create le personalita' dei vari personaggi. Si individuano ed assegnano I vari ruoli. Questa fase e' fortemente dipendente dal tipo di gioco. Puo' infatti anche non essere presente una vera e propria sceneggiatura. Alcune tipologie di giochi non richiedono una sceneggiatura (es. gli scacchi). Gli RPG, al contrario, generalmente presentano trame particolarmente dettagliate.

Page 11: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?

Storyboard

Lo storyboard e' la cosiddetta sceneggiatura disegnata. Una volta stesa una sceneggiatura, e' necessario immaginarsi e raffigurare quale aspetto possa e debba presentare sullo schermo. E' quindi fondamentale che lo sceneggiatore collabori con il grafico, al fine di imprimere sulla carta le idee formulate. Lo scopo e' quello di arrivare a definire quanto piu' nel dettaglio possibile l'aspetto che dovra' avere il prodotto finale.

Page 12: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?

Questa fase permette di avere un'idea dell'impatto emotivo. Anche il comparto audio sara' inevitabilmente influenzato. Compito del musicista sara' proprio quello di adeguare i temi di accompagnamento all'atmosfera delle varie scene.

Page 13: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?

Gli sfondi

Sono elementi grafici che generalmente servono da ambientazione ed a creare l’atmosfera giusta. Gli sfondi possono essere preparati in diversi modi e poi inseriti all’interno del nostro progetto:

• e’ possibile creare delle bitmap statiche ed utilizzarle come fondale;• e’ possibile creare dei fondali dinamici, utilizzando un gruppo di

tiles (piastrelle) e delle mappe di posizionamento per quest’ultime;

Page 14: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?

L’utilizzo delle bitmap statiche e’ sempre possibile ma ci sono da considerare tutta una serie di problematiche non trascurabili:

• i fondali ottenuti non sarebbero dinamici senza l’utilizzo di procedure particolari e che porterebbero ad un aumento di complessita’ del codice;

• occupano piu’ memoria, rendendo quindi inevitabilmente piu’ grandi le applicazioni;

• bisogna stare molto attenti al caricamento in memoria perche’ le bitmap potrebbero occupare troppa memoria dinamica, saturando velocemente il buffer e causando situazioni di Out Of Memory dell’applicazione.

Page 15: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?

L’utilizzo dei tiles e dei file di mappe presenta le seguenti caratteristiche:

• i fondali ottenuti possono essere resi piu’ facilmente dinamici, proprio perche’ sono il risultato del posizionamento in base ad un file di mappa. Cambiando la mappa, cambia anche la disposizione degli elementi. Anche in una sola piccola porzione;

• occupano meno memoria, mantenendo la dimensione delle applicazioni su livelli accettabili;

• proprio in virtu’ del loro ridotto consumo in termini di memoria, risolvono brillantemente il problema legato a possibili Out Of Memory dell’applicazione.

Page 16: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?

Conclusioni:

Dati i vantaggi, il metodo dei tiles e’ sicuramente preferibile. Ciononostante e’ il buon senso che comunque deve saper consigliare. Il sistema dei tiles, rispetto alle bitmap statiche, richiede una lavorazione piu’ lunga e particolare. Nel caso di giochi effettivamente molto statici (es. poker o scacchi), l’utilizzo di bitmap statiche permetterebbe una realizzazione piu’ rapida dell’applicazione. Di contro in un gioco molto dinamico, con fondali in movimento (es. platform), data la flessibilita’ e la capacita’ di adattamento del sistema a tiles, l’effettivo tempo investito nella preparazione delle mappe e’ compensato da una maggiore semplicita’ del codice che dovra’ gestire la dinamicita’ dei fondali.

Page 17: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?Realizzazione di un fondale mediante l’utilizzo di tiles

Per poter realizzare un fondale abbiamo bisogno di due strumenti:

• Un programma per disegnare che supporti le trasparenze (es. GIMP – http://www.gimp.org);

• Un programma per disegnare i fondali in formato mappa e che sia in grado di salvare in formato TMX (es. Tiled Map Editor – http://www.mapeditor.org). Il file generati da questo programma sono utilizzabili in AndEngine.

Page 18: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?

Realizziamo un set di tiles con l’aiuto di GIMP. Qui sotto potete vedere il set di tiles utilizzato per la nostra applicazione demo Alien Attack:

L’immagine, di 128x128 pixel, e’ un quadrato composto da 4x4 tiles quadrate di 32x32 pixel.

Page 19: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?Una volta creato il set di tiles, bisogna creare la mappa che ne designera’ le posizioni. Per fare questo usiamo Tiled Map Editor:

Page 20: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?

Tiled Map Editor funziona esattamente come un programma di disegno. Solo che al posto della matita il puntatore disegna i fondali in base alla tile che e’ stata scelta. All’inizio si devono definire l’altezza e la larghezza espressi in numero di tiles ed il tipo di mappa (isometrica oppure ortogonale). La nostra mappa di esempio e’ ortogonale (visualizzazione laterale piatta).

Alla fine dell’operazione di disegno del fondale, bisogna salvare la mappa appena creata dal menu File -> Salva con nome. La mappa verra’ salvata in formato TMX. Il formato TMX non e’ altro che un XML personalizzato con alcuni tag definiti apposta per identificare le proprieta’ della mappa. Il fondale e’ pronto per essere importato nel progetto finale.

Page 21: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?

Gli sprites

Sprites:elementi grafici, animati e non, pilotati o meno dal giocatore. Che possono interagire con altri elementi del gioco. Possono essere collocati ovunque e rappresentano gli elementi attivi del gioco.

Page 22: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?Realizzazione di uno sprite

Per poter realizzare uno sprite abbiamo bisogno di due strumenti:

• Un programma per disegnare che supporti le trasparenze (es. GIMP – http://www.gimp.org);

• Un programma per disegnare sprites (es. Allegro Sprite Editor – http://www.aseprite.org).

In teoria potrebbe anche essere sufficiente solo GIMP per tutta la fase di creazione. Ma per la visualizzazione e la simulazione dell’animazione dello sprite, risulta essere

piu’ pratico l’Allegro Sprite Editor.

Page 23: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?Con l’aiuto di ASEPRITE realizziamo uno sprite animato, di quelli presenti in Alien Attack:

Page 24: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?

Alla fine del processo ASEPRITE permette di salvare tutti i frame creati in formato PNG. Per avere un risultato facilmente utilizzabile, conviene unire le PNG create in un unico file, utilizzando GIMP:

L’immagine, di 320x32 pixel, e’ un quadrato composto da 10x1 tiles quadrate di 32x32 pixel.

Page 25: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?

Musica

La musica e’ un aspetto importantissimo dei videogiochi. Deve essere cura del musicista produrre dei temi musicali adeguati alle atmosfere ricercate nel prodotto. Anche se non sempre e’ necessario un tema sonoro di sottofondo. La trattazione, data la vastita’ della materia, merita di essere approfondita a parte.

Page 26: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?

Effetti sonori

Anche gli effetti sonori sono importantissimi perche’ aggiungono ancora piu’ spessore ed atmosfera al gioco. La figura professionale che produce gli effetti sonori non sempre e’ allineata a quella del musicista.

Page 27: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?

Generalmente si perseguono diverse strade per poter ottenere gli effetti sonori che necessitano ad un gioco:

• Si comprano dei set di effetti sonori campionati da qualcun altro;• Si realizzano i propri campioni sonori, alla stregua di quello che

farebbe un rumorista;

Si utilizzano programmi audio (es. Audacity – http://audacity.sourceforge.net/) per generare forme d’onda di natura diversa e le si combina, applicando dei filtri, al fine di ottenere un effetto sonoro di sintesi quanto piu’ vicino al risultato desiderato (procedura che e’ stata utilizzata per creare gli effetti di Alien Attack).

Al giorno d’oggi, data la disponibilita’ di abbondante materiale sia gratis che a pagamento, generalmente si opta per

la prima soluzione.

Page 28: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?

Social gaming

Con la diffusione di connessioni di tipo broadband, cambiano anche I punti di vista relativi al gaming. Attualmente i videogiochi sono diventati accessori estremamente pervasivi grazie alle possibilita’ offerte dalla rete. Ed il gioco on line e’ l’ultima frontiera (per il momento). La possibilita’ di interagire con persone sconosciute e/o lontane. Sono tutte cose che attirano sempre di piu’ i videogiocatori.Quindi lo sviluppo di un nuovo concept per un videogioco non puo’ non tener conto di questo aspetto che ha delle notevoli ricadute anche di natura economica.

Page 29: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Panoramica sugli engine 2D gratuiti attualmente disponibili

Le piattaforme che e’ possibile reperire in rete sono diverse:

• AndEngine - http://www.andengine.org/ ;• Mage Game Engine – http://http://code.google.com/p/mages/ ;• Candroidengine – http://code.google.com/p/candroidengine/;• cocos2d-android – http://code.google.com/p/cocos2d-android/;• libgdx – http://libgdx.badlogicgames.com/ ,

Page 30: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Panoramica sugli engine 2D a pagamento attualmente disponibili

• Corona - http://www.anscamobile.com/corona/index.html;• Cuttlefish Engine – http://http://http://www.cuttlefishengine.com/;

Noi approfondiremo AndEngine, perche’ gratuito, tra le piu’ complete e con una solida community alle spalle.

Page 31: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Come rendere redditizio il proprio prodotto

Di base si deve considerare che il target Android e molto diverso da quello di altri mercati, iPhone in primis. L’utente Android medio spende meno per le applicazioni e per i giochi. Questo deve quindi spingerci ad adottare un modello di business sostenibile, per rendere redditizio il nostro lavoro.

Page 32: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Come rendere redditizio il proprio prodotto

Questi sono I punti che a grandi linee andrebbero osservati:

• Rilascio di prodotti di qualita’, con aggiornamenti frequenti;• Adozione di meccanismi di sponsorizzazione internamente

all’applicazione (admob);• Nel caso si intendesse invece rilasciare l’applicazione a pagamento,

prezzi contenuti;• La possibilita’ di acquisto in-app, di livelli e features aggiuntivi.

Il caso Angry Birds per Android dovrebbe far riflettere. Tutti i precedenti punti vengono soddisfatti.

Page 33: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Sviluppo di videogiochi su piattaforma Android

AndEngine

Page 34: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Obiettivo

• Permettere lo sviluppo di giochi con la piattaforma Android

Page 35: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

AndEngine: come ottenerlo

• Progetto Open Source di Nicolas Gramlich• Home del progetto: http://www.andengine.org/• Sorgenti scaricabili con Mercurial

• http://code.google.com/p/andengine/

• Plugin eclipse Mercurial: • http://cbes.javaforge.com/update

Page 36: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Concetti Base: GameBaseActivity• Specializzazione della classe Activity che contiene la

SurfaceView sulla quale l’Engine andrà a visualizzare i diversi componenti grafici

• Gestisce l’interazione con il ciclo di vita di una Activity• Estende la classe BaseActivity aggiungendo la possibilità di

eseguire alcune operazioni in modalità asincrona• Implementa l’interfaccia IGameInterface che definisce le

operazioni principali nel ciclo di vita di una GameBaseActivity

• Utilizza i metodi classici di Android nella comunicazione con gli altri componenti dell’architettura

Page 37: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

BaseActivity: task asincroni

• Callable<T> • Astrazione del task in grado di creare un altro oggetto di tipo T

• Callback<T>• Astrazione dell’oggetto in grado di ricevere l’oggetto T creato da

un Callable<T>

• AsyncCallable<T>• Astrazione dell’oggetto in grado di eseguire un task per la

creazione di un oggetto di tipo T e di notificarne la creazione ad un Callback<T> o Callback<Exception> a seconda dell’esito

• Attenzione: L’esecuzione in un Thread separato rispetto a quello della UI è responsabilità del chiamante

• ProgressCallable<T> • Astrazione del task in grado di creare un oggetto di tipo T e di

notificare ad un IProgressListener lo stato di avanzamento

Page 38: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

BaseActivity: task asincroni

• DEMO 1

Page 39: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

BaseActivity: ciclo di vita

• La classe BaseActivity lega il ciclo di vita di una Activity a quello di un gioco

• onCreate()• Imposta lo stato di pausa del gioco (mPaused=true)• Inizializza l’Engine invocando il metodo onLoadEngine()• Configura l’Engine attraverso le EngineOptions impostate• Imposta la SurfaceView descritta dalla classe

RenderSurfaceView

Page 40: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

BaseActivity: ciclo di vita

(*) solo la prima volta (mGameLoaded)

• onResume()• Carica le risorse invocando il metodo onLoadResource() (*)• Crea la Scene invocando il metodo onLoadScene() (*)• Notifica all’Engine il caricamento della Scene (*)• Notifica il termine della inizializzazione invocando

onLoadComplete() (*)• Imposta il gioco come non in pausa (mPaused=false) ed

acquisisce il WakeLock• Notifica il resume all’Engine• Notifica il resume alla SurfaceView• Avvia l’Engine invocando il metodo start()• Invoca onGameResumed() come punto di estensione

Page 41: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

BaseActivity: ciclo di vita

• onPause()• Imposta lo stato di pausa del gioco (mPaused=true)• Rilascia il WakeLock• Notifica lo stato di pause all’Engine attraverso onPause() e

successivamento lo ferma invocando il metodo stop()• Notifica lo stato di pause alla SurfaceView • Invoca onGamePaused() come punto di estensione

• onDestroy()• Ferma il Thread gestito dall’Engine• Libera le eventuali risorse allocate invocando il metodo

onUnloadResources() la cui implementazione di default libera le risorse relative ai suoni

Page 42: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Interfaccia IGameInterface• Aggiunge alla classe BaseActivity i metodi di callback per la

gestione del gioco• Operazioni da implementare necessariamente

• public Engine onLoadEngine(); // Inizializzazione Engine• public void onLoadResources(); // Caricamento risorse• public Scene onLoadScene(); // Definizione Scena• public void onLoadComplete(); // Avvio Engine

• Operazioni già implementate da specializzare all’occorrenza• public void onUnloadResources(); // Liberazione risorse• public void onGamePaused(); // Punto di estensione per pausa

gioco• public void onGameResumed(); // Punto di estenzione per

ripresa gioco

Page 43: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

SurfaceView

• In AndEngine sono state realizzate alcune classi che ora sono presenti nell’SDK di Android • AndEngine è compatibile con la versione 1.6 della piattaforma• Alcune classi sono state modificare a causa di bug

• SurfaceView• Specializzazione della classe View che rappresenta una

superficie di disegno all’interno della gerarchia dei componenti visuali

• L’accesso alla SurfaceView avviene attraverso una implementazione di SurfaceView.Holder ottenuta da essa attraverso il metodo getHolder()

• Questo meccanismo permette di delegare la gestione del disegno sulla SurfaceView ad un Thread diverso da quello principale

Page 44: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

SurfaceView

• DEMO 2 (flickering…? next slide!)

Page 45: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

SurfaceView flickering

• In Android ogni Window viene implementata con una SurfaceView gestita da un SurfaceFlinger • Astrazione del motore 2D di Android

• Per ciascuna Surface è gestito il double buffering • Una Surface utilizzata come buffer• Una Surface utilizzata per la visualizzazione

• Invocando il metodo unlockCanvasAndPost () la prima viene riversata nella seconda

Page 46: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

SurfaceView flickering

• La maggior parte delle implementazioni switcha le due Surface• Minimizza il trasferimento di informazioni tra i buffer• Il SurfaceFlinger ha sempre un buffer a disposizione e non deve

mettersi in wait in attesa di informazioni disponibili• Il sistema è robusto rispetto alle applicazioni non “di qualità”

• Questo dovrebbe impedire il flickering, ma????• Le chiamate al Canvas influenzano solo il “back” buffer e non

quello visibile in quel momento• Si ha un flicker!!!

• Soluzione:• È necessario disegnare su entrambi i buffer che si alternano • Oppure disegnare ogni volta tutto lo “stato” della nostra Scene

Page 47: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

SurfaceView

• DEMO 3 (soluzione al flicker!)

Page 48: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

GLSurfaceView• Specializzazione della SurfaceView che utilizza gli strumenti

OpenGL attraverso EGL (Embedded-System Graphics Library)• Utilizzata al posto della omonima dell’SDK di Android come

workaround di un bug che porta a deadlock nel caso di Activity successive che utilizzano una stessa GLSurfaceView

• Delega il rendering ad un oggetto di tipo Render responsabile della generazione dei frame attraverso gli strumenti OpenGL• Esso agisce in un Thread separato rispetto a quello principale di

gestione della UI

• Supporta diversi tipi di rendering• Rendering on-demand• Continuous Rendering

• Fornisce strumenti per ottenere informazioni di debug e tracing

Page 49: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

GLSurfaceView• Configurazione EGL

• I device Android possono gestire diversi tipi di Surface che si differiscono per il numero di canali e per la quantità di bit per ciascuno di essi

• E importante scegliere la configurazione ideale. Di default viene scelta quella configurazione più vicina ad una supefice 16-bit R5G6B5 con un buffer di profondità di 16 bit senza stencil

• Renderer• È l’oggetto responsabile del rendering dei frame sulla superficie• Di default la modalità di rendering è quella continua

• È possibile impostarla on-demand attraverso il metodo setRenderMode()

• Interazione con il ciclo di vita dell’Activity• Ogni GLSurfaceView deve essere notificata dello stato

dell’Activity in cui è visualizzata• onPause() quando l’Activity va nello stato di pausa• onResume() quando l’Activity viene riattivata

Page 50: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

RenderSurfaceView

• Specializzazione della classe GLSurfaceView• Utilizza una particolare implementazione di Renderer che

utilizza gli strumenti dell’Engine per la visualizzazione dei frame

• Delega l’esecuzione della seguente operazione alla analoga dell’Engine

Page 51: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Engine• Oggetto responsabile della renderizzazione degli elementi

del gioco• Simile alla classe SurfaceViewThread dell’esempio precedente

• Viene inizializzato attraverso l’utilizzo di un EngineOptions• Interagisce con lo stato della GameActivity attraverso

l’invocazione delle operazioni onResume() ed onPause()• Delega la gestione degli update ad un Thread descritto dalla

classe UpdateThread• Viene avviato alla creazione dell’Engine• Ha una priorità configurazione attraverso le EngineOptions• Invoca ripetutamente il metodo onTickUpdate() sull’Engine• Può essere interrotto attraverso il metodo interrupt()• Gestire l’intervalli tra tick diversi con la precisione dei

nanosecondi (10-9s)

Page 52: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Engine: Operazioni di update (continua)

• Calcola i tempi relativi all’intervallo dall’ultimo tick, tempo totale etc

• Notifica l’evento all’eventuale oggetto ITouchController per la gestione degli eventi di touch

• Notifica il tick agli eventuali Handler• IUpdateHandler : • RunnableHandler :

• Gestisce la sincronizzazione degli elementi attraverso il metodo yieldDraw()• Utilizza un oggetto di tipo State (mThreadLocker)come semaforo

per la sincronizzazione• Notifica la disponibilità di contenuti da visualizzare

notifyCanDraw()• Si mette in wait() per disegnare: waitUntilCanUpdate()

Page 53: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Engine: Operazioni di update (continua)

• L’utilizzo del semaforo State serve per la sincronizzazione con il metodo di renderizzazione ovvero il metodo onDrawFrame() • Ci si mette in wait() in attesa di poter renderizzare con il metodo

waitUntilCanDraw()• Si aggiorna lo stato delle Texture attraverso il TextureManager• Si aggiorna lo stato dei font attraverso il FontManager• Si gestisce il buffer di oggetti attraverso un

BufferObjectManager• Si disegna la scena attraverso il metodo onDrawScene() il quale

invoca il metodo onDraw() sulla Scene passando Camera e contesto GL

• Si notifica la possibilità di un aggiornamento invocando il metodo notifyCanUpdate() sul semaforo State

Page 54: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Engine: Operazioni di update

Page 55: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Engine: IUpdateHandler • Interfaccia che descrive gli oggetti in grado di essere

aggiornati a seguito di un tick dell’UpdateThread• Definisce le operazioni onUpdate() e reset()• Si registrano all’Engine attraverso le operazioni

registerUpdateHandler() unregisterUpdateHandler() e clearUpdateHandlers()

• Definisce l’interfaccia interna IUpdateHandlerMatcher come specializzazione di IMatcher per oggetti di tipo IUpdateHandler • IMatcher<T> definisce il metodo matches() di confronto tra due

oggetti di tipo T

• Esistono diverse implementazioni :• IEntity• Gestione collisioni• Emitter

Page 56: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

EngineOptions

• Contiene le informazioni di inizializzazione di un Engine• Gestione del fullscreen (boolean)• Gestione dell’orientation (enum

EngineOptions.ScreenOrientation)• Informazioni relative alla risoluzione: IResolutionPolicy

• Contiene il riferimento alla Camera• Opzioni relative alle operazioni di touch

• TouchOptions

• Opzioni relative alle operazioni di renderizzazione• RenderOptions

• Abilitazione di musica ed effetti sonori• Gestisce il livello di priorità dell’UpdateThread

Page 57: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

IResolutionPolicy• Interfaccia che permette di impostare il modo con cui la

RenderSurfaceView ridimensionata a seconda dei diversi display dei dispositivi

• Ne esistono diverse implementazioni• RatioResolutionPolicy: riempie lo schermo mantenendo il

rapporto tra le dimensioni• FillResolutionPolicy: riempie tutto lo schermo• FixedResolutionPolicy: dimensioni fisse• RelativeResolutionPolicy:

• Sono informazioni usate dall’Engine

Page 58: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Es: FillResolutionPolicy• Il meccanismo utilizzato è quello di gestione del layout delle

View• Invocazione del metodo onMeasure()• Invocazione del metodo onLayout()

• La SurfaceView di AndEngine notifica al Layout contenitore quelle che sono le sue richieste in termini di dimensione

• La FillResolutionPolicy richiede tutto lo spazio a disposizione

Page 59: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Scene

La “Scene”, in AndEngine, identifica appunto la scena che verra' realizzata con l'aggiunta delle varie entity. In fase di inizializzazione viene assegnato un numero che identifica il numero di “layer” (strati) di cui sara' composta. Ogni strato puo' essere inteso come un livello differente di profondita':

Es: scene = new Scene(9);

Per comporre una “scene” ed assegnare gli oggetti ai “layer” giusti, si utilizza una chiamata simile a questa:

scene.getLayer(LAYER_SCORE).addEntity(this.mScoreText);

Page 60: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Entity

Le entity sono gli elementi propriamente detti che concorreranno a comporre la scene. Le entity possono essere composte da grafica e testo (sprites e scritte). Anche gli sfondi sono entity. Esse vengono inserite specificando il livello sul quale andranno visualizzate (getLayer):

Es. scene.getLayer(LAYER_BACKGROUND).addEntity(tmxLayer);

scene.getLayer(LAYER_SCORE).addEntity(this.mScoreText);

Page 61: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Texture e ITextureSource

Le Texture sono aree di memoria che vengono impiegate per stoccare le immagini provenienti dalle resources appena caricate. Vengono create utilizzando un sistema di coordina te interne. Questo per rendere meno dispersivo e piu' efficiente la gestione degli elementi grafici. In verita' l'utente non avra' bisogno delle coordinate per richiamare i pezzi di grafica interessati. Bastera' assegnare alle varie aree una TextureRegion.

Es. this.mTexture = new Texture(1024, 256,

TextureOptions.BILINEAR_PREMULTIPLYALPHA);

Page 62: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

TextureRegion

Le TextureRegion permettono di identificare univocamente una regione di texture, che potra' essere utilizzata per creare, ad esempio, uno sprite:

Es.this.mBulletTextureRegion =

TextureRegionFactory.createFromAsset(this.mTexture, this, "bullet_sprites.png", 0, 0);

mBullet = new Bullet(-(3*CELL_WIDTH), (-(12*CELL_HEIGHT)), 8, 8, this.mBulletTextureRegion);

Page 63: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Cosa vuol dire sviluppare un videogioco?

ConclusioniLo sviluppo di videogiochi e’ un’arte ed una materia a se stante, che richiede il totale impegno da parte di diverse figure professionali.Con gli standard qualitativi attuali non e’ possibile per un singolo individuo svolgere tutte le mansioni a livelli accettabili. Da impegno modesto puo’ nascere solo un prodotto modesto.E’ necessario quindi che il vento cambi nel panorama dello sviluppo italiano. Dobbiamo poter competere a livello internazionale con realta’ bene consolidate. Bisogna stimolare la formazione di gruppi di sviluppatori indipendenti, capaci di portare a termine autonomamente progetti di piu’ ampio respiro. Attualmente sono disponibili tecnologie, quali AndEngine, molto sofisticate ed il cui studio permette sicuramente l'ottenimento di buoni risultati in tempi brevi.

Page 64: SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Sviluppo di videogiochi su piattaforma AndroidA cura di

Danilo RisoEmail: [email protected]

Massimo CarliEmail: [email protected] web:

http://www.massimocarli.eu/