`

(14)、andengine之ButtonSprite按钮精灵与创建菜单

 
阅读更多

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.ButtonSprite;
import org.andengine.entity.sprite.ButtonSprite.OnClickListener;
import org.andengine.entity.sprite.Sprite;
import org.andengine.entity.util.FPSLogger;
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.atlas.bitmap.BuildableBitmapTextureAtlas;
import org.andengine.opengl.texture.atlas.bitmap.source.IBitmapTextureAtlasSource;
import org.andengine.opengl.texture.atlas.buildable.builder.BlackPawnTextureAtlasBuilder;
import org.andengine.opengl.texture.atlas.buildable.builder.ITextureAtlasBuilder.TextureAtlasBuilderException;
import org.andengine.opengl.texture.region.TextureRegion;
import org.andengine.opengl.texture.region.TiledTextureRegion;
import org.andengine.ui.activity.SimpleBaseGameActivity;

import android.util.DisplayMetrics;
import android.widget.Toast;
/**
 * 按钮精灵和创建菜单
 */
public class ButtonAndMenuActivity extends SimpleBaseGameActivity implements OnClickListener
{
 private static int winWidth = 854;
 private static int winHeight = 480;
 
 private BuildableBitmapTextureAtlas mBuildableBitmapTextureAtlas;
 private BitmapTextureAtlas mBitmapTextureAtlas;
 //背景
 private TextureRegion mBackgroundTextureRegion,mMenuTextureRegion;
 //按钮
 private TiledTextureRegion mBtnTiledTextureRegion,mAllBtnTiledTextureRegion;
 //按钮精灵
 private ButtonSprite buttonSprite,btnAllSprite1,btnAllSprite2,btnAllSprite3,btnAllSprite4;
 //主场景,菜单场景
 private Scene mScene,menuScene;

 @Override
 public EngineOptions onCreateEngineOptions()
 {
  setScreenDisplay();
  Camera camera = new Camera(0,0,winWidth,winHeight);
  return new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED, new RatioResolutionPolicy(winWidth, winHeight), camera);
 }

 @Override
 protected void onCreateResources()
 {
  BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("images/");
  //手动收集的地图纹理区域
  mBitmapTextureAtlas = new BitmapTextureAtlas(getTextureManager(), 256, 256, TextureOptions.DEFAULT);
  //菜单背景
  mMenuTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(mBitmapTextureAtlas, this, "menu_bg.png", 0, 0);
  mBitmapTextureAtlas.load();

  //自动收集的地图纹理区域
  mBuildableBitmapTextureAtlas = new BuildableBitmapTextureAtlas(this.getTextureManager(), 1024, 1024, TextureOptions.DEFAULT);
  mBackgroundTextureRegion = BitmapTextureAtlasTextureRegionFactory
    .createFromAsset(mBuildableBitmapTextureAtlas, this, "parallax_background_layer_back.png");
  mBtnTiledTextureRegion = BitmapTextureAtlasTextureRegionFactory
    .createTiledFromAsset(mBuildableBitmapTextureAtlas, this, "toggle_button.png", 2, 1);
  mAllBtnTiledTextureRegion = BitmapTextureAtlasTextureRegionFactory
    .createTiledFromAsset(mBuildableBitmapTextureAtlas, this, "btn_all.png", 3, 1);
  
  try
  {
   mBuildableBitmapTextureAtlas.build(new BlackPawnTextureAtlasBuilder<IBitmapTextureAtlasSource, BitmapTextureAtlas>(0, 1, 1));
   mBuildableBitmapTextureAtlas.load();
  } catch (TextureAtlasBuilderException e)
  {
   e.printStackTrace();
  }
 }

 @Override
 protected Scene onCreateScene()
 {
  this.mEngine.registerUpdateHandler(new FPSLogger());
  mScene = new Scene();
  
  float startX = (winWidth-mBackgroundTextureRegion.getWidth())/2;
  float startY = (winHeight-mBackgroundTextureRegion.getHeight())/2;
  
  //创建背景精灵
  Sprite backgroundSprite = new Sprite(startX, startY, mBackgroundTextureRegion, getVertexBufferObjectManager());
  
  buttonSprite = new ButtonSprite(startX+20, startY+20, mBtnTiledTextureRegion, getVertexBufferObjectManager(), this);
  
  mScene.attachChild(backgroundSprite);
  mScene.attachChild(buttonSprite);
  
  //注册buttonSprite的触摸机制
  mScene.registerTouchArea(buttonSprite);
  
  createMenu();
  
  return mScene;
 }
 /**
  * 创建菜单
  */
 private void createMenu()
 {
  menuScene = new Scene();
  float menuX = 200;
  float menuY = 30;
  //创建背景精灵
  Sprite menuBgSprite = new Sprite(menuX, menuY, 240, 320, mMenuTextureRegion, getVertexBufferObjectManager());
  
  btnAllSprite1 = new ButtonSprite(menuX+28, menuY+20, mAllBtnTiledTextureRegion, getVertexBufferObjectManager(), this);
  btnAllSprite2 = new ButtonSprite(menuX+28, menuY+70, mAllBtnTiledTextureRegion, getVertexBufferObjectManager(), this);
  btnAllSprite3 = new ButtonSprite(menuX+28, menuY+130, mAllBtnTiledTextureRegion, getVertexBufferObjectManager(), this);
  btnAllSprite4 = new ButtonSprite(menuX+28, menuY+200, mAllBtnTiledTextureRegion, getVertexBufferObjectManager(), this);
  
  menuScene.attachChild(menuBgSprite);
  menuScene.attachChild(btnAllSprite1);
  menuScene.attachChild(btnAllSprite2);
  menuScene.attachChild(btnAllSprite3);
  menuScene.attachChild(btnAllSprite4);

  //注册buttonSprite的触摸机制
  menuScene.registerTouchArea(btnAllSprite1);
  menuScene.registerTouchArea(btnAllSprite2);
  menuScene.registerTouchArea(btnAllSprite3);
  menuScene.registerTouchArea(btnAllSprite4);
  
  // 如果你还要复用之前的背景话(就是看到之前的场景层),这里设置为false,否则就是一片黑色背景
  menuScene.setBackgroundEnabled(false);
 }

 /**
  * 设置屏幕大小
  */
 private void setScreenDisplay()
 {
  DisplayMetrics displayMetrics = new DisplayMetrics();
  getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
  winWidth = displayMetrics.widthPixels;
  winHeight = displayMetrics.heightPixels;
 }

 /**
  * 按钮精灵点击事件
  */
 @Override
 public void onClick(ButtonSprite pButtonSprite, float pTouchAreaLocalX, float pTouchAreaLocalY)
 {
  if (pButtonSprite == buttonSprite)
  {
   //安全的做法是在更新线程做删除,更新等操作
   this.runOnUpdateThread(new Runnable()
   {
    @Override
    public void run()
    {
     //主场景设置子场景
     mScene.setChildScene(menuScene);
     //将buttonSprite
     mScene.detachChild(buttonSprite);
    }
   });
   
  }
  else if (pButtonSprite == btnAllSprite1)
  {
   ButtonAndMenuActivity.this.runOnUiThread(new Runnable()
   {
    @Override
    public void run()
    {
     Toast.makeText(ButtonAndMenuActivity.this, "点击了按钮精灵buttonSprite1", 3000).show();
    }
   });
  }
  else if (pButtonSprite == btnAllSprite2)
  {
   ButtonAndMenuActivity.this.runOnUiThread(new Runnable()
   {
    @Override
    public void run()
    {
     Toast.makeText(ButtonAndMenuActivity.this, "点击了按钮精灵buttonSprite2", 3000).show();
    }
   });
  }
  else if (pButtonSprite == btnAllSprite3)
  {
   ButtonAndMenuActivity.this.runOnUiThread(new Runnable()
   {
    @Override
    public void run()
    {
     Toast.makeText(ButtonAndMenuActivity.this, "点击了按钮精灵buttonSprite3", 3000).show();
    }
   });
  }
  else if (pButtonSprite == btnAllSprite4)
  {
   //安全的做法是在更新线程做删除,更新等操作
   this.runOnUpdateThread(new Runnable()
   {
    @Override
    public void run()
    {
     //返回到最开始状态
     mScene.clearChildScene();
     mScene.attachChild(buttonSprite);
    }
   });
  }
 }
 
 
 
}

分享到:
评论

相关推荐

    andengine封装动画精灵类

    封装了个andengine的动画精灵类,可以直接传入多张小图片的名称,直接生成动画精灵

    AndEngine进阶之自定义Tiled精灵

    AndEngine游戏引擎进阶之自定义Tiled精灵,AndEngine游戏引擎是一个开源的Android 2D游戏引擎。

    AndEngine 精灵场景坐标转换

    在制作动画精灵的时候,为了方便计算,常常需要把场景中的坐标转换为精灵的内部坐标,或者需要把精灵的内部坐标转换为场景坐标.如果精灵没有进行过旋转操作,他们之间只差 一个offse而已

    一个关于andengine中精灵 动作的简单例子

    我根据andengine文档和网上的例子,自己加工在androidstadio上运行代码中有我照着文档写的例子,根据自己理解做了一点注释,希望对新人有帮助

    AndEngine下载

    AndEngine下载 AndEngine

    andengine源码及demo

    andengine源码,源码扩展及demo,供14个project

    andengine 类代码组织图

     AndEngine是一个开源项目。这使得开发者在遇到问题时可以直接从源码上找到答案,也能按照自己的需要对AndEngine进行修改和扩展。AndEngine的源码在github上托管[2]。 高效  AndEngine主要使用Java语言开发,但在...

    AndEngine 类 组织图

     AndEngine是一个开源项目。这使得开发者在遇到问题时可以直接从源码上找到答案,也能按照自己的需要对AndEngine进行修改和扩展。AndEngine的源码在github上托管[2]。 高效  AndEngine主要使用Java语言开发,但在...

    andengine2.0开发的小游戏

    利用andengine2.0开发的一款小游戏,有兴趣的朋友可以研究下。

    AndEngine最新jar包

    AndEngine最新jar包 AndEngine最新jar包 AndEngine最新jar包

    andengine 中文

    andengine 中文文档

    Andengine笔记

    AndEngine基于libGDX框架开发,使用OpenGL ES进行图形绘制,底层... 相较Libgdx引擎:AndEngine拥有更多的游戏组件与扩展功能;并且它在默认情况下已经可以支持中文;采用屏幕坐标系绘也更符合一般Android绘图习惯。

    android andengine 代码 AnimatedSprite 实例

    android andengine 代码 AnimatedSprite 实例 大家一起学习android andengine 游戏开发吧

    andEngine粒子系统使用之px文件

    andEngine粒子系统使用之采用px文件的方式构建自己的粒子系统,源代码案例

    基于AndEngine的滑动关卡选择菜单

    基于AndEngine的滑动选择菜单 类似愤怒小鸟的关卡选择

    AndEngine游戏开发示例

    AndEngine游戏开发示例 详情请链接至:http://blog.csdn.net/lan410812571/article/details/9716743

    Andengine全套git库

    Andengine全套的git库,包括 AndEngineAugmentedRealityExtension AndEngineLiveWallpaperExtension AndEngineMODPlayerExtension AndEngineMultiplayerExtension AndEngineMultiTouchExtension (Merged into the '...

    AndEngine自定义Button

    AndEngine实现自定义Button

    AndEngine入门篇

    AndEngine游戏引擎学习入门篇,如果你想学习Android游戏开发,请从这里开始!详细的注释

    andengine案例,jar包

    andengine.jar 2013最新,andengine+8个拓展jar包,两个案例apk. 包括andengineExample基于GLES2

Global site tag (gtag.js) - Google Analytics