`

(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这个强大的2D游戏开发引擎中,精灵(Sprite)是核心的视觉元素之一,它代表了游戏画面中的一个可移动或可交互的对象。在这个主题中,我们讨论的是一个已经封装好的AndEngine动画精灵类,它使得创建和管理...

    AndEngine进阶之自定义Tiled精灵

    在AndEngine游戏开发中,Tiled精灵是一种常用的游戏对象,用于创建连续播放的动画效果。AndEngine内置的TiledSprite类允许开发者通过TiledTextureRegion来构建这样的精灵,但是这通常需要预先准备一个包含所有帧的...

    AndEngine 精灵场景坐标转换

    在AndEngine这个强大的2D游戏开发引擎中,精灵(Sprite)和场景(Scene)的坐标系统是两个独立的体系,理解和有效地在它们之间进行坐标转换是实现动态游戏元素的关键。让我们深入探讨一下这个主题。 首先,...

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

    在Android游戏开发中,AndEngine是一个非常受欢迎的2D游戏引擎,它允许开发者轻松地创建出高质量的2D游戏。本篇文章将详细讲解AndEngine中精灵(Sprite)及其动作(Animations)的应用,以一个简单的例子为基础,...

    AndEngine游戏开发示例

    AndEngine是一款专为Android平台设计的游戏开发框架,它简化了2D游戏的创建过程,让开发者无需深入理解底层图形库,就能快速构建出高质量的移动游戏。本示例旨在介绍如何利用AndEngine进行游戏开发,通过实例化引擎...

    andengine2.0开发的小游戏

    AndEngine通过其灵活的精灵(Sprite)系统和场景管理器(Scene Manager)支持这些功能,使得开发者能够轻松地创建动态游戏对象和复杂的交互场景。 AndEngine的核心特性包括: 1. **渲染引擎**:AndEngine的渲染...

    Android应用源码之andengine中直接加载多张小图片合成一张大图片生成动画精灵.zip

    本示例源码着重展示了如何利用AndEngine将多张小图片合并成一张大图,进而创建动画精灵,实现动态效果。这个过程通常被称为精灵表(Sprite Sheet)或纹理 atlas 技术,对于优化资源加载和减少渲染时的draw调用次数...

    AndEngine入门篇

    AndEngine是一款专为Android平台设计的游戏开发引擎,它简化了2D游戏的创建过程,让开发者无需深入理解底层图形库,就能快速构建游戏。本入门篇将带你了解AndEngine的基本概念、架构以及如何开始你的第一个AndEngine...

    AndEngine引擎开发所需要的各种包

    - **Physics Blender Tools**: 这个扩展与Blender(一款3D建模软件)集成,允许开发者在Blender中设计物理世界,然后导出到AndEngine,简化了物理环境的创建。 - **Multiplayer Extension**: 提供多人在线游戏的...

    andengine案例,jar包

    2. **灵活的图形系统**:AndEngine提供了一系列的图形对象,如精灵(Sprite)、纹理(Texture)、纹理区域(TextureRegion)等,方便开发者创建复杂的2D场景。 3. **物理引擎集成**:AndEngine可以与Box2D物理引擎无缝...

    AndEngine下载

    开发者可以利用AndEngine提供的基础类和工具类,如Scene(场景)、Sprite(精灵)、Camera(相机)等来构建游戏世界,通过Physics Engine(物理引擎)实现物体碰撞检测,通过Particle System(粒子系统)创建绚丽的...

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

    在Android游戏开发中,AndEngine是一款非常受欢迎的2D游戏引擎,它提供了丰富的功能和工具,使得开发者可以轻松创建各种2D游戏。本教程将深入探讨如何利用AndEngine实现一个类似于“愤怒的小鸟”那样的滑动关卡选择...

    Andengine的jar包

    Andengine是一款专为Android平台设计的游戏开发引擎,它基于OpenGL ES,提供了丰富的图形渲染和物理模拟功能,使得开发者能够快速创建2D游戏。Andengine的jar包是其核心库,包含了实现游戏逻辑、动画效果、碰撞检测...

    andengine 中文

    AndEngine是一款专为Android平台设计的游戏开发框架,它基于OpenGL ES 1.1或2.0,提供了一套高效、易用的2D游戏开发工具。这个“andengine 中文”压缩包包含的是AndEngine的中文文档,对于想要在Android上进行游戏...

    andengine源码及demo

    AndEngine的核心在于其强大的渲染引擎,它支持精灵(Sprites)、纹理(Textures)、纹理区域(Texture Regions)以及多边形(Polygons)等基本图形元素。此外,还有动画系统、物理引擎接口、碰撞检测以及场景管理等...

    AndEngine 中文文档

    3. **图形与精灵**:AndEngine支持多种图形元素,包括Sprites(精灵),这是游戏中动态对象的基础。文档会讲解如何创建、加载和动画化精灵,以及如何处理碰撞检测。 4. **纹理与纹理 atlases**:纹理是游戏图形的...

    AndEngine游戏引擎JAR文件

    通过AndEngine,开发者无需深入理解OpenGL ES的复杂细节,就能利用其强大的图形处理能力创建出高质量的视觉效果。 "JAR文件"是Java Archive的简称,是Java平台上的一个标准归档文件格式,包含了Java类和资源文件。...

    AndEngine最新Jar包

    这个最新的AndEngine Jar包更新可能包含了各种性能优化和新特性,使得开发者能够利用更先进的技术来创建引人入胜的游戏体验。关于描述中提到的`attachChild()`方法,它是AndEngine中用于在场景中添加游戏对象的关键...

    AndEngine自定义Button

    在AndEngine中,UI元素的创建是游戏界面交互的重要组成部分,而Button(按钮)是用户界面中最基本且不可或缺的组件之一。本篇文章将深入探讨如何在AndEngine中实现自定义Button。 首先,理解AndEngine中的基本元素...

    捕鱼海底捞andengine源代码

    3. **动画与粒子系统实现**:研究如何使用AndEngine的动画和粒子系统创建动态效果。 4. **事件处理**:学习如何响应用户的触摸事件,控制炮弹发射,以及处理游戏中的各种交互。 5. **物理引擎集成**:如果源代码中...

Global site tag (gtag.js) - Google Analytics