温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

OGEngine游戏开发之精灵(sprite)

发布时间:2020-10-02 14:49:00 来源:网络 阅读:403 作者:橙游Orange 栏目:开发技术

Spirte简介

sprite可以说是游戏中的主角,我们建立各种图片,人物的显示都离不开它。sprite类很丰富,如果看过源代码的不难发现,可用的类型很多:基础精灵Spirte、动画精灵AnimatedSpirte、按键精灵ButtonSprite.

你可以有多种选择,可以直接使用AnimatedSprite来绘制人物动画,可以使用ButtonSprite来绘制按钮,也可以继承Sprite类实现自己的精灵。因此,我们在此介绍Sprite的使用,首先让我们了解下精灵的相关知识:


纹理Texture 和 BitmapTextureAtlas

要绘制一个精灵sprite, 必须要加载其纹理Texture。纹理就是绘制在Sprite对象上的位图,OGEngine引擎在内存中以Texture对象的形式储存所有纹理,并通过TextureManager来管理游戏中的所有Texture对象。

BitmapTextureAtlas 可以被认为是一个包含很多不同纹理的地图,主要是把一下贴图粘在一起组合成一张大的Texture.

首先了解下它的构造:

  1. public BitmapTextureAtlas(final TextureManager pTextureManager, final int pWidth, final int pHeight) {

  2.                 this(pTextureManager, pWidth, pHeight, BitmapTextureFormat.RGBA_8888);

  3. }

复制代码

因为在OGEngine中载入的贴图的宽高必须是2的整次幂,所有可以发现pWidth,pHeight的值都是遵循的。如果宽高值不是2的整次幂,会抛出IllegalArgumentException异常。可是在游戏中使用的图片宽高是多种多样的,不可能都是2整次幂。所以有了贴图区域TextureRegion的概念。另外一个值得注意的东西就是TextureRegion,它可以从BitmapTextureAtlas中"扣"出一张贴图

  1. /**创建2次幂高和宽的纹理图片组合对象*/

  2. BitmapTextureAtlas bgTexture = new BitmapTextureAtlas(

  3. getEngine().getTextureManager(), 2048, 128);


  4. /**生成纹理区域bgRegion*/

  5. TextureRegion bgRegion = BitmapTextureAtlasTextureRegionFactory.

  6. createFromAsset(bgTexture, getActivity().getAssets(),"gfx/bg.jpg",0,0);


  7. /**在引擎中加载纹理组合*/

  8. getEngine().getTextureManager().loadTexture(bgTexture);

复制代码

(其中图片资源bg.jpg需要放到asset目录下的gfx文件夹里)


创建精灵sprite


(一)普通sprite

sprite是Entity的子类,精灵在游戏中是人或者物体的视觉表现形式,“精灵”一词本来指放置在游戏背景上且带有动画的独立图形形象。它的大部分方法还是来自Entity类

1) 缩放:

  1. setScaleX(final float pScaleX)

  2. setScaleY(final float pScaleY)

  3. setScale(final float pScale)

  4. //分别对应X方向,Y方向,和整体缩放。

复制代码


2) 透明度:

  1. setAlpha(float pAlpha) //对应的透明度

复制代码

3) 设置位置:

  1. setPosition(float pX, float pY) 

  2. setPosition(IEntity pOtherEntity)

  3. //前面一个直接给出坐标即可,这个常用在图片拖拽,和移动位置时使用;也可以直接设置相对坐标,

  4. //如:setLeftPositionX(float pX); setTopPositionY(float pY); 

  5. //后面会给一个IEntity的对象,然后它会取得IEntity的对象的坐标值来赋给当前精灵的坐标值

复制代码


4) 旋转:

  1. setRotation(float pRotation)

  2. //参数是角度,即45度(45f),90度(90f),180度(180f)

  3. /**辅助的设置还有旋转的中心点*/

  4. setRotationCenterX(final float pRotationCenterX)://X坐标

  5. setRotationCenterY(final float pRotationCenterY)://Y坐标

  6. setRotationCenter(final float pRotationCenterX, final float pRotationCenterY)://X坐标Y坐标

复制代码


Scene中创建精灵:

  1. /**创建精灵对象*/

  2. Sprite bg = new Sprite(0, 0, BG, this.getVertexBufferObjectManager());

复制代码


把精灵添加到场景中

  1. /**在场景里面添加精灵*/ 

  2. this.attachChild(bg);

复制代码



(二)动画精灵AnimatedSprite


一.用处

OGEngine封装了一个TiledSprite类,可以传入TiledTextureRegion的纹理以构造一个可以连续播放的精灵,但必须要先制作好一张动画序列图片,俗称Tiled。而AnimateSprite(动画精灵)继承于TiledSprite,用来描述一些帧动画资源。AnimatedSprite的构造方法中需要的ITiledTextureRegionTiled而不是普通的TextureRegion,也就是说,是基于单帧动画资源的!


二.TiledTextureRegion资源TileTextureRegion的一般用法,就是一张大图,是由很多单帧图片构成的,一般是通过调用BitmapTextureAtlasTextureRegionFactory中的createTiledFromAsset(...)方法创建的

  1. /** 创建2次幂高和宽的纹理图片组合对象 */

  2. BitmapTextureAtlas bgTexture = new BitmapTextureAtlas(getEngine()

  3.                                 .getTextureManager(), 1024, 1024);


  4. /** 生成纹理区域mTextureRegion */

  5. TiledTextureRegion mTextureRegion = BitmapTextureAtlasTextureRegionFactory

  6.                                 .createTiledFromAsset(bgTexture,

  7.                                         this.getActivity().getAssets(),

  8.                                   "gfx/snapdragon_tiled.png", 0, 0, 4, 3);


  9. /** 在引擎中加载纹理组合 */

  10. getEngine().getTextureManager().loadTexture(bgTexture);

复制代码




这是一般用法,正是这些静态方法,让我们忽略了TiledTextureRegion自身的构造方法

  1. public TiledTextureRegion(final ITexture pTexture, final ITextureRegion ... pTextureRegions)

复制代码


三.归根结底

其实要想找到这个问题的解决方法很简单,就是一步一步跟下来,从BitmapTextureAtlasTextureRegionFactorycreateTiledFromAsset(),到TextureRegionFactorycreateTiledFromSource(),再到TiledTextureRegioncreate(),当你看到下面的代码时,脑筋一转,就知道归根结底还是调用的TiledTextureRegion的构造方法了。。。

四.创建动画精灵

  1. /**创建精灵对象*/

  2. AnimateSprite bg = new AnimateSprite(0, 0, mTextureRegion , 

  3. this.getVertexBufferObjectManager());

复制代码



五.把精灵添加到场景中

  1. /**在场景里面添加精灵*/ 

  2. this.attachChild(bg);

  3. /**设置精灵动画播放频率*/

  4. bg.animate(100);

复制代码


(三)按钮精灵

ButtonSprite和AnimateSprite类似,ButtonSprite的构造函数中需要的也是TiledTextureRegion,区别就是ButtonSprite分为3种状态,NORMAL,PRESSED,DISABLED,默认状态为NORMAL。按下的时候会显示第2帧动画,不可按时显示第3帧动画。创建ButtonSprite和往scene中添加方法:

  1. /** 创建精灵对象 */

  2. ButtonSprite bg2 = new ButtonSprite(100, 100, mSnapdragonTextureRegion, this.getVertexBufferObjectManager());

  3. /**在场景里面添加精灵*/ 

  4. this.attachChild(bg2);

复制代码

ButtonSprite添加触摸监听必须要先取消触摸阻塞,

  1. /** 取消触摸阻塞 */

  2. bg2.setIgnoreTouch(false);

  3. bg2.setOnClickListener(new OnClickListener() {

  4.         @Override

  5.         public void onClick(ButtonSprite pButtonSprite,

  6.                         float pTouchAreaLocalX, float pTouchAreaLocalY) {

  7.         // TODO Auto-generated method stub

  8.                 Log.v("tag", "bg2");

  9.         }

  10. });

 http://www.eoeandroid.com/forum-863-1.html

www.ogengine.com



向AI问一下细节

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

AI