AndEngine 《Android游戏开发实践指南》之“吸血鬼游戏”实例学习(一)


     购买的《Android游戏开发实践指南》一书用的AndEngine库已经更新过,书上很多代码不适应于AndEngine GLES 2。

     根据书上的步骤通过学习《少女大战吸血鬼》游戏来熟悉AndEngine游戏开发过程,做点笔记,本人用的AndEngine库版本是GLES2 ,代码会和书上有些许出入。

 

游戏开始界面

蝙蝠是动画会挥动翅膀,中间的铃声水印是截屏时不小心截得尴尬,图片都是从书上提供的源码里提取出来的。

 

根据之前的学习知道了 Camera, 贴图区域等概念,知道创建一个 SimpleBaseGameActivity要实现的方法,各方法大概的用途。

这里记录关于 AnimatedSprite 的用法。

1    .AnimatedSprite 专门用来设置动画精灵的类,需要从TiledTextureRegion 对象中提取动画的帧,其他的都和基本的Sprite一样。 TiledTexureRegion通常在一张大图里有很多小图,就像下图一样,这些小图连续播放也就是我们的动画效果,而TextureRegion中只有单一的图,这是他们的区别。

                                        

 

 

实现代码如下:

声明变量:

BitmapTextureAtlas mBatAtlas;
ITiledTextureRegion mBatITiledTextureRegion;


onCreateResources()onCreateResource()方法中:

新建mbatatlas时的第二三个参数是取贴图区域的范围,如果这个范围小于图片本身的大小就显示不出来

BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
mBatAtlas = new BitmapTextureAtlas(getTextureManager(), width, high);
mBatITiledTextureRegion = BitmapTextureAtlasTextureRegionFactory
			.createTiledFromAsset(mBatAtlas, this, "bat_tiled.png", 0, 0,
					2, 2);
mBatAtlas.load();

 

在onCreateScene()方法中:

新建Sprite时前两个参数是定义精灵的位置,左上角的坐标,

final AnimatedSprite mBatSprite = new AnimatedSprite(width * 5.5f / 17f
				- mBatITiledTextureRegion.getWidth() / 2, high * 6.5f / 11.4f
				- mBatITiledTextureRegion.getHeight() / 2,
				mBatITiledTextureRegion, new VertexBufferObjectManager());
mBatSprite.setScale((width / (17f / 3f)) / mBatITiledTextureRegion.getWidth(),
		    (high / (11.4f / 3f)) / mBatITiledTextureRegion.getHeight());
mBatSprite.animate(150);// 每帧的播放时长 毫秒为单位.默认为循环播放
mScene.attachChild(mBatSprite);


 

贴上完整代码:

package com.lyt.myzonbigame;

import java.io.IOException;
import java.io.InputStream;

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.Scene;
import org.andengine.entity.sprite.AnimatedSprite;
import org.andengine.entity.sprite.Sprite;
import org.andengine.entity.util.FPSLogger;
import org.andengine.opengl.texture.ITexture;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;
import org.andengine.opengl.texture.bitmap.BitmapTexture;
import org.andengine.opengl.texture.region.ITextureRegion;
import org.andengine.opengl.texture.region.ITiledTextureRegion;
import org.andengine.opengl.texture.region.TextureRegionFactory;
import org.andengine.opengl.vbo.VertexBufferObjectManager;
import org.andengine.ui.activity.SimpleBaseGameActivity;
import org.andengine.util.adt.io.in.IInputStreamOpener;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;

import com.lyt.myzonbigame.util.Myapplication;

public class StartActivity extends SimpleBaseGameActivity {
	int width = Myapplication.ScreenH;
	int high = Myapplication.ScreenW;
	Scene mScene;
	Sprite mSprite;
	Handler mHandler = new Handler();
	// BitmapTextureAtlas mAtlas;
	ITexture mITexture;
	ITextureRegion mITextureRegion;

	BitmapTextureAtlas mBatAtlas;
	ITiledTextureRegion mBatITiledTextureRegion;

	@Override
	protected void onCreate(Bundle pSavedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(pSavedInstanceState);
		System.out.println("oncreate");
	}

	@Override
	public EngineOptions onCreateEngineOptions() {
		// TODO Auto-generated method stub
		System.out.println("oncreateengineoption");
		Camera mCamera = new Camera(0, 0, width, high);
		return new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED,
				new RatioResolutionPolicy(width, high), mCamera);
	}

	@Override
	protected void onCreateResources() {
		System.out.println("oncreateresourse");
		BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
		try {
			mITexture = new BitmapTexture(getTextureManager(),
					new IInputStreamOpener() {

						@Override
						public InputStream open() throws IOException {
							// TODO Auto-generated method stub
							return getAssets().open("gfx/Splashscreen.png");
						}
					});
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// mITextureRegion = BitmapTextureAtlasTextureRegionFactory
		// .createFromAsset(mAtlas, this, "Splashscreen.png", 0, 0);
		mITexture.load();
		mITextureRegion = TextureRegionFactory.extractFromTexture(mITexture);

		mBatAtlas = new BitmapTextureAtlas(getTextureManager(), width, high);
		mBatITiledTextureRegion = BitmapTextureAtlasTextureRegionFactory
				.createTiledFromAsset(mBatAtlas, this, "bat_tiled.png", 0, 0,
						2, 2);
		mBatAtlas.load();
	}

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

		mScene = new Scene();
		mSprite = new Sprite((width - mITexture.getWidth()) / 2,
				(high - mITexture.getHeight()) / 2, mITextureRegion,
				new VertexBufferObjectManager());
		mSprite.setScaleX(width / mSprite.getWidth());
		mSprite.setScaleY(high / mSprite.getHeight());
		// mSprite.setScale(2.5f); 按原图比例缩放
		mScene.attachChild(mSprite);

		final AnimatedSprite mBatSprite = new AnimatedSprite(width * 5.5f / 17f
				- mBatITiledTextureRegion.getWidth() / 2, high * 6.5f / 11.4f
				- mBatITiledTextureRegion.getHeight() / 2,
				mBatITiledTextureRegion, new VertexBufferObjectManager());
		mBatSprite.setScale(
				(width / (17f / 3f)) / mBatITiledTextureRegion.getWidth(),
				(high / (11.4f / 3f)) / mBatITiledTextureRegion.getHeight());
		mBatSprite.animate(150);// 每帧的播放时长 毫秒为单位.默认为循环播放

		mScene.attachChild(mBatSprite);
		return mScene;
	}

	private Runnable mRunnable = new Runnable() {

		@Override
		public void run() {
			// TODO Auto-generated method stub
			Intent mIntent = new Intent(StartActivity.this,
					GameChooessItem.class);
			startActivity(mIntent);
		}
	};

	// 依次执行完上面三个方法后就会执行该方法
	public synchronized void onGameCreated() {
		mHandler.postDelayed(mRunnable, 4000);
		System.out.println("ongamecreated");
	};

}


 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值