OGEngine游戏开发之精灵(sprite)

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的构造方法中需要的ITiledTextureRegion是Tiled而不是普通的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)

复制代码

三.归根结底

其实要想找到这个问题的解决方法很简单,就是一步一步跟下来,从BitmapTextureAtlasTextureRegionFactory的createTiledFromAsset(),到TextureRegionFactory的createTiledFromSource(),再到TiledTextureRegion的create(),当你看到下面的代码时,脑筋一转,就知道归根结底还是调用的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

OGEngine游戏开发之精灵(sprite)

时间: 2024-09-30 11:12:38

OGEngine游戏开发之精灵(sprite)的相关文章

15、Cocos2dx 3.0游戏开发找小三之Sprite:每个精灵都是上辈子折翼的天使

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30475395 Sprite Sprite 可以说是游戏中最重要的组成元素: 它描述了游戏中的精灵,是 Node 的一个最重要也最灵活的子类. Sprite 很重要,它代表了游戏中一个最小的可见单位, 同时Sprite 也很灵活,它装载了一个平面纹理,具有丰富的表现力,而且 可以通过多种方式加载. 如果说 Scene 和 Layer 代表了宏观的游戏元素

cocos2d-x ios游戏开发初认识(五) CCsprite精灵类

这次写一下精灵创建的几种类型: 一.通过文件创建: 在原有的基础上添加如下代码: //一.通过文件创建精灵 CCSprite *bg =CCSprite::create("map.png"); CCSize winSize  =CCDirector::sharedDirector()->getWinSize(); //得到屏幕的尺寸 bg->setPosition(ccp(winSize.width/2, winSize.height/2)); this->addCh

Cocos2d-x 自定义按钮类控制精灵攻击----之游戏开发《赵云要格斗》

本篇要讲讲怎么自定义按钮类,并通过这个按钮类的对像来控制精灵的攻击.在看本篇之前最好先看看上一篇 Cocos2d-x虚拟摇杆控制精灵上下左右运动----之游戏开发<赵云要格斗>,要素材和项目代码的把邮箱留下吧,因为这个项目还没弄完,我一直在改. 精灵的攻击也是一个动画,只不过,这个动画只播放一次,相当于在界面上加一个按钮,然后你点一次按钮,精灵就播放一次动画. 一.自定义按钮类 按钮可以用COCOS2D-X自带的,想着方便一点,我就自己封装了一个按钮类ControlButton,在里面添加一个

Cocos2d-x地图随精灵无限滚动与边缘检测----之游戏开发《赵云要格斗》

本章在前面Cocos2d-x 自定义按钮类控制精灵攻击----之游戏开发<赵云要格斗>的基础上,实现了精灵向右运动到地图中间时,地图能跟着移动,但此时精灵是原地不动只是播放跑动画.并且,当地图移动到边缘时,地图不在移动,但此时精灵能移动同时播放跑动画.当前工程一直在修改中,有需要的把邮箱留下就是哈,后头不修改了我会把每一个一个工程都上传上去.  目录 一.在英雄类中增加判断英雄是否运动到了窗口的中间位置函数 二.自定义地图类 三.根据英雄精灵和窗口的大小来移动地图或移动精灵 四.思路总结 一.

Unity 2D游戏开发教程之精灵的死亡和重生

Unity 2D游戏开发教程之精灵的死亡和重生 精灵的死亡和重生 目前为止,游戏项目里的精灵只有Idle和Walking这两种状态.也就是说,无论精灵在游戏里做什么,它都不会进入其它的状态,如死亡.于是我们发现游戏里的精灵,即使是跳入“万丈深渊”,也依然存活,显然这种游戏逻辑无法让人接受.因此,本节就来说明为精灵添加死亡和重生这两种状态的方法,并使用脚本实现这两种状态的逻辑.具体的实现步骤如下: (1)在Hierarchy视图里,新建一个Empty对象,并命名为Death Trigger,设置其

Unity 2D游戏开发教程之游戏中精灵的跳跃状态

Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却无法从低的地面移动到高的地面,因为当前的游戏精灵只能左右移动,即left和right.为了解决这个问题,本节就来为精灵添加跳跃状态.   图2-14  精灵从一个地面移动到另一个地面 (1)如果要为精灵添加跳跃状态,即jump,就不得不再引入其它状态: q   landing:用于表示精灵接触到地面

Unity 2D游戏开发教程之游戏精灵的开火状态

Unity 2D游戏开发教程之游戏精灵的开火状态 精灵的开火状态 "开火"就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力.因为本游戏在后面会引入敌人,而精灵最好具备开火的能力,否则会被敌人轻易干掉!具体的实现方法是: (1)导入一个表示子弹的图片到Unity,本示例中选用的子弹图片,名为PlayerBullet,如图2-23所示. 图2-23  导入到游戏项目的表示子弹的图片 (2)拖动此图片到Scene视图,即可在当前的游戏场景中

【python游戏编程之旅】第八篇---pygame游戏开发常用数据结构

本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 上一个博客我们一起学习了pygame中冲突检测技术:http://www.cnblogs.com/msxh/p/5027688.html 这次我们来一起学习在pygame游戏里面常用的一些数据结构: 数据,列表,元组,队列,栈. 一.数组与列表 数组可以理解为简化的列表.像我们之前使用的pygame.sprite.Group这样的精灵组,也是一个列表.列表的元素是可变的,它具有添加.删除.搜索.排序等多种

cocos2d-x ios游戏开发初认识(七) 简单的动画

前面有一节说了帧动画,就是让精灵改变自己的位置.形状.大小来实现相应的动作,这讲主要是要通过一些方法来实现精灵的移动,产生各种炫丽的动画,也可能让你找到一点游戏场景. 下面具体根据代码分析: 为了清晰最好将前几节的代码注释掉. //根据前面的知识先创建一个菜单 CCMenuItemFont *item =CCMenuItemFont::create("开始游戏",this, menu_selector(MainScene::onMenuItem));//点击事件 //添加到菜单栏里面