Autore Topic: Sviluppare un videogame: View o Canvas?  (Letto 2540 volte)

Offline pivot

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Sistema operativo:
    Windows
Sviluppare un videogame: View o Canvas?
« il: 29 Marzo 2010, 19:24:11 CEST »
0
Chiedo il vostro aiuto per risolvere il mio dilemma.

Vorrei implementare un semplice videogioco. Non ho mai lavorato con l'aspetto grafico, nel senso vero del termine, ho sempre solo usato i widget/controlli messi a disposizione dal linguaggio in uso e relative librerie. Il gioco è comunque semplice e non avrebbe bisogno di molta elaborazione o framerate. Ora potrei scegliere di usare le normali View con relativo layout e widget derivati (Button, ImageButton, ecc) oppure di lavorare direttamente sul canvas. Ho anche letto qualcosina su SurfaceView, da valutare anche questa ipotesi.

Per esempio uno dei problemi che mi sono posto è: dovrei posizionare 4 pulsanti, incolonnati in una tabella 2x2. Al centro della tabella, quindi sovrapposto parzialmente ai 4 tasti, vorrei piazzare un altro oggetto circolare. Questo riesco ad ottenerlo con le sole View e Layout o sono costretto ad utilizzare i Canvas e disegnare manualmente?

Se uso Canvas devo gestire io il layout? Dimensioni diverse dello schermo ecc?
Con i Canvas posso caricare una immagine già pronta nella posizione che decido io ed eventualmente ridimensionarla per adattarla alla dimensione dello schermo?

Immagino che usando i widget di Android evito tutto il peso della gestione degli eventi, mentre con i Canvas penso di dover gestire molto di più manualmente.

Scusate le domande, tante e magari banali, ma già sono niubbo di Android e in più lo sono anche di Canvas e grafica.

Offline Giovanni

  • Nuovo arrivato
  • *
  • Post: 40
  • Respect: 0
    • Google+
    • giovanniperroneonebit
    • giovanniperrone
    • giovanniperrone
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    Ubuntu / Vista
Re:Sviluppare un videogame: View o Canvas?
« Risposta #1 il: 29 Marzo 2010, 22:19:49 CEST »
0
Ti consiglio di dare uno sguardo all'esempio "Snake" presente nell'ADK.

In questo esempio viene utilizzata una View Custom (com.example.android.snake.SnakeView) e una classica TextView, forse potrebbe fare al caso tuo:
http://developer.android.com/resources/samples/Snake/index.html

Ecco il layout usato:

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2007 The Android Open Source Project

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
-->

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent">

        <com.example.android.snake.SnakeView
        android:id="@+id/snake"
               android:layout_width="fill_parent"
               android:layout_height="fill_parent"
               tileSize="24"
               />

        <RelativeLayout
               android:layout_width="fill_parent"
               android:layout_height="fill_parent" >

                <TextView
                android:id="@+id/text"
                       android:text="@string/snake_layout_text_text"
                       android:visibility="visible"
                       android:layout_width="wrap_content"
                       android:layout_height="wrap_content"
                       android:layout_centerInParent="true"
                       android:gravity="center_horizontal"
                       android:textColor="#ff8888ff"
                       android:textSize="24sp"/>
        </RelativeLayout>
</FrameLayout>

Offline pivot

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Sistema operativo:
    Windows
Re:Sviluppare un videogame: View o Canvas?
« Risposta #2 il: 29 Marzo 2010, 23:45:44 CEST »
0
Grazie Giovanni, stavo proprio studiando il sample snake.

Rimanendo al discorso layout, il FrameLayout disegna gli oggetti uno sull'altro e posizionandoli in alto a sinistra. Il RelativeLayout che contiene TextView serve solo per permettere di centrare il testo nello schermo? Poi si gioca sul visible per farlo vedere o meno?

Offline Giovanni

  • Nuovo arrivato
  • *
  • Post: 40
  • Respect: 0
    • Google+
    • giovanniperroneonebit
    • giovanniperrone
    • giovanniperrone
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    Ubuntu / Vista
Re:Sviluppare un videogame: View o Canvas?
« Risposta #3 il: 29 Marzo 2010, 23:52:42 CEST »
0
Esatto, la TextView è visibile solo quando il gioco non è "Running" e si sovrappone alla View Custom.


Codice (Java): [Seleziona]
    /**
     * Updates the current mode of the application (RUNNING or PAUSED or the like)
     * as well as sets the visibility of textview for notification
     *
     * @param newMode
     */

    public void setMode(int newMode) {
        int oldMode = mMode;
        mMode = newMode;

        if (newMode == RUNNING & oldMode != RUNNING) {
            mStatusText.setVisibility(View.INVISIBLE);
            update();
            return;
        }

        Resources res = getContext().getResources();
        CharSequence str = "";
        if (newMode == PAUSE) {
            str = res.getText(R.string.mode_pause);
        }
        if (newMode == READY) {
            str = res.getText(R.string.mode_ready);
        }
        if (newMode == LOSE) {
            str = res.getString(R.string.mode_lose_prefix) + mScore
                  + res.getString(R.string.mode_lose_suffix);
        }

        mStatusText.setText(str);
        mStatusText.setVisibility(View.VISIBLE);
    }

Offline Davide_77

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Sistema operativo:
    Win XP
Re:Sviluppare un videogame: View o Canvas?
« Risposta #4 il: 30 Marzo 2010, 10:06:17 CEST »
0
Ciao, scusate...
ho dato un occhio all'esempio, per cui essendo nuovo correggetemi se sbaglio...
per creare l'animazione del serpente viene di fatto ricreata l'intera View ogni tot millisecondi... ho capito bene?
Codice (Java): [Seleziona]
          if (now - mLastMove > mMoveDelay) {
                clearTiles();
                updateWalls();
                updateSnake();
                updateApples();
                mLastMove = now;
            }
            mRedrawHandler.sleep(mMoveDelay);

io sono ignorante di animazioni e mi interessa molto imparare... ma non mi sembra una gran cosa a livello di performance se si hanno tante cose che devono muoversi....

Sbaglio?

Offline Giovanni

  • Nuovo arrivato
  • *
  • Post: 40
  • Respect: 0
    • Google+
    • giovanniperroneonebit
    • giovanniperrone
    • giovanniperrone
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    Ubuntu / Vista
Re:Sviluppare un videogame: View o Canvas?
« Risposta #5 il: 30 Marzo 2010, 10:17:11 CEST »
0
Sì è giusto quello che dici, viene richiamato "invalidate()" ogni X ms tramite l'handler "mRedrawHandler". Snake non necessita un gran numero di Fps, come del resto la maggior parte dei giochi per cellulari (puzzle, carte, ecc).
Se vuoi le performance devi passare a OpenGL ES.

Offline Davide_77

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Sistema operativo:
    Win XP
Re:Sviluppare un videogame: View o Canvas?
« Risposta #6 il: 30 Marzo 2010, 10:24:11 CEST »
0
Si certo... lo immaginavo...
Scusate per le domande banali, ma ho pochissimo tempo libero e sto cercando di farmi un'idea sul funzionamento generale...
Considerando che è tutto nuovo per me, sopportatemi! ;)

Offline Giovanni

  • Nuovo arrivato
  • *
  • Post: 40
  • Respect: 0
    • Google+
    • giovanniperroneonebit
    • giovanniperrone
    • giovanniperrone
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    Ubuntu / Vista
Re:Sviluppare un videogame: View o Canvas?
« Risposta #7 il: 30 Marzo 2010, 11:22:47 CEST »
0
Si certo... lo immaginavo...
Scusate per le domande banali, ma ho pochissimo tempo libero e sto cercando di farmi un'idea sul funzionamento generale...
Considerando che è tutto nuovo per me, sopportatemi! ;)

Figurati sia qui per imparare! (Tutti)

Offline BiiO

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic
  • Sistema operativo:
    Mac OS
Re:Sviluppare un videogame: View o Canvas?
« Risposta #8 il: 30 Marzo 2010, 12:42:05 CEST »
0
Comunque anche se il gioco è molto semplice, tramite le OpenGL ES come suggerito da Giovanni, avresti diversi altri vantaggi, tracui il riuso anche in altri giochi, e sicuramente la possibilità di effettuare rotazioni e altri effetti in maniera molto rapida...

Io sto riorganizzando un mio framework per Android, e implementerò il motore grafico direttamente in OpenGL ES... ma mi ci vorrà ancora un pochino  :-) 

Offline pivot

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Sistema operativo:
    Windows
Re:Sviluppare un videogame: View o Canvas?
« Risposta #9 il: 30 Marzo 2010, 18:21:14 CEST »
0
Ho pensato anche io come davide che era superfluo ridisegnare tutto, anche perchè oltre al serpente e alle mele non c'è altro da ridisegnare.
Però penso che comunque la View venga ridisegnata nel suo complesso una volta che chiamo invalidate, quindi tanto vale. O sbaglio?

Relativamente alle OpenGL io non so nulla, però se mi dite che è così semplice realizzare certi effetti ci penso. Avrei delle immagini già pronte che si ripetono a seconda dell'evolversi del gioco, si possono caricare anche immagini con opengl o devo sempre disegnare tutto?
Ed in questo caso uso direttamente canvas o adotto sempre il canvas della view.

Invece mi spiegate il funzionamento dell'handler che non mi è molto chiaro?

Offline Giovanni

  • Nuovo arrivato
  • *
  • Post: 40
  • Respect: 0
    • Google+
    • giovanniperroneonebit
    • giovanniperrone
    • giovanniperrone
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    Ubuntu / Vista
Re:Sviluppare un videogame: View o Canvas?
« Risposta #10 il: 31 Marzo 2010, 18:22:08 CEST »
0
Ho pensato anche io come davide che era superfluo ridisegnare tutto, anche perchè oltre al serpente e alle mele non c'è altro da ridisegnare.
Però penso che comunque la View venga ridisegnata nel suo complesso una volta che chiamo invalidate, quindi tanto vale. O sbaglio?

Relativamente alle OpenGL io non so nulla, però se mi dite che è così semplice realizzare certi effetti ci penso. Avrei delle immagini già pronte che si ripetono a seconda dell'evolversi del gioco, si possono caricare anche immagini con opengl o devo sempre disegnare tutto?
Ed in questo caso uso direttamente canvas o adotto sempre il canvas della view.

Invece mi spiegate il funzionamento dell'handler che non mi è molto chiaro?

Dipende da cosa devi fare...

Per quanto riguarda OpenGL ti consiglio i tutorial di NeHe (guarda sulla sinistra ci sono 48 Lezioni) sono scritti in C++ (io ho iniziato con questi nel 2001, usando Visual C++ 6).
http://nehe.gamedev.net/default.asp

Spiega tutto (o quasi) dal texture mapping fino agli Shader.
Per l'integrazione con Android e Java guarda qui:
http://developer.android.com/guide/topics/graphics/opengl.html

L'handler serve a gestire il refresh della Custom View, cosa non ti è chiaro?



Offline pivot

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Sistema operativo:
    Windows
Re:Sviluppare un videogame: View o Canvas?
« Risposta #11 il: 31 Marzo 2010, 22:39:56 CEST »
0
Grazie Giovanni per i consigli.

Non conosco gli Handler. Leggendo la descrizione della classe Handler, ho capito che viene usato come se fosse un timer che esegue un'azione quando richiesto.

Offline BiiO

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic
  • Sistema operativo:
    Mac OS
Re:Sviluppare un videogame: View o Canvas?
« Risposta #12 il: 01 Aprile 2010, 09:52:13 CEST »
0
Per le OpenGL ES c'è anche il porting già pronto delle lezioni di NeHe per Android, compreso demo già pronto da scaricare nel market.

http://code.google.com/p/nehe-android/

Offline pivot

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Sistema operativo:
    Windows
Re:Sviluppare un videogame: View o Canvas?
« Risposta #13 il: 04 Aprile 2010, 22:46:57 CEST »
0
Seguendo l'esempio di Snare sto facendo un po' di prove.

Così come avviene su Snare ho creato un array di Bitmap dove carico le immagini che mi servono. Queste le ridimensiono per tentare di adattarmi alle varie risoluzioni.
Accade però che ottengo il seguente errore quando carico le bitmap:

java.lang.OutOfMemoryError: bitmap size exceeds VM budget

Come procedere allora? Instanziare la bitmap ogni volta che serve? non è troppo dispendioso?
Pensavo di procedere come su Snare per avere tutte le immagini pronte, ma a questo punto non è possibile.

Idee?
« Ultima modifica: 06 Aprile 2010, 15:07:22 CEST da pivot »

Offline Giovanni

  • Nuovo arrivato
  • *
  • Post: 40
  • Respect: 0
    • Google+
    • giovanniperroneonebit
    • giovanniperrone
    • giovanniperrone
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    Ubuntu / Vista
Re:Sviluppare un videogame: View o Canvas?
« Risposta #14 il: 06 Aprile 2010, 12:25:20 CEST »
0
Potresti fare l'override del metodo "onSizeChanged"

Codice (Java): [Seleziona]
@Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        }

così puoi caricare i bitmap a seconda della risoluzione.