Autore Topic: [andengine] onAreaTouched su istanze di Sprite che non funziona come dovrebbe  (Letto 1300 volte)

Offline devandroid

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
Salve,
sono nuovo del forum spero di poter ricevere aiuto.
Sto creando un gioco usando la libreria andengine.
Nella scena ho diverse istanze (oggetti) di una classe che estende la classe Sprite. Ogni oggetto ha un metodo al suo interno onAreaTouch nel quale registro sull'oggetto un animazione con una EntityModifier.
Cliccando su ogni singolo oggetto parte l'animazione di quell'oggetto.
Lo scenario spiacevole che si viene a creare è che a catena ad ogni click l'animazione viene riprodotta su tutti gli oggetti precedentemente cliccati. Come se al click l'oggetto fosse messo in uno stack e le azioni fossere propagata a tutti gli oggetti cliccati fino a quel momento.
Vi posto il codice:

MainActivity
Codice (Java): [Seleziona]
@Override
    public Scene onLoadScene() {
           
                this.en.registerUpdateHandler(new FPSLogger());
       
            final Scene scene = new Scene();
            scene.setBackground(new ColorBackground(1,1,1));
            scene.attachChild(header);
            scene.attachChild(new Sprite(0,72,quizRegion));
           
           
            sagome = new ArrayList<Sprite>(21);
            region = new ArrayList<TextureRegion>(21);
           
            int rows = 1;
                int cols = 144;
                int cont = 0;
                for(int i = 0;i < 21;i++){
                       
                        region.add(BitmapTextureAtlasTextureRegionFactory.createFromAsset(gridTexture, this, "sagoma1.png",rows,cols));
                       
                        sagome.add(new SagomaSprite(region.get(i)));
                       
               
                        ((SagomaSprite)sagome.get(i)).setPosition(rows,cols);
               
                        ((SagomaSprite)sagome.get(i)).setIndex(i);
                       
                        rows += 115;
                        cont++;
                        if(cont >= 7){
                                cols += 115;
                                rows = 1;
                                cont = 0;
                        }
                       
                        scene.registerTouchArea(sagome.get(i));
                scene.attachChild(sagome.get(i));                      
               
                }
          scene.setTouchAreaBindingEnabled(true);
           
            return scene;
    }

questa è il pezzo di codice della classe degli oggetti istanziati
Codice (Java): [Seleziona]
@Override
        public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY) {
               
                this.rotate(1, 0);

                return false;
        }
       
        public void setIndex(int i){
                index = i;
        }
       
        private void rotate(int start, int end){
               
                startWidth = start;
                endWidth = end;
               

                EL = new IEntityModifierListener() {
                       
                        @Override
                        public void onModifierStarted(IModifier<IEntity> arg0, IEntity arg1) {
                                Log.d("Animation:", "start!");
                        }
                       
                        @Override
                        public void onModifierFinished(IModifier<IEntity> arg0, IEntity arg1) {
                                Log.d("Animation:", "end!");
                        }
                };
               
                sm = new ScaleModifier(0.5f, 1, 0, 1, 1, EL);
                this.registerEntityModifier(sm);
               
        }
}

Grazie anticipatamente.

Offline Warg_95

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus Nexus7, Samsung Galaxy Note2
  • Sistema operativo:
    Windows 8
Re:[andengine] onAreaTouched su istanze di Sprite che non funziona come dovrebbe
« Risposta #1 il: 24 Febbraio 2013, 13:41:56 CET »
0
ciao per  gestire diversi comportamenti delle sprite al tocco non devi implementare nella classe onareatouched io utilizzo questo metodo:

Codice (Java): [Seleziona]
s = new Sprite(0, 0, TexReg, vbo) {

                                @Override
                                public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
                                        if(pSceneTouchEvent.isActionDown()) {
//esegui azione
}

scena.registerTouchArea(s);
scena.attachChild(s);

Offline devandroid

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
Re:[andengine] onAreaTouched su istanze di Sprite che non funziona come dovrebbe
« Risposta #2 il: 24 Febbraio 2013, 17:12:17 CET »
0
Innanzitutto grazie mille per la risposta...
Purtroppo non uso quel codice perchè onAreaTouched viene invocato al click su tutta la scena. E' un comportamento strano che non mi spiego ma di fatto è così.
Però in qualche modo ho risolto:
il problema era legato alla creazione dello ScaleModifier (    sm = new ScaleModifier(0.5f, 1, 0, 1, 1, EL);    ) ad ogni click veniva ricreato. L'ho spostato nel costruttore creandolo solo una volta e non mi ha dato nessun altro problema.

Adesso però ne ho un altro e non so se è un problema concettuale legato alla logica di andengine oppure semplicemente di implementazione.

Creo due TextureRegion con due immagini diverse in una stessa texture:

Codice (Java): [Seleziona]
TextureRegion img1 = BitmapTextureAtlasTextureRegionFactory.createFromAsset(gridTexture, this, "person.png",0,0);
TextureRegion img2 = BitmapTextureAtlasTextureRegionFactory.createFromAsset(gridTexture, this, "sagoma1.png",0,0);
 

quando creo i due sprite in un codice a parte, li sovrappongo.
Lo sprite contenente l'immagine sagoma1.png ha un ScaleModifier che al click restringe l'immagine a scaleX = 0.
L'effetto sullo sprite sagoma1.png che sta sopra viene eseguito ma mentre avviene il movimento lo Sprite con l'immagine person.png non si vede sotto, si vede invece un clone di sagoma.png.
La cosa strana è che se non faccio sovrapporre le due TextureRegion i due Sprite si vedono correttamente ognuna con la sua immagine.
A questo punto mi viene un dubbio: si possono sovrapporre due TextureRegion???

Grazie

Offline Warg_95

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus Nexus7, Samsung Galaxy Note2
  • Sistema operativo:
    Windows 8
Re:[andengine] onAreaTouched su istanze di Sprite che non funziona come dovrebbe
« Risposta #3 il: 24 Febbraio 2013, 22:46:33 CET »
0
Si si possono sovrapporre le 2 texture ma solo alla realizzazione del'immaggine in onloadresource in pratica per sovrappore gli ultimi 2 campi nelle 2 righe citate da te indicano la possizione delle immaggini caricate dal bitmaptextureatlas cioè la riga di sopra fai attenzione in questa parte di codice io ci sono incappato spesso in errori e distrazuoni

Offline devandroid

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
Re:[andengine] onAreaTouched su istanze di Sprite che non funziona come dovrebbe
« Risposta #4 il: 25 Febbraio 2013, 11:22:06 CET »
0
Sai che non riesco a raccapezzarci?
Ho fatto un pò di pulizia. Definisco le due TextRegion  in onLoadResources come mi consigliavi.
Le posizioni sono ovviamente le stesse per entrambe le region (0,0).
Purtroppo continuo ad avere questo effetto.
Se affianco le region tutto funziona e le immagini si vedono correttamente.
Appena le sovrappongo è come se avessi sotto un clone di quella che sta sopra. Non riesco proprio a capire perchè...
Aggiungo un particolare. Quando creo una istanza della mia classe SagomaSprite che estende sprite, passo al costruttore della superclasse i seguenti parametri:

Codice (Java): [Seleziona]
super(region.getTexturePositionX(),region.getTexturePositionY(),region);
dove region è una delle due:

Codice (Java): [Seleziona]
BitmapTextureAtlasTextureRegionFactory.createFromAsset(gridTexture, this, "sagoma1.png",0,0);
BitmapTextureAtlasTextureRegionFactory.createFromAsset(gridTexture, this, "person.png",0,0);

Forse sbaglio con i posizionamenti degli Sprite?!?



Post unito: 25 Febbraio 2013, 12:02:53 CET
Ho creato due BitmapTextureAtlas diverse.
Ad ognuna assegno una region diversa...
Così funziona!
Non so in termini di performace se è corretto e sostenibile. Ma al momento è una soluzione!
Se così vado incontro a problemi di crash e di memoria man man che scrivo codice vi prego suggeritemelo.
Grazie per il supporto :)
« Ultima modifica: 25 Febbraio 2013, 12:02:53 CET da devandroid, Reason: Merged DoublePost »

Offline Warg_95

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus Nexus7, Samsung Galaxy Note2
  • Sistema operativo:
    Windows 8
Re:[andengine] onAreaTouched su istanze di Sprite che non funziona come dovrebbe
« Risposta #5 il: 25 Febbraio 2013, 13:47:59 CET »
0
Prova ad abilitare il dithering in caso oppure se le sprite sono numerose usa i pool se vuoi posso consigliarti dei tutorial

Offline devandroid

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
Re:[andengine] onAreaTouched su istanze di Sprite che non funziona come dovrebbe
« Risposta #6 il: 25 Febbraio 2013, 14:12:39 CET »
0
Per applicare il dithering dici sull'immagine giusto?

Sicuramente tutorial sono ben graditi grazie mille :)

Cmq per ora la mia game app non ha più di una decina di immagini.

Offline Warg_95

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus Nexus7, Samsung Galaxy Note2
  • Sistema operativo:
    Windows 8
Re:[andengine] onAreaTouched su istanze di Sprite che non funziona come dovrebbe
« Risposta #7 il: 25 Febbraio 2013, 14:17:09 CET »
0
per il dithering e per altro puoi guardare qua http://www.matim-dev.com/tutorials.html