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.
3. 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;
4. 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.
5. 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.
6. Cosa vuol dire sviluppare un
videogioco?
Gli ingredienti di un gioco
Gli elementi che vanno considerati in un gioco sono i seguenti:
• Gameplay;
• Sceneggiatura;
• Storyboard;
• Gli sfondi;
7. Cosa vuol dire sviluppare un
videogioco?
• Sprites;
• Musica;
• Effetti sonori;
• Social gaming.
8. 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.
9. 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.
10. 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.
11. 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.
12. 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.
13. 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;
14. 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.
15. 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.
16. 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.
17. 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.
18. 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.
19. 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:
20. 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.
21. 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.
22. 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.
23. Cosa vuol dire sviluppare un
videogioco?
Con l’aiuto di ASEPRITE realizziamo uno sprite animato, di quelli
presenti in Alien Attack:
24. 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.
25. 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.
26. 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.
27. Cosa vuol dire sviluppare un
videogioco? diverse strade per poter ottenere
Generalmente si perseguono
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.
28. 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.
29. 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/ ,
30. 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.
31. 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.
32. 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.
35. 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
36. 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
37. 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
39. 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
40. 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
41. 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
42. 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
43. 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
45. 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
46. 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
48. 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
49. 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
50. 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
51. 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)
52. 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()
53. 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
55. 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
56. 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
57. 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
58. 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
59. 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);
60. 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);
61. 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);
62. 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);
63. Cosa vuol dire sviluppare un
videogioco?
Conclusioni
Lo 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.
64. Sviluppo di videogiochi su
piattaforma Android
A cura di
Danilo Riso
Email: danilo.riso@gmail.com
Massimo Carli
Email: carli@massimocarli.it
Sito web:
http://www.massimocarli.eu/