AndEngine Example(4):SpriteRemoveExample

目標:

1. 瞭解紋理 BitmapTextureAtlas

2. 紋理區域工場 BitmapTextureAtlasTextureRegionFactory

3. 鎖 EngineLock

4. 移除精靈



package org.andengine.examples;

import org.andengine.engine.Engine.EngineLock;
import org.andengine.engine.camera.Camera;
import org.andengine.engine.options.EngineOptions;
import org.andengine.engine.options.ScreenOrientation;
import org.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy;
import org.andengine.entity.scene.IOnSceneTouchListener;
import org.andengine.entity.scene.Scene;
import org.andengine.entity.scene.background.Background;
import org.andengine.entity.sprite.Sprite;
import org.andengine.entity.util.FPSLogger;
import org.andengine.input.touch.TouchEvent;
import org.andengine.opengl.texture.TextureOptions;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;
import org.andengine.opengl.texture.region.ITextureRegion;
import org.andengine.ui.activity.SimpleBaseGameActivity;

import android.widget.Toast;

/**
 * (c) 2010 Nicolas Gramlich
 * (c) 2011 Zynga
 *
 * @author Nicolas Gramlich
 * @since 11:54:51 - 03.04.2010
 */
public class SpriteRemoveExample extends SimpleBaseGameActivity implements IOnSceneTouchListener {
	// ===========================================================
	// Constants
	// ===========================================================

	private static final int CAMERA_WIDTH = 720;
	private static final int CAMERA_HEIGHT = 480;

	// ===========================================================
	// Fields
	// ===========================================================

	private BitmapTextureAtlas mBitmapTextureAtlas;
	private ITextureRegion mFaceTextureRegion;
	private Sprite mFaceToRemove;

	// ===========================================================
	// Constructors
	// ===========================================================

	// ===========================================================
	// Getter & Setter
	// ===========================================================

	// ===========================================================
	// Methods for/from SuperClass/Interfaces
	// ===========================================================

	@Override
	public EngineOptions onCreateEngineOptions() {
		Toast.makeText(this, "Touch the screen to safely remove the sprite.", Toast.LENGTH_LONG).show();

		final Camera camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);

		return new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera);
	}

	@Override
	public void onCreateResources() {
		BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");

		this.mBitmapTextureAtlas = new BitmapTextureAtlas(this.getTextureManager(), 32, 32, TextureOptions.BILINEAR);
		this.mFaceTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "face_box.png", 0, 0);
		this.mBitmapTextureAtlas.load();
	}

	@Override
	public Scene onCreateScene() {
		this.mEngine.registerUpdateHandler(new FPSLogger());

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

		/* Calculate the coordinates for the face, so its centered on the camera. */
		final float centerX = (CAMERA_WIDTH - this.mFaceTextureRegion.getWidth()) / 2;
		final float centerY = (CAMERA_HEIGHT - this.mFaceTextureRegion.getHeight()) / 2;

		this.mFaceToRemove = new Sprite(centerX, centerY, this.mFaceTextureRegion, this.getVertexBufferObjectManager());
		scene.attachChild(this.mFaceToRemove);

		scene.setOnSceneTouchListener(this);

		return scene;
	}

	@Override
	public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent) {
		if(this.mFaceToRemove == null) {
			return false;
		}

		final EngineLock engineLock = this.mEngine.getEngineLock();
		engineLock.lock();

		/* Now it is save to remove the entity! */
		pScene.detachChild(this.mFaceToRemove);
		this.mFaceToRemove.dispose();
		this.mFaceToRemove = null;

		engineLock.unlock();
		return true;
	}

	// ===========================================================
	// Methods
	// ===========================================================

	// ===========================================================
	// Inner and Anonymous Classes
	// ===========================================================
}



BitmapTextureAtlas 是一種Texture(紋理)

          BitmapTextureAtlas extends TextureAtlas

          TextureAtlas<T extends ITextureAtlasSource> extends Texture

(上一篇中使用的是 ITexture 對象,texture = new BitmapTexture(...) 它也是是extends自Texture)


BitmapTextureAtlasTextureRegionFactory 

設定AssetBasePath 路徑,然後讀取下面的"face_box.png" ,變成紋理,然後給mBitmapTextureAtlas,返回的則是一塊紋理區域mFaceTextureRegion。

(這樣就創建了 紋理 和 紋理區域)。


加鎖: 關鍵區域需要加鎖,例如移除精靈

final EngineLock engineLock = this.mEngine.getEngineLock();
engineLock.lock();

...

engineLock.unlock();


移除精靈:

1 先取消精靈與場景的綁定  detachChild

2 回收精靈dispose()

3 將對象置爲空 = null


---------------------------------------------------------------------

擴展閱讀:

場景 (Scenes)
AndEngine提供了一個場景類來讓我們可以進行遊戲場景的初始化。

Scenes擁有如下屬性:

Scene mParentScene : 每個場景能夠擁有可選的父場景

Scene mChildScene :每個場景能夠擁有可選的子場景

SmartList<ITouchArea> mTouchAreas: (觸碰區域):場景能夠知道接收了用戶觸摸的區域

IOnSceneTouchListener mOnSceneTouchListener: 場景被觸摸的監聽器

IOnAreaTouchListener mOnAreaTouchListener: 區域被觸摸的監聽器

RunnableHandler mRunnableHandler: 場景擁有的RunnableHandler.

IBackground mBackground : 每個場景都有背景,它是黑色實心的。

boolean mOnAreaTouchTraversalBackToFront: 是否需要響應觸摸事件。

Layers of graphics can be attached to a Scene as children of the Scene.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章