cocos2dx 复制精灵不同精灵的动作能不能集中到一个动作序列 小小知识站

Cocos2dx 3.2 之实现精灵图片放大功能 - 推酷
Cocos2dx 3.2 之实现精灵图片放大功能
& & & &原文地址 http://blog.csdn.net/jhonlight/article/details/&
& & & & & &
& & & 今天一个群友问我:
& & & &我Scene里放置一个Layer,Layer盛放一张图片,即背景图片,我想更换这张图片,而且要求带有系统提供的切换Scene 淡入淡出的效果,于是我用Director类的切换用系统提供的切换动画包装的scene,但是效果是整个scene都被切换了,而我想要的是只有背景变化,其余的不变。
& & & &大家都知道,这样做当然不可以,Director(导演)的切换会把制定的scene切换掉,随即而来的scene的会取代之前的scene容器,那面对这个需求,我们该怎么办呢?这时候我想到了网格效果,既然你想要淡入淡出的效果,网格效果中正好也有啊。于是他按照我说的去做了,后来发现网格效果种只有淡出FadeOutBLTiles,这可怎么办?可别忘了cocos2dx 有这样一个动作, reverse();即反转,淡出反转之后,我们可不可理解为淡出呢?是吧 没错,基本符合需求。
& & & 以上只是一个小插曲,下面通过一个小小的例子,来简要说明网格特效的使用。
& & & 首先来一段官网的介绍吧。
& &网格动作类似于特效,可以实现翻转、抖动、震荡、水波纹等效果。Cocos2D-x中,网格类的基类CCGridBase有两个子类,即CCGrid
和CCTiledGrid3D。这两个类的共同点是,网格的每个子块都可以分离出来,CCGridBase的继承关系如下:
CCGrid3D、CCTiledGrid3D--&CCGridBase--&CCObject。
网格没有什么直接应用的场合,只要明白CCGrid3D和CCTiledGrid3D,并且网格动作是基于网格的即可。运行网格动作的节点好像被分成了大小相同的很多矩形,通过这些矩形的动作形成整体动作,这些矩形就好像形成了一个矩阵。16x12的网格将会运行的非常快,但是效果并不是非常好。32x24的网格看起来非常棒,但是在有些时候运行起来不会太快。
& & 注:使用网格特效之前需要关闭OPenGL种的深度测试
& & 至于为什么要关闭深度测试,个人觉得网格特效是把节点以及节点的子类所在的平面拆分成各个网格,进而来进行特定的特效,既然是平面的,就没有不需要有深度的检测了,1是会影响效果,2开启深度测试会额外消耗性能。 此是个人的理解,如有错误望大神更正。
& & ok,来上代码。上代码之前先看下效果。
& & 通过做一个放大触摸点位置的图片局部来展示特效的使用。
1 首先再头文件种,定义触摸开始,触摸移动,触摸结束三个方法和一个网格实例的私有变量。
初始化网格特效实例,并添加到当前层中,接下来放置一个精灵到网格实例中,我们可以把网格特效实例看作是一个容器,它会让缩成装的对象都产生制定的特效效果。
2 初始化触摸监听以及回调方法,我使用的是cocos2dx3.2,与3.0之前的触摸有所变化,有不了解的同学可以去查阅官方文档。
3 首先通过pEvent获取触摸的目标,以此目标定义一个矩形区域,接下来判断当前的点是否在此矩形区域中,返回false代表触摸了是精灵,反之则触摸点在精灵之外。
4 定义一个方法的效果,让之前初始化的网格实例来运行此特效动作。
5 触摸移动和触摸结束方法差不多,就不做解释。
6 运行ok 就是开头的效果。
7 如果对别的特效有兴趣可以一一试之。效果蛮不错的。
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
没有分页内容
图片无法显示
视频无法显示
与原文不一致cocos2dx精灵动作设计
[问题点数:40分,结帖人BadClass]
cocos2dx精灵动作设计
[问题点数:40分,结帖人BadClass]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。2125人阅读
cocos2dx3.0游戏编程(5)
上一节我们做了点准备工作,&本节我们将定义自己的sprite类,以便于后续的开发。Coco2dx提供的默认sprite类只提供了最基础的功能,我们要做动作游戏,仅仅只用cocos2dx的sprite类的功能是不够的,所以我们要继承sprite类,来实现自己的精灵类。
1.实现思路
动作游戏角色就是各种各样的动作,所以我们自定义的类会围绕这个功能来写,落羽这里只实现有代表性的几个动作,主要就是待机,走,攻击,受伤,死亡。动作游戏还要有数据,但是本节落羽不讲数据,只讲动画,数据以后再讲。效果如下
enum class SpriteType //精灵类型
PLAYER = 1,
enum class SpriteState //精灵状态
ATTACK = 3,
KNOCKEDOUT = 5
#ifndef GAME_SPRITE_H
#define GAME_SPRITE_H
#include &cocos2d.h&
#include &Define.h&
USING_NS_CC;
class GameSprite : public Sprite
~GameSprite();
void init(Point point, SpriteType type, float walkSpeed);//位置,精灵类型,移动速度
void update(float dt);
virtual void idle();
virtual void walkWithDirection(Point direction);//移动
virtual void attack(); //攻击
virtual void hurtWithDamage(int damage); //受伤
virtual void knockedout(); //死亡
void loadAnimation(SpriteType type);
protected:
Action *idleA
Action *walkA
Animate *attackA
Animate *hurtA
Animate *knockedoutA
Point moveD //移动方向
float walkS //移动速度
//移动向量
SpriteT //精灵类型
SpriteS //精灵状态
GameSprite::~GameSprite() //释放动画
if(idleAction != NULL)
idleAction-&release();
idleAction = NULL;
if(walkAction != NULL)
walkAction-&release();
walkAction = NULL;
if(attackAction != NULL)
attackAction-&release();
attackAction = NULL;
if(hurtAction != NULL)
hurtAction-&release();
hurtAction = NULL;
if(knockedoutAction != NULL)
knockedoutAction-&release();
knockedoutAction = NULL;
void GameSprite::init(Point point, SpriteType type, float walkSpeed)
Sprite::init();
this-&setPosition(point);
this-&type =
this-&walkSpeed = walkS
moveDirection = Point::ZERO;
velocity = Point::ZERO;
state = SpriteState::NONE;
loadAnimation(type);
this-&scheduleUpdate();
void GameSprite::update(float dt)
Point distance = velocity *
//根据向量移动
setPosition(getPosition() + distance);
void GameSprite::idle()
if(state != SpriteState::IDLE)
state = SpriteState::IDLE;
this-&stopAllActions();
this-&runAction(idleAction);
void GameSprite::walkWithDirection(Point direction)
if(state != SpriteState::WALK)
state = SpriteState::WALK;
this-&stopAllActions();
this-&runAction(walkAction);
void GameSprite::attack()
if(state != SpriteState::ATTACK)
state = SpriteState::ATTACK;
this-&stopAllActions();
auto *atta = Sequence::create(attackAction,
CallFunc::create(CC_CALLBACK_0(GameSprite::idle, this)), NULL);
this-&runAction(atta);
void GameSprite::hurtWithDamage(int damage)
if(state != SpriteState::HURT)
state = SpriteState::HURT;
this-&stopAllActions();
auto *hurt = Sequence::create(hurtAction,
CallFunc::create(CC_CALLBACK_0(GameSprite::idle, this)), NULL);
this-&runAction(hurt);
void GameSprite::knockedout()
if(state != SpriteState::KNOCKEDOUT)
state = SpriteState::KNOCKEDOUT;
this-&stopAllActions();
this-&runAction(knockedoutAction);
Animation* findAnimation(const char* animName, const char* fileName, int fileStartNum, int fileEndNum, float dur, Rect rect)
Animation *
animation = AnimationCache::getInstance()-&getAnimation(animName);
if(animation != NULL)
Vector&SpriteFrame*&
char str[50];
for(int i = fileStartN i &= fileEndN ++i)
sprintf(str, &%s_%02d.png&, fileName, i);
arr.pushBack(SpriteFrame::create(str, rect));
animation = Animation::createWithSpriteFrames(arr, dur);
animation-&setRestoreOriginalFrame(false);
AnimationCache::getInstance()-&addAnimation(animation, animName);
void GameSprite::loadAnimation(SpriteType type)
if(type == SpriteType::PLAYER || type == SpriteType::ENEMY)
Animation *
animation = findAnimation(&playerNormalIdle&, &player_brother_idle&, 1, 1, 0.2, Rect(0, 0, 200, 300));
animate = Animate::create(animation);
idleAction = RepeatForever::create(animate);
idleAction-&retain();
animation = findAnimation(&playerNormalWalk&, &player_brother_move&, 1, 4, 0.2, Rect(0, 0, 200, 300));
animate = Animate::create(animation);
walkAction = RepeatForever::create(animate);
walkAction-&retain();
animation = findAnimation(&playerNormalAttack&, &player_brother_attack&, 1, 2, 0.4, Rect(0, 0, 200, 300));
animate = Animate::create(animation);
attackAction =
attackAction-&retain();
animation = findAnimation(&playerNormalHurt&, &player_brother_hurt&, 1, 2, 0.2, Rect(0, 0, 200, 300));
animate = Animate::create(animation);
hurtAction =
hurtAction-&retain();
//knockedout
animation = findAnimation(&playerNormalKnockedout&, &player_brother_die&, 1, 2, 0.2, Rect(0, 0, 200, 300));
animate = Animate::create(animation);
knockedoutAction =
knockedoutAction-&retain();
使用精灵类
auto *sprite = new GameSprite();
sprite-&init(Point(400, 400), SpriteType::PLAYER, 100);
sprite-&walkWithDirection(Point::ZERO);
this-&addChild(sprite);
sprite-&release();
sprite = new GameSprite();
sprite-&init(Point(600, 400), SpriteType::ENEMY, 100);
sprite-&attack();
this-&addChild(sprite);
sprite-&release();
sprite = new GameSprite();
sprite-&init(Point(800, 400), SpriteType::PLAYER, 100);
sprite-&hurtWithDamage(0);
this-&addChild(sprite);
sprite-&release();
sprite = new GameSprite();
sprite-&init(Point(), SpriteType::PLAYER, 100);
sprite-&knockedout();
this-&addChild(sprite);
sprite-&release();
本节落羽一步步实现了一个自定义精灵类,实现了各种动作,下一节我们讲类之间的交互。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:21384次
排名:千里之外
原创:19篇
(1)(5)(2)(1)(9)(6)4684人阅读
Cocos2D-X(38)
命名空间宏:
USING_NS_CC; 感觉其实挺鸡肋的。
NS_CC_BEGIN; == using namespace cocos2d{
NS_CC_END ; }
判断一个精灵被点击:
1、层要接收点击消息。2、回调函数中取得点击坐标。3、取得精灵用boudingBox().containsPoint函数判断。(或使用 convertTouchToNodeSpaceAR 方法)
多Layer点击处理:
1、使用ccTouchesBegan()。此函数返回true,表示中断消息链,本层接收消息;返回false则本层不接收消息。
2、重写个Layer。大体思路是只有最底层的Layer接收消息,然后根据某种方式转发给各层。
具体可参考文章: cocos2d-x 建立自己的层级窗口消息机制
精灵拉长:
setScale() 尽量不用这样的变换,因为会虚。
精灵半透明:
setOpacity() 设置半透明0~255 。
精灵旋转:
setRotation() 默认是Z轴旋转。
setRotationX() X轴为对称轴旋转。
setRotationY() Y轴为对称中心。
精灵设定颜色:
setColor() 真没感觉有啥用。有ccBLUE之类的宏。
相反的动作:
reverse() 创建一个相反的动作,之前动作必须是By类型的。与坐标无关,只与动作相关。
相反一系列动作:
将CCSquence创建好的一系列动作赋值给一个CCFiniteTimeAction 指针,然后再调用这个指针的reverse。
动作类型:
CCActionInterval:
斜交(距离无穷的旋转)
CCRotateTo
CCBezierTo
贝塞尔曲线移动
CCFadeIn\Out
CCToggleVisibility
CCOrbitCamera
轨道相机?能实现落叶翻转的效果
CCCardinalSplineBy
CCCatmullRomTo
也是路径移动,不知道有什么区别
一直重复动作:
CCRepeatForever::create() 在runaAtion中把相应的动作套上这个类型即可。
重复一次动作:
CCRepeat::create() 在runaAtion中把相应的动作套上这个类型即可。
CCSpawn 与CCSquence用法一样只不过是同时执行。
跟随精灵移动:
CCFollow 运行Layer中的runAction。第二个参数为Layer的大小。
多个精灵的动作序列:
CCTargetedAction 与精灵相关的动作,创建好之后,可直接放到CCSqence中。
动作叠加:
精灵调用多次runAction可以使不同的动作叠加起来。
动作的暂停与恢复:
动作暂停:
sharedDirector-&getActionManager()-&pauseAllRunningActions() 即可暂停所有动作,返回值为一个CCSet* 要将其存入m_pPausedTargets中。使用时可参照:
CC_SAFE_RELEASE(m_pPausedTargets);
m_pPausedTargets = director-&getActionManager()-&pauseAllRunningActions();
CC_SAFE_RETAIN(m_pPausedTargets);
动作的恢复为:
sharedDirector-&getActionManager()-&resumeTargets(m_pPausedTargets)
本篇博客出自,转载请注明出处:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1280327次
积分:12768
积分:12768
排名:第604名
原创:191篇
转载:19篇
评论:539条
左手代码右手艺术 追求新浪潮。
个人网站:
: Unity3D内购插件
: Unity3D常用功能合集
微信公众号:松阳论道
疾风酒馆@North Blue:
我写的书:
文章:11篇
阅读:12682
阅读:64148
文章:18篇
阅读:504700
文章:15篇
阅读:105033
(1)(3)(1)(3)(1)(4)(1)(5)(5)(6)(4)(1)(1)(3)(1)(1)(1)(2)(6)(8)(1)(4)(2)(7)(10)(7)(3)(3)(1)(3)(1)(4)(11)(15)(21)(27)(29)(1)(3)

我要回帖

更多关于 cocos2dx 移除精灵 的文章

 

随机推荐