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
www.ogengine.com
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。