购买的《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");
};
}