Spirte简介
sprite可以说是游戏中的主角,我们建立各种图片,人物的显示都离不开它。sprite类很丰富,如果看过源代码的不难发现,可用的类型很多:基础精灵Spirte、动画精灵AnimatedSpirte、按键精灵ButtonSprite.
你可以有多种选择,可以直接使用AnimatedSprite来绘制人物动画,可以使用ButtonSprite来绘制按钮,也可以继承Sprite类实现自己的精灵。因此,我们在此介绍Sprite的使用,首先让我们了解下精灵的相关知识:
纹理Texture 和 BitmapTextureAtlas
要绘制一个精灵sprite, 必须要加载其纹理Texture。纹理就是绘制在Sprite对象上的位图,OGEngine引擎在内存中以Texture对象的形式储存所有纹理,并通过TextureManager来管理游戏中的所有Texture对象。
BitmapTextureAtlas 可以被认为是一个包含很多不同纹理的地图,主要是把一下贴图粘在一起组合成一张大的Texture.
首先了解下它的构造:
- public BitmapTextureAtlas(final TextureManager pTextureManager, final int pWidth, final int pHeight) {
- this(pTextureManager, pWidth, pHeight, BitmapTextureFormat.RGBA_8888);
- }
复制代码
因为在OGEngine中载入的贴图的宽高必须是2的整次幂,所有可以发现pWidth,pHeight的值都是遵循的。如果宽高值不是2的整次幂,会抛出IllegalArgumentException异常。可是在游戏中使用的图片宽高是多种多样的,不可能都是2整次幂。所以有了贴图区域TextureRegion的概念。另外一个值得注意的东西就是TextureRegion,它可以从BitmapTextureAtlas中"扣"出一张贴图
- /**创建2次幂高和宽的纹理图片组合对象*/
- BitmapTextureAtlas bgTexture = new BitmapTextureAtlas(
- getEngine().getTextureManager(), 2048, 128);
- /**生成纹理区域bgRegion*/
- TextureRegion bgRegion = BitmapTextureAtlasTextureRegionFactory.
- createFromAsset(bgTexture, getActivity().getAssets(),"gfx/bg.jpg",0,0);
- /**在引擎中加载纹理组合*/
- getEngine().getTextureManager().loadTexture(bgTexture);
复制代码
(其中图片资源bg.jpg需要放到asset目录下的gfx文件夹里)
创建精灵sprite
(一)普通sprite
sprite是Entity的子类,精灵在游戏中是人或者物体的视觉表现形式,“精灵”一词本来指放置在游戏背景上且带有动画的独立图形形象。它的大部分方法还是来自Entity类
1) 缩放:
- setScaleX(final float pScaleX)
- setScaleY(final float pScaleY)
- setScale(final float pScale)
- //分别对应X方向,Y方向,和整体缩放。
复制代码
2) 透明度:
- setAlpha(float pAlpha) //对应的透明度
复制代码
3) 设置位置:
- setPosition(float pX, float pY)
- setPosition(IEntity pOtherEntity)
- //前面一个直接给出坐标即可,这个常用在图片拖拽,和移动位置时使用;也可以直接设置相对坐标,
- //如:setLeftPositionX(float pX); setTopPositionY(float pY);
- //后面会给一个IEntity的对象,然后它会取得IEntity的对象的坐标值来赋给当前精灵的坐标值
复制代码
4) 旋转:
- setRotation(float pRotation)
- //参数是角度,即45度(45f),90度(90f),180度(180f)
- /**辅助的设置还有旋转的中心点*/
- setRotationCenterX(final float pRotationCenterX)://X坐标
- setRotationCenterY(final float pRotationCenterY)://Y坐标
- setRotationCenter(final float pRotationCenterX, final float pRotationCenterY)://X坐标Y坐标
复制代码
在Scene中创建精灵:
- /**创建精灵对象*/
- Sprite bg = new Sprite(0, 0, BG, this.getVertexBufferObjectManager());
复制代码
把精灵添加到场景中
- /**在场景里面添加精灵*/
- this.attachChild(bg);
复制代码
(二)动画精灵AnimatedSprite
一.用处
OGEngine封装了一个TiledSprite类,可以传入TiledTextureRegion的纹理以构造一个可以连续播放的精灵,但必须要先制作好一张动画序列图片,俗称Tiled图。而AnimateSprite(动画精灵)继承于TiledSprite,用来描述一些帧动画资源。AnimatedSprite的构造方法中需要的ITiledTextureRegion是Tiled而不是普通的TextureRegion,也就是说,是基于单帧动画资源的!
二.TiledTextureRegion资源TileTextureRegion的一般用法,就是一张大图,是由很多单帧图片构成的,一般是通过调用BitmapTextureAtlasTextureRegionFactory中的createTiledFromAsset(...)方法创建的。
- /** 创建2次幂高和宽的纹理图片组合对象 */
- BitmapTextureAtlas bgTexture = new BitmapTextureAtlas(getEngine()
- .getTextureManager(), 1024, 1024);
- /** 生成纹理区域mTextureRegion */
- TiledTextureRegion mTextureRegion = BitmapTextureAtlasTextureRegionFactory
- .createTiledFromAsset(bgTexture,
- this.getActivity().getAssets(),
- "gfx/snapdragon_tiled.png", 0, 0, 4, 3);
- /** 在引擎中加载纹理组合 */
- getEngine().getTextureManager().loadTexture(bgTexture);
复制代码
这是一般用法,正是这些静态方法,让我们忽略了TiledTextureRegion自身的构造方法
- public TiledTextureRegion(final ITexture pTexture, final ITextureRegion ... pTextureRegions)
复制代码
三.归根结底
其实要想找到这个问题的解决方法很简单,就是一步一步跟下来,从BitmapTextureAtlasTextureRegionFactory的createTiledFromAsset(),到TextureRegionFactory的createTiledFromSource(),再到TiledTextureRegion的create(),当你看到下面的代码时,脑筋一转,就知道归根结底还是调用的TiledTextureRegion的构造方法了。。。
四.创建动画精灵
- /**创建精灵对象*/
- AnimateSprite bg = new AnimateSprite(0, 0, mTextureRegion ,
- this.getVertexBufferObjectManager());
复制代码
五.把精灵添加到场景中
- /**在场景里面添加精灵*/
- this.attachChild(bg);
- /**设置精灵动画播放频率*/
- bg.animate(100);
复制代码
(三)按钮精灵
ButtonSprite和AnimateSprite类似,ButtonSprite的构造函数中需要的也是TiledTextureRegion,区别就是ButtonSprite分为3种状态,NORMAL,PRESSED,DISABLED,默认状态为NORMAL。按下的时候会显示第2帧动画,不可按时显示第3帧动画。创建ButtonSprite和往scene中添加方法:
- /** 创建精灵对象 */
- ButtonSprite bg2 = new ButtonSprite(100, 100, mSnapdragonTextureRegion, this.getVertexBufferObjectManager());
- /**在场景里面添加精灵*/
- this.attachChild(bg2);
复制代码
ButtonSprite添加触摸监听必须要先取消触摸阻塞,
- /** 取消触摸阻塞 */
- bg2.setIgnoreTouch(false);
- bg2.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(ButtonSprite pButtonSprite,
- float pTouchAreaLocalX, float pTouchAreaLocalY) {
- // TODO Auto-generated method stub
- Log.v("tag", "bg2");
- }
- });
http://www.eoeandroid.com/forum-863-1.html
OGEngine游戏开发之精灵(sprite)