SlideShare ist ein Scribd-Unternehmen logo
1 von 64
Downloaden Sie, um offline zu lesen
Sviluppo di videogiochi su
piattaforma Android




Into the game

Massimo Carli
Danilo Riso
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;
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.
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.
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;
Cosa vuol dire sviluppare un
    videogioco?


•    Sprites;

•    Musica;

•    Effetti sonori;

•    Social gaming.
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.
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.
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.
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.
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.
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;
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.
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.
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.
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.
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.
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:
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.
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.
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.
Cosa vuol dire sviluppare un
videogioco?
Con l’aiuto di ASEPRITE realizziamo uno sprite animato, di quelli
presenti in Alien Attack:
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.
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.
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.
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.
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.
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/ ,
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.
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.
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.
Sviluppo di videogiochi su
piattaforma Android




AndEngine
Obiettivo




• Permettere lo sviluppo di giochi con la piattaforma Android
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
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
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
BaseActivity: task asincroni




• DEMO 1
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
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
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
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
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
SurfaceView




• DEMO 2 (flickering…? next slide!)
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
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
SurfaceView




• DEMO 3 (soluzione al flicker!)
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
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
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
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)
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()
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
Engine: Operazioni di update
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
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
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
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
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);
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);
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);
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);
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.
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/

Weitere ähnliche Inhalte

Andere mochten auch

Racconti di fine anno scolastico
Racconti di fine anno scolasticoRacconti di fine anno scolastico
Racconti di fine anno scolasticoLicia Tabanelli
 
Milano Game Makers Iniziative 2014
Milano Game Makers Iniziative 2014Milano Game Makers Iniziative 2014
Milano Game Makers Iniziative 2014Alexio Cassani
 
SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: COSA C’E’ OLTRE IL 2D. COMPRE...
SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: COSA C’E’ OLTRE IL 2D. COMPRE...SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: COSA C’E’ OLTRE IL 2D. COMPRE...
SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: COSA C’E’ OLTRE IL 2D. COMPRE...Danilo Riso
 
Retroprogramming - Programmare oggi il C64, by Giovanni Simotti
Retroprogramming - Programmare oggi il C64, by Giovanni SimottiRetroprogramming - Programmare oggi il C64, by Giovanni Simotti
Retroprogramming - Programmare oggi il C64, by Giovanni SimottiCodemotion
 
Italian Game Developer Summit - Microsoft Workshop
Italian Game Developer Summit - Microsoft WorkshopItalian Game Developer Summit - Microsoft Workshop
Italian Game Developer Summit - Microsoft WorkshopPier Luca Lanzi
 
Androidsdk appinventor
Androidsdk appinventorAndroidsdk appinventor
Androidsdk appinventorfdizazzo
 
Presentazione Focus Junior - Politecnico di Milano
Presentazione Focus Junior - Politecnico di MilanoPresentazione Focus Junior - Politecnico di Milano
Presentazione Focus Junior - Politecnico di MilanoPier Luca Lanzi
 
Linux Day 2013 Messina - Sviluppo di videogiochi in Linux
Linux Day 2013 Messina - Sviluppo di videogiochi in LinuxLinux Day 2013 Messina - Sviluppo di videogiochi in Linux
Linux Day 2013 Messina - Sviluppo di videogiochi in LinuxVittorio Romeo
 
Presentazione tesina
Presentazione tesinaPresentazione tesina
Presentazione tesinachicosstefan
 
Storia dell'Informatica in Italia
Storia dell'Informatica in ItaliaStoria dell'Informatica in Italia
Storia dell'Informatica in ItaliaRetronomicon
 
Codemotion 2012 - Con le mani puoi... programmare
Codemotion 2012 - Con le mani puoi... programmareCodemotion 2012 - Con le mani puoi... programmare
Codemotion 2012 - Con le mani puoi... programmarePaolo Aliverti
 
Programmazione android per esseri umani
Programmazione android per esseri umaniProgrammazione android per esseri umani
Programmazione android per esseri umaniRoberto Bettazzoni
 
Android programming
Android programmingAndroid programming
Android programmingPi Libri
 
Creare app senza programmare
Creare app senza programmareCreare app senza programmare
Creare app senza programmareTommaso Tosi
 
Programmare In Visual Basic, prima lezione
Programmare In Visual Basic, prima lezioneProgrammare In Visual Basic, prima lezione
Programmare In Visual Basic, prima lezioneHigh Secondary School
 
Introduzione alla programmazione Android - Android@tulug lezione 4
Introduzione alla programmazione Android - Android@tulug lezione 4Introduzione alla programmazione Android - Android@tulug lezione 4
Introduzione alla programmazione Android - Android@tulug lezione 4Ivan Gualandri
 

Andere mochten auch (20)

Racconti di fine anno scolastico
Racconti di fine anno scolasticoRacconti di fine anno scolastico
Racconti di fine anno scolastico
 
Milano Game Makers Iniziative 2014
Milano Game Makers Iniziative 2014Milano Game Makers Iniziative 2014
Milano Game Makers Iniziative 2014
 
SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: COSA C’E’ OLTRE IL 2D. COMPRE...
SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: COSA C’E’ OLTRE IL 2D. COMPRE...SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: COSA C’E’ OLTRE IL 2D. COMPRE...
SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: COSA C’E’ OLTRE IL 2D. COMPRE...
 
Retroprogramming - Programmare oggi il C64, by Giovanni Simotti
Retroprogramming - Programmare oggi il C64, by Giovanni SimottiRetroprogramming - Programmare oggi il C64, by Giovanni Simotti
Retroprogramming - Programmare oggi il C64, by Giovanni Simotti
 
Campus La Camilla -
Campus La Camilla - Campus La Camilla -
Campus La Camilla -
 
Italian Game Developer Summit - Microsoft Workshop
Italian Game Developer Summit - Microsoft WorkshopItalian Game Developer Summit - Microsoft Workshop
Italian Game Developer Summit - Microsoft Workshop
 
Androidsdk appinventor
Androidsdk appinventorAndroidsdk appinventor
Androidsdk appinventor
 
Presentazione Focus Junior - Politecnico di Milano
Presentazione Focus Junior - Politecnico di MilanoPresentazione Focus Junior - Politecnico di Milano
Presentazione Focus Junior - Politecnico di Milano
 
Linux Day 2013 Messina - Sviluppo di videogiochi in Linux
Linux Day 2013 Messina - Sviluppo di videogiochi in LinuxLinux Day 2013 Messina - Sviluppo di videogiochi in Linux
Linux Day 2013 Messina - Sviluppo di videogiochi in Linux
 
Presentazione tesina
Presentazione tesinaPresentazione tesina
Presentazione tesina
 
A Lezione Di
A Lezione DiA Lezione Di
A Lezione Di
 
Storia dell'Informatica in Italia
Storia dell'Informatica in ItaliaStoria dell'Informatica in Italia
Storia dell'Informatica in Italia
 
Codemotion 2012 - Con le mani puoi... programmare
Codemotion 2012 - Con le mani puoi... programmareCodemotion 2012 - Con le mani puoi... programmare
Codemotion 2012 - Con le mani puoi... programmare
 
Programmazione android per esseri umani
Programmazione android per esseri umaniProgrammazione android per esseri umani
Programmazione android per esseri umani
 
Android programming
Android programmingAndroid programming
Android programming
 
Creare app senza programmare
Creare app senza programmareCreare app senza programmare
Creare app senza programmare
 
Presentazione Corso Scratch 2.0
Presentazione Corso Scratch 2.0Presentazione Corso Scratch 2.0
Presentazione Corso Scratch 2.0
 
Programmare In Visual Basic, prima lezione
Programmare In Visual Basic, prima lezioneProgrammare In Visual Basic, prima lezione
Programmare In Visual Basic, prima lezione
 
Introduzione alla programmazione Android - Android@tulug lezione 4
Introduzione alla programmazione Android - Android@tulug lezione 4Introduzione alla programmazione Android - Android@tulug lezione 4
Introduzione alla programmazione Android - Android@tulug lezione 4
 
I giochi digitali
I giochi digitaliI giochi digitali
I giochi digitali
 

Ähnlich wie SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI

Soluzioni per la produzione multimediale
Soluzioni per la produzione multimedialeSoluzioni per la produzione multimediale
Soluzioni per la produzione multimedialeGianluca Vaglio
 
Desdinova Engine: Motore grafico 3D per rendering di ambienti outdoor in temp...
Desdinova Engine: Motore grafico 3D per rendering di ambienti outdoor in temp...Desdinova Engine: Motore grafico 3D per rendering di ambienti outdoor in temp...
Desdinova Engine: Motore grafico 3D per rendering di ambienti outdoor in temp...Daniele Ferla
 
Introduzione allo sviluppo UWP per xBox
Introduzione allo sviluppo UWP per xBoxIntroduzione allo sviluppo UWP per xBox
Introduzione allo sviluppo UWP per xBoxMassimo Bonanni
 
Dice-Play Presentation
Dice-Play PresentationDice-Play Presentation
Dice-Play PresentationALESSIOEBANI
 
Tecnologopercaso Magazine october 2013 ottobre
Tecnologopercaso Magazine october 2013 ottobreTecnologopercaso Magazine october 2013 ottobre
Tecnologopercaso Magazine october 2013 ottobreEdward Voskeritchian
 
Bad jokes codemotion milano 2014
Bad jokes codemotion milano 2014Bad jokes codemotion milano 2014
Bad jokes codemotion milano 2014Codemotion
 
Presentazione Creatività Lenticolare
Presentazione Creatività LenticolarePresentazione Creatività Lenticolare
Presentazione Creatività LenticolareTreD s.r.l.
 
Present kinect4 windows
Present kinect4 windowsPresent kinect4 windows
Present kinect4 windowsI3P
 
Come usare e ottimizzare le immagini per il web
Come usare e ottimizzare le immagini per il webCome usare e ottimizzare le immagini per il web
Come usare e ottimizzare le immagini per il webSiteGround.com
 
2012.05.24 sviluppare videogames...
2012.05.24   sviluppare videogames...2012.05.24   sviluppare videogames...
2012.05.24 sviluppare videogames...Marco Parenzan
 
Component Design Pattern nei Game Engine.pdf
Component Design Pattern nei Game Engine.pdfComponent Design Pattern nei Game Engine.pdf
Component Design Pattern nei Game Engine.pdfCommit University
 
Elaborato di "Sistemi Multimediali"
Elaborato di "Sistemi Multimediali"Elaborato di "Sistemi Multimediali"
Elaborato di "Sistemi Multimediali"Marco Vaiano
 
Grafica - SLIDE CORSO.pdf
Grafica - SLIDE CORSO.pdfGrafica - SLIDE CORSO.pdf
Grafica - SLIDE CORSO.pdfGiacomoMessina3
 
Compito di informatica in italiano
Compito di informatica in italianoCompito di informatica in italiano
Compito di informatica in italianoalessandrobritta
 

Ähnlich wie SVILUPPO DI VIDEOGIOCHI SU PIATTAFORMA ANDROID: TUTTA LA POTENZA SU DUE DIMENSIONI (20)

Soluzioni per la produzione multimediale
Soluzioni per la produzione multimedialeSoluzioni per la produzione multimediale
Soluzioni per la produzione multimediale
 
Desdinova Engine: Motore grafico 3D per rendering di ambienti outdoor in temp...
Desdinova Engine: Motore grafico 3D per rendering di ambienti outdoor in temp...Desdinova Engine: Motore grafico 3D per rendering di ambienti outdoor in temp...
Desdinova Engine: Motore grafico 3D per rendering di ambienti outdoor in temp...
 
Introduzione allo sviluppo UWP per xBox
Introduzione allo sviluppo UWP per xBoxIntroduzione allo sviluppo UWP per xBox
Introduzione allo sviluppo UWP per xBox
 
Dice-Play Presentation
Dice-Play PresentationDice-Play Presentation
Dice-Play Presentation
 
Tecnologopercaso Magazine october 2013 ottobre
Tecnologopercaso Magazine october 2013 ottobreTecnologopercaso Magazine october 2013 ottobre
Tecnologopercaso Magazine october 2013 ottobre
 
Lezione game making light
Lezione game making lightLezione game making light
Lezione game making light
 
Nui for real
Nui for realNui for real
Nui for real
 
Game & developer
Game & developerGame & developer
Game & developer
 
Bad jokes codemotion milano 2014
Bad jokes codemotion milano 2014Bad jokes codemotion milano 2014
Bad jokes codemotion milano 2014
 
Presentazione Creatività Lenticolare
Presentazione Creatività LenticolarePresentazione Creatività Lenticolare
Presentazione Creatività Lenticolare
 
Present kinect4 windows
Present kinect4 windowsPresent kinect4 windows
Present kinect4 windows
 
Il backstage dell'animazione
Il backstage dell'animazioneIl backstage dell'animazione
Il backstage dell'animazione
 
Come usare e ottimizzare le immagini per il web
Come usare e ottimizzare le immagini per il webCome usare e ottimizzare le immagini per il web
Come usare e ottimizzare le immagini per il web
 
CINEMA 4D presentazione
CINEMA 4D presentazioneCINEMA 4D presentazione
CINEMA 4D presentazione
 
2012.05.24 sviluppare videogames...
2012.05.24   sviluppare videogames...2012.05.24   sviluppare videogames...
2012.05.24 sviluppare videogames...
 
Component Design Pattern nei Game Engine.pdf
Component Design Pattern nei Game Engine.pdfComponent Design Pattern nei Game Engine.pdf
Component Design Pattern nei Game Engine.pdf
 
Elaborato di "Sistemi Multimediali"
Elaborato di "Sistemi Multimediali"Elaborato di "Sistemi Multimediali"
Elaborato di "Sistemi Multimediali"
 
Grafica - SLIDE CORSO.pdf
Grafica - SLIDE CORSO.pdfGrafica - SLIDE CORSO.pdf
Grafica - SLIDE CORSO.pdf
 
Compito di informatica in italiano
Compito di informatica in italianoCompito di informatica in italiano
Compito di informatica in italiano
 
Videogame e agile
Videogame e agileVideogame e agile
Videogame e agile
 

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

  • 1. Sviluppo di videogiochi su piattaforma Android Into the game Massimo Carli Danilo Riso
  • 2.
  • 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.
  • 33. Sviluppo di videogiochi su piattaforma Android AndEngine
  • 34. Obiettivo • Permettere lo sviluppo di giochi con la piattaforma Android
  • 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
  • 44. SurfaceView • DEMO 2 (flickering…? next slide!)
  • 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
  • 47. SurfaceView • DEMO 3 (soluzione al flicker!)
  • 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/