Autore Topic: [Facile]AndEngine 3 - SpriteExample e SpriteRemoveExample  (Letto 3001 volte)

Zate

  • Visitatore
[Facile]AndEngine 3 - SpriteExample e SpriteRemoveExample
« il: 24 Novembre 2011, 19:27:36 CET »
+1
Difficolta: facile
Versione SDK utilizzata: 2.2
Link al progetto: http://www.anddev.it/index.php/topic,5210.0.html

Premessa:
1)Leggere QUI per le varie informazioni riguardo ai tutorial.
2)Tutte le immagini utilizzate nei tutorial potete trovarle QUI oppure in assets/gfx nel progetto in allegato
3)Parte del codice postato non corrisponde a quello nel progetto, il codice nel progetto (e questo) funzionano entrambi.

Prima di iniziare:
Nel vostro progetto create la cartella assets e dentro di essa la cartella gfx, qui metteremo tutte le immagini.

Penso di non aver dimenticato nulla. Cominciamo.

SpriteExample
Ormai non c'è più bisogno di dire cosa fare all'inizio ;)
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.scene.Scene;
import org.anddev.andengine.entity.scene.background.ColorBackground;
import org.anddev.andengine.entity.sprite.Sprite;
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.TextureRegion;
import org.anddev.andengine.ui.activity.BaseGameActivity;

import android.view.Display;

public class SpriteExample extends BaseGameActivity {

        private static int CAMERA_WIDTH;
        private static int CAMERA_HEIGHT;

        private Camera mCamera;
        private BitmapTextureAtlas mBitmapTextureAtlas;
        private TextureRegion mFaceTextureRegion;

        @Override
        public Engine onLoadEngine() {
                // TODO Auto-generated method stub
        //si prendono le misure del display (grazie ROS)
                final Display display = getWindowManager().getDefaultDisplay();
        CAMERA_WIDTH = display.getWidth();
        CAMERA_HEIGHT = display.getHeight();
               
        this.mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
                EngineOptions eo = new EngineOptions(true, ScreenOrientation.LANDSCAPE,
                                new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT),
                                this.mCamera);
                return new Engine(eo);
        }

        @Override
        public void onLoadResources() {
                // TODO Auto-generated method stub
                //si settano i parametri della BitmapTextureAtlas (i primi due numeri devono essere potenze di due
                this.mBitmapTextureAtlas = new BitmapTextureAtlas(32, 32,
                                TextureOptions.BILINEAR_PREMULTIPLYALPHA);
                //si setta la cartella in assets dalla quale prenderemo le immagini
                BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
                //si settano i parametri della textureregion
                this.mFaceTextureRegion = BitmapTextureAtlasTextureRegionFactory
                                .createFromAsset(this.mBitmapTextureAtlas, this,
                                                "face_box.png", 0, 0);
        //in questo momento viene caricata la Texture
                this.mEngine.getTextureManager().loadTexture(this.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));
        //si trova il centro
                final int centerX = (CAMERA_WIDTH - this.mFaceTextureRegion.getWidth()) / 2;
                final int centerY = (CAMERA_HEIGHT - this.mFaceTextureRegion
                                .getHeight()) / 2;
        //si crea uno sprite indicando le coordinate e la texture sulla quale è posto
                final Sprite face = new Sprite(centerX, centerY,
                                this.mFaceTextureRegion);
                //si attacca alla scene
                scene.attachChild(face);

                return scene;
        }

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

        }

}

E adesso passiamo alla seconda parte che ho voluto unire...

SpriteRemoveExample
Il codice è molto simile, ma bisogna implementare IOnSceneTouchListener, aggiungere i metodi di unimplement e il metodo per rimuovere lo sprite.

Dunque il codice diventa

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.scene.Scene;
import org.anddev.andengine.entity.scene.background.ColorBackground;
import org.anddev.andengine.entity.sprite.Sprite;
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.TextureRegion;
import org.anddev.andengine.ui.activity.BaseGameActivity;

import android.view.Display;

public class SpriteExample extends BaseGameActivity implements IOnSceneTouchListener{

        private static int CAMERA_WIDTH;
        private static int CAMERA_HEIGHT;

        private Camera mCamera;
        private BitmapTextureAtlas mBitmapTextureAtlas;
        private TextureRegion mFaceTextureRegion;

        @Override
        public Engine onLoadEngine() {
                // TODO Auto-generated method stub
        //si prendono le misure del display (grazie ROS)
                final Display display = getWindowManager().getDefaultDisplay();
        CAMERA_WIDTH = display.getWidth();
        CAMERA_HEIGHT = display.getHeight();
               
        this.mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
                EngineOptions eo = new EngineOptions(true, ScreenOrientation.LANDSCAPE,
                                new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT),
                                this.mCamera);
                return new Engine(eo);
        }

        @Override
        public void onLoadResources() {
                // TODO Auto-generated method stub
                //si settano i parametri della BitmapTextureAtlas (i primi due numeri devono essere potenze di due
                this.mBitmapTextureAtlas = new BitmapTextureAtlas(32, 32,
                                TextureOptions.BILINEAR_PREMULTIPLYALPHA);
                //si setta la cartella in assets dalla quale prenderemo le immagini
                BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
                //si settano i parametri della textureregion
                this.mFaceTextureRegion = BitmapTextureAtlasTextureRegionFactory
                                .createFromAsset(this.mBitmapTextureAtlas, this,
                                                "face_box.png", 0, 0);
        //in questo momento viene caricata la Texture
                this.mEngine.getTextureManager().loadTexture(this.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));
        //si trova il centro
                final int centerX = (CAMERA_WIDTH - this.mFaceTextureRegion.getWidth()) / 2;
                final int centerY = (CAMERA_HEIGHT - this.mFaceTextureRegion
                                .getHeight()) / 2;
        //si crea uno sprite indicando le coordinate e la texture sulla quale è posto
                final Sprite face = new Sprite(centerX, centerY,
                                this.mFaceTextureRegion);
                //si attacca alla scene
                scene.attachChild(face);

                return scene;
        }

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

        }

        @Override
        public boolean onSceneTouchEvent(final Scene pScene,
                        TouchEvent pSceneTouchEvent) {
                // TODO Auto-generated method stub
               
                //IMPORTANTE
               
                /* si possono rimuovere le Entity in sicurezza solo in un UpdateThread.
                 * Farlo mentre si sta disegnando può causare un exception con un'Entity
                 * improvissamente mancante
                 * In alternativa è possibile eseguire i TouchEvents nell'UpdateThread da default, facendo:
                 * engineOptions.getTouchOptions().setRunOnUpdateThread(true);
                 * qunado si crea l'Engine in onLoadEngine();
                 */

                this.runOnUpdateThread(new Runnable() {
                        @Override
                        public void run() {
                                /* Adesso è possibile rimuovere l'Entity in sicurezza */
                                pScene.detachChild(SpriteRemoveExample.this.face);
                        }
                });
                return false;
        }

}

In allegato il risultato finale che dovrebbe essere uguale anche se avete diverse risoluzioni.

Se avete domande/problemi chiedete pure ;)

Testato su LGP500 con Android 2.3.5
« Ultima modifica: 24 Novembre 2011, 22:37:30 CET da Zate »

Offline Bartoloni

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Epad
Re:[Facile]AndEngine 3 - SpriteExample e SpriteRemoveExample
« Risposta #1 il: 07 Luglio 2012, 15:50:34 CEST »
0
Ciao, i link al progetto non funzionano piu' puoi ri-uploadarli? thx!

Zate

  • Visitatore
Re:[Facile]AndEngine 3 - SpriteExample e SpriteRemoveExample
« Risposta #2 il: 07 Luglio 2012, 17:43:34 CEST »
0