`

(5)、andengine之SpriteBatch(精灵族--动态和静态)

 
阅读更多

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.scene.background.Background;
import org.andengine.entity.sprite.Sprite;
import org.andengine.entity.sprite.batch.DynamicSpriteBatch;
import org.andengine.entity.sprite.batch.SpriteBatch;
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.region.TextureRegion;
import org.andengine.ui.activity.SimpleBaseGameActivity;
import org.andengine.util.color.Color;

import android.util.DisplayMetrics;
/**
 * 使用SpriteBatch批量绘制Sprite
 */
public class SpriteBatchActivity extends SimpleBaseGameActivity
{
 private static int winWidth = 854;
 private static int winHeight = 480;
 //图片纹理区域
 private BitmapTextureAtlas mBitmapTextureAtlas;
 private TextureRegion mTextureRegion;
 
 
 @Override
 public EngineOptions onCreateEngineOptions()
 {
  setScreenDisplay();
  Camera camera = new Camera(0, 0, winWidth, winHeight);
  EngineOptions engineOptions = new EngineOptions(
    true, ScreenOrientation.LANDSCAPE_FIXED,
    new RatioResolutionPolicy(winWidth, winHeight),
    camera);
  return engineOptions;
 }

 @Override
 protected void onCreateResources()
 {
  //设置图片的路径
  BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("images/");
  mBitmapTextureAtlas = new BitmapTextureAtlas(this.getTextureManager(), 32, 32, TextureOptions.DEFAULT);
  //后面两个参数是指该纹理加载到纹理区域上的什么位置
  mTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(mBitmapTextureAtlas, this, "face_box.png", 0, 0);
  //真正加载
  mBitmapTextureAtlas.load();
 }

 @Override
 protected Scene onCreateScene()
 {
  this.mEngine.registerUpdateHandler(new FPSLogger());
  Scene scene = new Scene();
  //颜色:真实值/255
  scene.setBackground(new Background(new Color(0.6f,0.8f,0.6f)));
  
  final float centerX = (winWidth - mTextureRegion.getWidth()) / 2;
  final float centerY = (winHeight - mTextureRegion.getHeight()) / 2;
  
  final Sprite sprite1 = new Sprite(-50, 0, mTextureRegion, this.getVertexBufferObjectManager());
  final Sprite sprite2 = new Sprite(-50, 150, mTextureRegion, this.getVertexBufferObjectManager());
  //缩放原来的3倍
  sprite1.setScale(3);
  //精灵中心为轴顺时针方向旋转50度
  sprite1.setRotation(50);
  /**
   * SpriteBatch的使用,我们知道精灵无非是一个纹理和他对应范围的组合;
   * 那精灵族可以直观的把它看成同一纹理对应多个范围的形式。我们可以通过draw方法在其中增加新的显示范围,包括定义其大小方向等等,
   * 但是mTexture是不能改变的,相当于同一张图片渲染了多次。
   * 可以使用SpriteBatch批量绘制Sprite,
   * SpriteBatch又分为静态的和动态的,把SpriteBatch设想为画布,
   * 动态的无需在初始化的时候指定范围,而是根据每个Sprite自身的参数绘制,
   * 当需要渲染的时候他会回调onUpdateSpriteBatch让程序更新当时情况设置。
   *
   * 静态的必须要指定每个Sprite在画布中的绘制位置,长宽,比例,旋转等参数,
   * 添加完成之后一定要提交,这样才能完成渲染,动态的提交写如begin方法里面,我们可以不管。
   * 最后,要把SpriteBatch添加到Scene中。
   */
  //动态的精灵族
  SpriteBatch dynamicSpriteBatch = new DynamicSpriteBatch(mBitmapTextureAtlas,2,this.getVertexBufferObjectManager())
  {
   /**
    * 该方法是一直在循环执行的
    */
   @Override
   protected boolean onUpdateSpriteBatch()
   {
    draw(sprite1);
    draw(sprite2);
    return true;
   }
  };
  
  //静态精灵组
  SpriteBatch staticSpriteBatch = new SpriteBatch(mBitmapTextureAtlas, 2, this.getVertexBufferObjectManager());
  //后面的颜色是精灵的背景色
  staticSpriteBatch.draw(mTextureRegion, 20, 20, mTextureRegion.getWidth(), mTextureRegion.getHeight(), -45, 1, 1, 1, 1);
  staticSpriteBatch.draw(mTextureRegion, 20, 120, mTextureRegion.getWidth(), mTextureRegion.getHeight(), 45, 1, 1, 1, 0.3f);
  //添加完成之后一定要提交,这样才能完成渲染,动态的提交写如begin方法里面,我们可以不管
  staticSpriteBatch.submit();
  //设置整组精灵的初始位置
  dynamicSpriteBatch.setPosition(centerX, centerY);
  
  scene.attachChild(dynamicSpriteBatch);
  scene.attachChild(staticSpriteBatch);
  
  return scene;
 }

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

分享到:
评论

相关推荐

    AndEngine_分析之三-----AsyncTask_BaseActivity备忘

    ### AndEngine分析之三——AsyncTask与BaseActivity深入解析 #### 一、AsyncTask概述 在AndEngine项目中,为了实现界面更新等操作时避免主线程阻塞的问题,使用了`AsyncTask`来处理后台任务。`AsyncTask`提供了一...

    AndEngine_分析之二-----BaseGameActivity. 中文

    BaseGameActivity 是 AndEngine 框架中一个关键的组件,它是游戏的基础,负责管理游戏的引擎和SurfaceView。它继承自 BaseActivity,并实现了 IGameInterface 接口。 BaseGameActivity 的主要作用是: 1. 创建...

    AndEngine_分析之一----载入资源 这个是英文的

    在Android游戏开发中,AndEngine是一个非常流行的2D游戏引擎,它允许开发者创建高质量的图形和交互式体验。本文将探讨如何在AndEngine中实现后台加载资源,同时展示一个使用AsyncTask来处理加载过程的示例。 在...

    AndEngine游戏-DeliveryBoy-源代码

    4. **动画处理**:AndEngine提供动画系统,支持帧动画和精灵动画,使角色和游戏元素的动作更加流畅。 5. **用户输入处理**:通过监听触摸事件,开发者可以控制游戏角色的行为,例如移动、跳跃等。 6. **音频管理**...

    andEngine最新版的JAVA-DOC

    用andEngine最新的代码,然后用javadoc和easychm工具将它做成了chm格式的帮助文档,现在传到了上面,有需要的朋友可以下载

    andengine封装动画精灵类

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

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

    首先,AndEngine中的精灵是2D游戏中的基本元素,它可以是一个静态图像或动态图像序列,通常用于表示游戏中的角色、道具或其他可视化对象。精灵由`Sprite`类表示,包含了一个纹理坐标、尺寸以及在屏幕上的位置。创建...

    AndEngine 精灵场景坐标转换

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

    AndEngine-GLES2

    2. **精灵和纹理管理**:AndEngine提供了精灵(Sprite)和纹理(Texture)类,便于开发者管理游戏中的静态或动态图像,如角色、背景和动画效果。 3. **物理引擎集成**:通过Box2D物理引擎的集成,AndEngine可以实现...

    andengine-gles2.jar

    AndEngine 2013-3-12 最新Jar包,直接拉进项目libs即可,可查看源代码

    andengine-skeleton-android-studio:编译andEngine和andEngineBox2DExtension的就绪版本

    ##摘要以下是andEngine和andEnginePhysicsBox2DExtension的可编译就绪源代码集,仅在Android Studio中使用。 JNI本机扩展已被编译并包含在内,而所需要做的只是开始编写您的游戏。 这是我们的游戏《 Dot!Panic》的...

    AndEngine-GLES2-Example Eclipse Android 工程

    AndEngine 2013-2月 最新Example,直接导入Eclipse即可,API15, 环境 Android 4.0.3

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

    5. **精灵批处理(SpriteBatch)**:AndEngine支持精灵批处理,允许一次性绘制多个精灵,进一步提高渲染效率。通过`SpriteBatch`,开发者可以在一次OpenGL调用中绘制所有精灵,减少了GPU交互次数。 6. **纹理管理**...

    AndEngine进阶之自定义Tiled精灵

    5. **纹理加载**:为了加载和管理非Tiled的图片资源,类可能依赖于自定义的`ITextureLoadManager`接口和`TextureUtils`工具类,以便于在运行时动态加载和卸载纹理。 6. **碰撞检测**:由于继承自BaseRectangle,...

    AndEngine的官网下载的Demo

    AndEngine是一款针对Android平台开发2D游戏的开源引擎,它以简单易用和高效著称。这个Demo是AndEngine官方网站提供的示例集合,用于帮助开发者更好地理解和学习如何使用AndEngine来构建游戏。以下是对AndEngine及其...

    捕鱼海底捞andengine源代码

    AndEngine的SpriteBatch和ParticleSystem类能很好地实现这些效果。 3. **物理模拟**:虽然游戏规则相对简单,但鱼的移动和碰撞效果可能需要物理引擎来实现,以增加游戏的真实感。 4. **分数系统与游戏逻辑**:捕获...

    Android andengine中直接加载多张小图片合成一张大图片生成动画精灵-IT计算机-毕业设计.zip

    这个毕业设计项目的核心是利用AndEngine的技术实现动态精灵(Sprite)的动画效果,通过将多张小图片组合成一张大图片,然后在运行时分割和动态加载,以达到流畅的动画效果。 一、AndEngine简介 AndEngine是一款开源...

    AndEngine范例-源码

    5. **物理模拟**:利用Box2D或AndEngine内置的物理引擎,演示如何实现物理效果,如重力、碰撞反弹等。 6. **用户输入处理**:如何响应触摸事件,实现角色移动、跳跃等操作。 7. **音频管理**:包含背景音乐和音效的...

    AndEngine游戏开发示例

    物理引擎在AndEngine中扮演着重要角色,特别是对于需要动态模拟的游戏。AndEngine支持Box2D物理引擎的集成,可以创建可碰撞的物体,实现重力、弹性等物理效果。通过Body、Fixture和Joint等Box2D对象,你可以创建复杂...

Global site tag (gtag.js) - Google Analytics