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这个强大的2D游戏开发引擎中,精灵(Sprite)是核心的视觉元素之一,它代表了游戏画面中的一个可移动或可交互的对象。在这个主题中,我们讨论的是一个已经封装好的AndEngine动画精灵类,它使得创建和管理...
在AndEngine游戏开发中,Tiled精灵是一种常用的游戏对象,用于创建连续播放的动画效果。AndEngine内置的TiledSprite类允许开发者通过TiledTextureRegion来构建这样的精灵,但是这通常需要预先准备一个包含所有帧的...
在AndEngine这个强大的2D游戏开发引擎中,精灵(Sprite)和场景(Scene)的坐标系统是两个独立的体系,理解和有效地在它们之间进行坐标转换是实现动态游戏元素的关键。让我们深入探讨一下这个主题。 首先,...
在Android游戏开发中,AndEngine是一个非常受欢迎的2D游戏引擎,它允许开发者轻松地创建出高质量的2D游戏。本篇文章将详细讲解AndEngine中精灵(Sprite)及其动作(Animations)的应用,以一个简单的例子为基础,...
AndEngine是一款专为Android平台设计的游戏开发框架,它简化了2D游戏的创建过程,让开发者无需深入理解底层图形库,就能快速构建出高质量的移动游戏。本示例旨在介绍如何利用AndEngine进行游戏开发,通过实例化引擎...
AndEngine通过其灵活的精灵(Sprite)系统和场景管理器(Scene Manager)支持这些功能,使得开发者能够轻松地创建动态游戏对象和复杂的交互场景。 AndEngine的核心特性包括: 1. **渲染引擎**:AndEngine的渲染...
本示例源码着重展示了如何利用AndEngine将多张小图片合并成一张大图,进而创建动画精灵,实现动态效果。这个过程通常被称为精灵表(Sprite Sheet)或纹理 atlas 技术,对于优化资源加载和减少渲染时的draw调用次数...
AndEngine是一款专为Android平台设计的游戏开发引擎,它简化了2D游戏的创建过程,让开发者无需深入理解底层图形库,就能快速构建游戏。本入门篇将带你了解AndEngine的基本概念、架构以及如何开始你的第一个AndEngine...
- **Physics Blender Tools**: 这个扩展与Blender(一款3D建模软件)集成,允许开发者在Blender中设计物理世界,然后导出到AndEngine,简化了物理环境的创建。 - **Multiplayer Extension**: 提供多人在线游戏的...
2. **灵活的图形系统**:AndEngine提供了一系列的图形对象,如精灵(Sprite)、纹理(Texture)、纹理区域(TextureRegion)等,方便开发者创建复杂的2D场景。 3. **物理引擎集成**:AndEngine可以与Box2D物理引擎无缝...
开发者可以利用AndEngine提供的基础类和工具类,如Scene(场景)、Sprite(精灵)、Camera(相机)等来构建游戏世界,通过Physics Engine(物理引擎)实现物体碰撞检测,通过Particle System(粒子系统)创建绚丽的...
在Android游戏开发中,AndEngine是一款非常受欢迎的2D游戏引擎,它提供了丰富的功能和工具,使得开发者可以轻松创建各种2D游戏。本教程将深入探讨如何利用AndEngine实现一个类似于“愤怒的小鸟”那样的滑动关卡选择...
Andengine是一款专为Android平台设计的游戏开发引擎,它基于OpenGL ES,提供了丰富的图形渲染和物理模拟功能,使得开发者能够快速创建2D游戏。Andengine的jar包是其核心库,包含了实现游戏逻辑、动画效果、碰撞检测...
AndEngine是一款专为Android平台设计的游戏开发框架,它基于OpenGL ES 1.1或2.0,提供了一套高效、易用的2D游戏开发工具。这个“andengine 中文”压缩包包含的是AndEngine的中文文档,对于想要在Android上进行游戏...
AndEngine的核心在于其强大的渲染引擎,它支持精灵(Sprites)、纹理(Textures)、纹理区域(Texture Regions)以及多边形(Polygons)等基本图形元素。此外,还有动画系统、物理引擎接口、碰撞检测以及场景管理等...
3. **图形与精灵**:AndEngine支持多种图形元素,包括Sprites(精灵),这是游戏中动态对象的基础。文档会讲解如何创建、加载和动画化精灵,以及如何处理碰撞检测。 4. **纹理与纹理 atlases**:纹理是游戏图形的...
通过AndEngine,开发者无需深入理解OpenGL ES的复杂细节,就能利用其强大的图形处理能力创建出高质量的视觉效果。 "JAR文件"是Java Archive的简称,是Java平台上的一个标准归档文件格式,包含了Java类和资源文件。...
这个最新的AndEngine Jar包更新可能包含了各种性能优化和新特性,使得开发者能够利用更先进的技术来创建引人入胜的游戏体验。关于描述中提到的`attachChild()`方法,它是AndEngine中用于在场景中添加游戏对象的关键...
在AndEngine中,UI元素的创建是游戏界面交互的重要组成部分,而Button(按钮)是用户界面中最基本且不可或缺的组件之一。本篇文章将深入探讨如何在AndEngine中实现自定义Button。 首先,理解AndEngine中的基本元素...
3. **动画与粒子系统实现**:研究如何使用AndEngine的动画和粒子系统创建动态效果。 4. **事件处理**:学习如何响应用户的触摸事件,控制炮弹发射,以及处理游戏中的各种交互。 5. **物理引擎集成**:如果源代码中...