andengine编程之menu

来源:互联网 发布:赌博软件作弊器 编辑:程序博客网 时间:2024/05/17 08:46

一般游戏都有一个start开始按钮,或者press any key的按钮。当用户点击后,会显示出菜单。
我们将在上一个工程的基础上,继续来完成menu菜单的显示

首先,增加一个scene的场景,用来显示menu菜单:

private void createMenu() {menuScene = new Scene();// 建立几个button// 200, 100:显示的位置// button:按钮图片, 这里就不再建立新的button图片了,复用上一个按钮图片ButtonSprite startBtn = new ButtonSprite(100, 100, button,getVertexBufferObjectManager(), new OnClickListener() {public void onClick(ButtonSprite pButtonSprite,float pTouchAreaLocalX, float pTouchAreaLocalY) {// 处理点击后操作}});ButtonSprite setBtn = new ButtonSprite(100, 200, button,getVertexBufferObjectManager(), new OnClickListener() {public void onClick(ButtonSprite pButtonSprite,float pTouchAreaLocalX, float pTouchAreaLocalY) {// 处理点击后操作}});ButtonSprite backBtn = new ButtonSprite(100, 300, button,getVertexBufferObjectManager(), new OnClickListener() {public void onClick(ButtonSprite pButtonSprite,float pTouchAreaLocalX, float pTouchAreaLocalY) {// 退回到最开始状态mScene.clearChildScene();mScene.attachChild(buttonSprite);}});// 添加到button到scene中menuScene.attachChild(startBtn);menuScene.attachChild(setBtn);menuScene.attachChild(backBtn);// 注册button的触摸机制menuScene.registerTouchArea(startBtn);menuScene.registerTouchArea(setBtn);menuScene.registerTouchArea(backBtn);// 如果你还要复用之前的背景话,这里设置为false,否则就是一片黑色背景menuScene.setBackgroundEnabled(false);}


接下来,再修改一个onCreateScene,增加上这个方法:
// 创建菜单场景createMenu();

还有,修改之前开始按钮的监听内容:

buttonSprite = new ButtonSprite(480, 300, button,getVertexBufferObjectManager(), new OnClickListener() {// 建立监听,当用户点住不放的时候,button图片会切换,但不会执行onClick里的操作// 当用户松开的时候,才会执行public void onClick(ButtonSprite pButtonSprite,float pTouchAreaLocalX, float pTouchAreaLocalY) {// 当用户点下后,我们将这个button从场景中移除掉mScene.detachChild(buttonSprite);// 添加进来菜单mScene.setChildScene(menuScene);}});


附上源代码:

package com.test;import org.andengine.engine.camera.SmoothCamera;import org.andengine.engine.options.EngineOptions;import org.andengine.engine.options.EngineOptions.ScreenOrientation;import org.andengine.engine.options.resolutionpolicy.FillResolutionPolicy;import org.andengine.entity.scene.Scene;import org.andengine.entity.sprite.ButtonSprite;import org.andengine.entity.sprite.ButtonSprite.OnClickListener;import org.andengine.entity.sprite.Sprite;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.opengl.texture.region.TiledTextureRegion;import org.andengine.ui.activity.BaseGameActivity;public class TestAndEngine extends BaseGameActivity {private static final int CAMERA_WIDTH = 800;private static final int CAMERA_HEIGHT = 480;private static final float CAMERA_MOVE_VELOCITY = 3000;private static final float CAMERA_ZOOM_VELOCITY = 5;private ITextureRegion background;private TiledTextureRegion button;private ButtonSprite buttonSprite;private Scene mScene;private Scene menuScene;public EngineOptions onCreateEngineOptions() {SmoothCamera mCamera = new SmoothCamera(0, 0, CAMERA_WIDTH,CAMERA_HEIGHT, CAMERA_MOVE_VELOCITY, CAMERA_MOVE_VELOCITY,CAMERA_ZOOM_VELOCITY);EngineOptions mEngineOptions = new EngineOptions(true,ScreenOrientation.LANDSCAPE_FIXED, new FillResolutionPolicy(),mCamera);mEngineOptions.getAudioOptions().setNeedsMusic(true);mEngineOptions.getAudioOptions().setNeedsSound(true);return mEngineOptions;}public void onCreateResources(OnCreateResourcesCallback pOnCreateResourcesCallback)throws Exception {// 1024, 512:这里的图片都要创建成2几次方的形式,例如128、256、512,原始图片也要创建成这样大小// TextureOptions.DEFAULT:使用默认的纹理效果,当然你也可选其他的形式BitmapTextureAtlas backgroundTextureAtlas = new BitmapTextureAtlas(getTextureManager(), 1024, 512, TextureOptions.DEFAULT);// 图片要保存在asset文件夹下,如果图片很多,可以采用再建立文件夹加以区分// 然后用来设置根目录:// BitmapTextureAtlasTextureRegionFactory.setAssetBasePath(final String// pAssetBasePath);background = BitmapTextureAtlasTextureRegionFactory.createFromAsset(backgroundTextureAtlas, this, "background.png", 0, 0);// 最后一定要调用这个方法,否则图片不会加载上来backgroundTextureAtlas.load();// 同上BitmapTextureAtlas buttonTextureAtlas = new BitmapTextureAtlas(getTextureManager(), 256, 256, TextureOptions.DEFAULT);// 通过帧序列块的方式创建button,注意顺序:第一张为正常效果,第二张为按下效果// 1, 2:共1列,有2行button = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(buttonTextureAtlas, this, "button.png", 0, 0, 1, 2);// 加载一下buttonTextureAtlas.load();// 最后一定要调用,通知程序可以开始调用onCreateScene方法pOnCreateResourcesCallback.onCreateResourcesFinished();}public void onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback)throws Exception {// 构建场景mScene = new Scene();// 建立背景SpriteSprite backgroundSprite = new Sprite(0, 0, background,getVertexBufferObjectManager());// 建立按钮Sprite// 480, 200:显示的位置// button:为按钮图片帧buttonSprite = new ButtonSprite(480, 300, button,getVertexBufferObjectManager(), new OnClickListener() {// 建立监听,当用户点住不放的时候,button图片会切换,但不会执行onClick里的操作// 当用户松开的时候,才会执行public void onClick(ButtonSprite pButtonSprite,float pTouchAreaLocalX, float pTouchAreaLocalY) {// 当用户点下后,我们将这个button从场景中移除掉mScene.detachChild(buttonSprite);// 添加进来菜单mScene.setChildScene(menuScene);}});// 将两个Sprite添加进场景mScene.attachChild(backgroundSprite);mScene.attachChild(buttonSprite);// 注册buttonSprite的触摸机制mScene.registerTouchArea(buttonSprite);// 创建菜单场景createMenu();// 最后一定要调用,通知系统我们创建了哪个scenepOnCreateSceneCallback.onCreateSceneFinished(mScene);}public void onPopulateScene(Scene pScene,OnPopulateSceneCallback pOnPopulateSceneCallback) throws Exception {// 最后千万不要忘记了这个pOnPopulateSceneCallback.onPopulateSceneFinished();}private void createMenu() {menuScene = new Scene();// 建立几个button// 200, 100:显示的位置// button:按钮图片, 这里就不再建立新的button图片了,复用上一个按钮图片ButtonSprite startBtn = new ButtonSprite(100, 100, button,getVertexBufferObjectManager(), new OnClickListener() {public void onClick(ButtonSprite pButtonSprite,float pTouchAreaLocalX, float pTouchAreaLocalY) {// 处理点击后操作}});ButtonSprite setBtn = new ButtonSprite(100, 200, button,getVertexBufferObjectManager(), new OnClickListener() {public void onClick(ButtonSprite pButtonSprite,float pTouchAreaLocalX, float pTouchAreaLocalY) {// 处理点击后操作}});ButtonSprite backBtn = new ButtonSprite(100, 300, button,getVertexBufferObjectManager(), new OnClickListener() {public void onClick(ButtonSprite pButtonSprite,float pTouchAreaLocalX, float pTouchAreaLocalY) {// 退回到最开始状态mScene.clearChildScene();mScene.attachChild(buttonSprite);}});// 添加到button到scene中menuScene.attachChild(startBtn);menuScene.attachChild(setBtn);menuScene.attachChild(backBtn);// 注册button的触摸机制menuScene.registerTouchArea(startBtn);menuScene.registerTouchArea(setBtn);menuScene.registerTouchArea(backBtn);// 如果你还要复用之前的背景话,这里设置为false,否则就是一片黑色背景menuScene.setBackgroundEnabled(false);}}