Autore Topic: [Facile] AndEngine - EntityModifier  (Letto 2453 volte)

Zate

  • Visitatore
[Facile] AndEngine - EntityModifier
« il: 06 Dicembre 2011, 15:11:43 CET »
0
Difficolta: facile
Versione SDK utilizzata: 2.2
Link al progetto: http://www.anddev.it/index.php/topic,5210.0.html

È da un po' che mi sono fermato perché sto "lavorando" su un nuovo progetto.
Non farò alcuni esempio perché sono già presenti sul forum e vanno benissimo.

Dunque, prima di tutto occorre ricordare cos'è una Entity:

Citazione
Un' Entity è un oggetto che può essere disegnato, come Sprite, Rectangles, Text o Lines. Un' Entity ha una posizione/rotazione/scala/colore/ecc.

EntityModifier
Il risultato sarà un AnimatedSprite e un Rectangle (che in realtà è un quadrato) che, in quanto Entity, verranno modificati da un SequenceEntityModifier che, nel nostro caso, continuerà all'infinito.

Codice (Java): [Seleziona]
package com.and.engine;

import javax.microedition.khronos.opengles.GL10;

import org.anddev.andengine.engine.Engine;
import org.anddev.andengine.engine.camera.Camera;
import org.anddev.andengine.engine.options.EngineOptions;
import org.anddev.andengine.engine.options.EngineOptions.ScreenOrientation;
import org.anddev.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy;
import org.anddev.andengine.entity.modifier.AlphaModifier;
import org.anddev.andengine.entity.modifier.DelayModifier;
import org.anddev.andengine.entity.modifier.LoopEntityModifier;
import org.anddev.andengine.entity.modifier.ParallelEntityModifier;
import org.anddev.andengine.entity.modifier.RotationModifier;
import org.anddev.andengine.entity.modifier.ScaleModifier;
import org.anddev.andengine.entity.modifier.SequenceEntityModifier;
import org.anddev.andengine.entity.primitive.Rectangle;
import org.anddev.andengine.entity.scene.Scene;
import org.anddev.andengine.entity.scene.background.ColorBackground;
import org.anddev.andengine.entity.sprite.AnimatedSprite;
import org.anddev.andengine.opengl.texture.TextureOptions;
import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;
import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;
import org.anddev.andengine.opengl.texture.region.TiledTextureRegion;
import org.anddev.andengine.ui.activity.BaseGameActivity;

import android.view.Display;

public class EntityModifier extends BaseGameActivity {

        private int CAMERA_WIDTH;
        private int CAMERA_HEIGHT;

        private Camera mCamera;
        private BitmapTextureAtlas mBitmapTextureAtlas;
        private TiledTextureRegion mFaceTextureRegion;

        @Override
        public Engine onLoadEngine() {
                // TODO Auto-generated method stub
               
                //si prendono le misure del display
                final Display display = getWindowManager().getDefaultDisplay();
        CAMERA_WIDTH = display.getWidth();
        CAMERA_HEIGHT = display.getHeight();
        //si settano le dimensioni della camera
                mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
                //e i parametri dell'EngineOptions
                EngineOptions eo = new EngineOptions(true, ScreenOrientation.LANDSCAPE,
                                new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), mCamera);
                return new Engine(eo);
        }

        @Override
        public void onLoadResources() {
                // TODO Auto-generated method stub
                //si crea la bitmaptextureatlas
                mBitmapTextureAtlas = new BitmapTextureAtlas(64, 32,
                                TextureOptions.BILINEAR_PREMULTIPLYALPHA);
                //si setta la cartella delle immagini (in assets)
                BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
            //e si crea la textureregion della box face (che sarà animata)
                mFaceTextureRegion = BitmapTextureAtlasTextureRegionFactory
                                .createTiledFromAsset(mBitmapTextureAtlas, this,
                                                "face_box_tiled.png", 0, 0, 2, 1);
            //si carica la bitmaptextureatlas
                mEngine.getTextureManager().loadTexture(mBitmapTextureAtlas);
        }

        @Override
        public Scene onLoadScene() {
                // TODO Auto-generated method stub

                final Scene scene = new Scene();
                scene.setBackground(new ColorBackground(0.09804f, 0.6274f, 0.8784f));

                final int centerX = (CAMERA_WIDTH - this.mFaceTextureRegion.getWidth()) / 2;
                final int centerY = (CAMERA_HEIGHT - this.mFaceTextureRegion
                                .getHeight()) / 2;
                //si crea il rettangolo (x,y,larghezza,altezza)
                final Rectangle rect = new Rectangle(centerX + 100, centerY, 32, 32);
                //si setta il colore del rettangolo
                rect.setColor(1, 0, 0);

                //si crea l'AnimatedSprite (sprite animato)
                final AnimatedSprite face = new AnimatedSprite(centerX - 100, centerY,
                                this.mFaceTextureRegion);
                //e si anima ogni 100 secondi
                face.animate(100);
                face.setBlendFunction(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

                //si crea un loopentitymodifier che modificherà la nostra entity in un loop infinito.
                final LoopEntityModifier entityModifier =
                                new LoopEntityModifier(
                                    new SequenceEntityModifier(
                                            //tempo impiegato, posizione iniziale, posizione finale
                                            new RotationModifier(3, 0, 90),
                                            //tempo impiegato, trasparenza iniziale, trasparenza finale
                                                    new AlphaModifier(3, 1, 0),
                                            //tempo impiegato, trasparenza iniziale, trasparenza finale
                                                    new AlphaModifier(3, 0, 1),
                                                    //tempo impiegato, grandezza iniziale, grandezza finale
                                                    new ScaleModifier(3, 1, 0.5f),
                                                    //durata pausa
                                                    new DelayModifier(3),
                                                    //due modifiche contemporaneamente
                                                    new ParallelEntityModifier(
                                                        //vedi prima
                                                                new ScaleModifier(3, 0.5f, 3),
                                                                //vedi prima
                                                                new RotationModifier(3, 90, 180)),
                                                    new ParallelEntityModifier(
                                                        new ScaleModifier(3, 3, 1),
                                                                new RotationModifier(3, 180, 0),
                                                        new DelayModifier(9)
                                                    )
                                        )
                                    );

                //si registra l'entitymodifier
                face.registerEntityModifier(entityModifier);
                rect.registerEntityModifier(entityModifier);

                //e si attacano alla scena l'animated sprite e il rettangolo(che in realtà è un quadrato)
                scene.attachChild(face);
                scene.attachChild(rect);

                return scene;
        }

        @Override
        public void onLoadComplete() {
                // TODO Auto-generated method stub

        }

}

EntityModifierIrregularExample
Non ho capito perché l'abbiano chiamato irregular in quanto si tratta solamente di due animated sprite che verranno modificati e altri due che rimarranno fissi.
Comunque, se avete seguito l'esempio prima non dovreste aver problemi a seguire questo.

Codice (Java): [Seleziona]
package com.and.engine;

import org.anddev.andengine.engine.Engine;
import org.anddev.andengine.engine.camera.Camera;
import org.anddev.andengine.engine.options.EngineOptions;
import org.anddev.andengine.engine.options.EngineOptions.ScreenOrientation;
import org.anddev.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy;
import org.anddev.andengine.entity.modifier.LoopEntityModifier;
import org.anddev.andengine.entity.modifier.ParallelEntityModifier;
import org.anddev.andengine.entity.modifier.RotationModifier;
import org.anddev.andengine.entity.modifier.ScaleModifier;
import org.anddev.andengine.entity.modifier.SequenceEntityModifier;
import org.anddev.andengine.entity.scene.Scene;
import org.anddev.andengine.entity.scene.background.ColorBackground;
import org.anddev.andengine.entity.sprite.AnimatedSprite;
import org.anddev.andengine.opengl.texture.TextureOptions;
import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;
import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;
import org.anddev.andengine.opengl.texture.region.TiledTextureRegion;
import org.anddev.andengine.ui.activity.BaseGameActivity;

import android.view.Display;

public class EntityModifierIrregularExample extends BaseGameActivity {

        private int CAMERA_WIDTH;
        private int CAMERA_HEIGHT;

        private Camera mCamera;
        private BitmapTextureAtlas mBitmapTextureAtlas;
        private TiledTextureRegion mFaceTextureRegion;

        @Override
        public Engine onLoadEngine() {
                // TODO Auto-generated method stub
                //si prendono le misure del display
                final Display display = getWindowManager().getDefaultDisplay();
                CAMERA_WIDTH = display.getWidth();
                CAMERA_HEIGHT = display.getHeight();
        //si settano le dimensioni della camera
                mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
                //e i parametri dell'EngineOptions
                EngineOptions eo = new EngineOptions(true, ScreenOrientation.LANDSCAPE,
                                new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), mCamera);
                return new Engine(eo);
        }

        @Override
        public void onLoadResources() {
                // TODO Auto-generated method stub
                //si crea la bitmaptextureatlas

                mBitmapTextureAtlas = new BitmapTextureAtlas(64, 32,
                                TextureOptions.BILINEAR_PREMULTIPLYALPHA);
                //si setta la cartella delle immagini (in assets)
                BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
            //e si crea la textureregion delle box face
                mFaceTextureRegion = BitmapTextureAtlasTextureRegionFactory
                                .createTiledFromAsset(mBitmapTextureAtlas, this,
                                                "face_box_tiled.png", 0, 0, 2, 1);
            //si carica la bitmaptextureatlas
                mEngine.getTextureManager().loadTexture(mBitmapTextureAtlas);
        }

        @Override
        public Scene onLoadScene() {
                // TODO Auto-generated method stub
                final Scene scene = new Scene();
                scene.setBackground(new ColorBackground(0.09804f, 0.6274f, 0.8784f));

                final int centerX = (CAMERA_WIDTH - this.mFaceTextureRegion.getWidth()) / 2;
                final int centerY = (CAMERA_HEIGHT - this.mFaceTextureRegion
                                .getHeight()) / 2;

                //si creano gli animated sprite e si animano
                final AnimatedSprite face1 = new AnimatedSprite(centerX - 100, centerY,
                                this.mFaceTextureRegion);
                face1.animate(100);
               
                final AnimatedSprite face2 = new AnimatedSprite(centerX + 100, centerY,
                                this.mFaceTextureRegion);
                face2.animate(100);

                /* entity modifier che loopa il sequenceentitymodifier, per i parametri
                vedi l'esempio entitymodifier
                */

                final LoopEntityModifier entityModifier = new LoopEntityModifier(
                                new SequenceEntityModifier(

                                new ScaleModifier(3, 1.0f, 0.75f, 1.0f, 2.0f),
                                                new ScaleModifier(3, 0.75f, 2.0f, 2.0f, 1.25f),
                                                new ParallelEntityModifier(new ScaleModifier(3, 2.0f,
                                                                5.0f, 1.25f, 5.0f), new RotationModifier(3, 0,
                                                                180)), new ParallelEntityModifier(
                                                                new ScaleModifier(3, 5, 1),
                                                                new RotationModifier(3, 180, 0))

                                ));

                // si registra l'entitymodifier

                face1.registerEntityModifier(entityModifier);
                face2.registerEntityModifier(entityModifier);

                // si attaccano alla scene
                scene.attachChild(face1);
                scene.attachChild(face2);

                // si creano alcuni AnimatedSprite che non verranno modificati
                final AnimatedSprite face1Reference = new AnimatedSprite(centerX - 100,
                                centerY, this.mFaceTextureRegion);
                final AnimatedSprite face2Reference = new AnimatedSprite(centerX + 100,
                                centerY, this.mFaceTextureRegion);
                //e si attaccano alla scene
                scene.attachChild(face1Reference);
                scene.attachChild(face2Reference);

                return scene;
        }

        @Override
        public void onLoadComplete() {
                // TODO Auto-generated method stub

        }

}
In allegato i risultati finali.
Penso di aver azzeccato i parametri, ma è probabilissimo che mi sia sbagliato. Quindi fatemi notare i possibili errori.

Offline mikeblue

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +3
    • @MikeBlue3003
    • Mostra profilo
    • home page
  • Sistema operativo:
    Ubuntu 11.04, Windows 7
Re:[Facile] AndEngine - EntityModifier
« Risposta #1 il: 13 Marzo 2012, 21:06:34 CET »
0
grazie per questi tutorial!!
sono molto utili per chi, come me, si affaccia ora ai giochi
 :D
"Si ha la sensazione che ogni qualvolta si esca di casa, al proprio ritorno ci sia un nuovo prodotto Google appena lanciato. " (Philipp Lenssen)

Offline mikeblue

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +3
    • @MikeBlue3003
    • Mostra profilo
    • home page
  • Sistema operativo:
    Ubuntu 11.04, Windows 7
Re:[Facile] AndEngine - EntityModifier
« Risposta #2 il: 13 Marzo 2012, 22:31:39 CET »
0
comunque sto vedendo anche gli altri esempi QUI

solo che alcuni esempi nell'import hanno
Codice (Java): [Seleziona]
org.anddev.andengine.extension
solo che sulla libreria che ho scaricato AndEngine Jars - AndEngineWiki non c'è il package "extension", quindi neanche le relative classi.

ma è normale?
 o_O
"Si ha la sensazione che ogni qualvolta si esca di casa, al proprio ritorno ci sia un nuovo prodotto Google appena lanciato. " (Philipp Lenssen)

Zate

  • Visitatore
Re:[Facile] AndEngine - EntityModifier
« Risposta #3 il: 14 Marzo 2012, 18:16:50 CET »
0
Hai bisogno di alcune estensioni, delle librarie a parte. Guarda qui:
 andengine -
 
 
 AndEngine - Free Android 2D OpenGL Game Engine - Google Project Hosting
 

Offline mikeblue

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +3
    • @MikeBlue3003
    • Mostra profilo
    • home page
  • Sistema operativo:
    Ubuntu 11.04, Windows 7
Re:[Facile] AndEngine - EntityModifier
« Risposta #4 il: 14 Marzo 2012, 20:37:53 CET »
0
Hai bisogno di alcune estensioni, delle librarie a parte. Guarda qui:
 andengine -
 
 
 AndEngine - Free Android 2D OpenGL Game Engine - Google Project Hosting
 


capito grazie...
avrei anche un dubbio sulla grafica, forse sono un pò off topic. In pratica le immagini come le adatto alle varie risoluzioni? Devo fare uno switch e usare l'immagine giusta in base, ad esempio, la larghezza dello schermo?
"Si ha la sensazione che ogni qualvolta si esca di casa, al proprio ritorno ci sia un nuovo prodotto Google appena lanciato. " (Philipp Lenssen)

Zate

  • Visitatore
Re:[Facile] AndEngine - EntityModifier
« Risposta #5 il: 14 Marzo 2012, 21:45:37 CET »
+1
Prova a guardare queste discussioni:
AndEngine - Forums • AndEngine - Core-Terminology : Tutorials (IResolutionPolicy)
AndEngine - Forums • FullScreen question... : GLES1
AndEngine - Forums • does andengine support tablet? Resolution problem. : GLES1

Altrimenti puoi guardare questa estensione

 andenginesvgtextureregionextension -
 
 
 AndEngine - SVGTextureRegion Extension - Google Project Hosting
 


SVG significa scalable vector graphics e penso che dovrebbe facilitare il supporto di varie risoluzioni e densità (dico dovrebbe perché, non avendola mai usata, non ne sono sicuro al 100%)

Purtroppo non riesco a darti più informazioni dal momento che non mi sono mai particolarmente preoccupato di supportare varie risoluzioni perché tendo ad abbandonare vari progetti a metà  :-P
Sul forum di andengine sono comunque presenti parecchie informazioni

Offline mikeblue

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +3
    • @MikeBlue3003
    • Mostra profilo
    • home page
  • Sistema operativo:
    Ubuntu 11.04, Windows 7
Re:[Facile] AndEngine - EntityModifier
« Risposta #6 il: 14 Marzo 2012, 22:45:06 CET »
0
ti ringrazio per il supporto...  ;-)

è che io sto iniziando ora a vedere i giochi e ho 3000 dubbi.
comunque mi hai chiarito parecchie cosuccie con i tuoi tutorial, a parer mio sono molto utili!
"Si ha la sensazione che ogni qualvolta si esca di casa, al proprio ritorno ci sia un nuovo prodotto Google appena lanciato. " (Philipp Lenssen)

Zate

  • Visitatore
R: [Facile] AndEngine - EntityModifier
« Risposta #7 il: 14 Marzo 2012, 23:22:02 CET »
0
Grazie a te! Serve appunto per questo il forum ;-)