本人在使用精灵表单创建动画的过程中突然遇到了一些个问题,下面进行一下分析总结。

根据在Cocos2d-iphone中的经验,我写出了如下的代码:

CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("my.plist");
CCSpriteBatchNode *batchNode = CCSpriteBatchNode::create("my.png");
this->addChild(batchNode); CCArray *frameArray = CCArray::create(); for (int i=1; i<=4; i++) {
CCSpriteFrame *frame = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(CCString::createWithFormat("switch_off_1_%d.png",i)->getCString());
frameArray->addObject(frame);
} CCAnimation *animation = CCAnimation::create(frameArray, 0.4); CCAnimate *animate = CCAnimate::create(animation); CCSprite *iconSprite = CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("switch_off_1_4.png")); iconSprite->setPosition(ccp(100,100)); this->addChild(iconSprite); iconSprite->runAction(CCRepeatForever::create(animate));

但是程序出错:

Cocos2d: Assert failed: element type is wrong!
Assertion failed: (dynamic_cast<CCAnimationFrame*>(*__arr__)), function initWithAnimationFrames, file /Users/ios/Desktop/demo/demo/libs/cocos2dx/sprite_nodes/CCAnimation.cpp, line 144.

原来是

CCAnimation *animation = CCAnimation::create(frameArray, 0.4); 出了问题!

直接用create方法,会进入initWithAnimationFrames方法,里面会检查传入的CCArray是否是CCAnimationFrame*类型,而显然,我代码中CCArray中的元素是CCSpriteFrame*,所以出现了问题。

那么解决方法是:改用

CCAnimation *animation =CCAnimation::createWithSpriteFrames(frameArray,0.4); 这个方法就可以了。

注意:在xcode中代码提示 createWithSpriteFrames 这个方法只有一个参数,

但是,实际上进入这个函数就回发现,它是有两个参数的。

/* Creates an animation with an array of CCSpriteFrame and a delay between frames in seconds.
The frames will be added with one "delay unit".
@since v0.99.5
*/
static CCAnimation* createWithSpriteFrames(CCArray* arrayOfSpriteFrameNames, float delay = 0.0f);

注意其中的注释:
Creates an animation with an array of CCSpriteFrame and a delay between frames in seconds

对比create方法中的注释:

Creates an animation with an array of CCAnimationFrame, the delay per units in seconds and and how many times it should be executed.

 /* Creates an animation with an array of CCAnimationFrame, the delay per units in seconds and and how many times it should be executed.
@since v2.0
*/
static CCAnimation* create(CCArray *arrayOfAnimationFrameNames, float delayPerUnit, unsigned int loops);
static CCAnimation* create(CCArray *arrayOfAnimationFrameNames, float delayPerUnit) {
return CCAnimation::create(arrayOfAnimationFrameNames, delayPerUnit, 1);
}

这样就知道出错的原因了吧!

下面给出另一种方法创建动画的方式:

CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("my.plist");
CCSpriteBatchNode *batchNode = CCSpriteBatchNode::create("my.png");
this->addChild(batchNode); CCAnimation *animation = CCAnimation::create(); for (int i=1; i<=4; i++) {
CCSpriteFrame *frame = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(CCString::createWithFormat("switch_off_1_%d.png",i)->getCString());
animation->addSpriteFrame(frame);
} animation->setDelayPerUnit(0.4); CCAnimate *animate = CCAnimate::create(animation); CCSprite *iconSprite = CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("switch_off_1_4.png")); // CCSize size = CCDirector::sharedDirector()->getWinSize();
iconSprite->setPosition(ccp(100,100)); this->addChild(iconSprite); iconSprite->runAction(CCRepeatForever::create(animate));

参考文章:http://blog.csdn.net/rabbitlbj/article/details/8765575

Cocos2d-x 创建(create)动画对象CCAnimation报错分析的更多相关文章

  1. 【原创】MySQL Can't create a new thread报错分析

    今天有两台服务器都出现了Can't create a new thread报错. [故障处理过程] 故障发生后登录服务器,检查mysql进程正常,但登录mysql报下面错误 ERROR 1135 (H ...

  2. const变量赋值报错分析

    const变量赋值报错分析 const变量赋值报错 从变量到常量的赋值是合法C++的语法约定的, 如从char 到const char顺畅: 但从char **到 const char **编译器就会 ...

  3. std::unique_ptr使用incomplete type的报错分析和解决

    Pimpl(Pointer to implementation)很多同学都不陌生,但是从原始指针升级到C++11的独占指针std::unique_ptr时,会遇到一个incomplete type的报 ...

  4. mysql5.7密码修改与报错分析

    1.修改密码 修改密码: vim /etc/my.cnf 的mysqld字段加入skip-grant-tables 重启MySQL,service mysqld restart 终端输入 mysql ...

  5. MySQL创建外键约束的报错Error : Can't create table '#sql-534_185' (errno: 150)

    总得来说是因为两个表的字段类型不一致,例如: 两个字段的类型或大小不严格匹配,一个为tinyint,另一个为char:或一个为int(10)另一个为int(9)也是不行的,即使都为int(10),但一 ...

  6. PostgreSQL 大对象导出报错问题分析

    1.前言 在处理用户问题过程遇到一个问题.用户通过pg_dump导出 bytea 对象时,当行的大小超过 1G时,会报错: [v8r6c5b41@dbhost01 ~]$ sys_dump -t t1 ...

  7. 创建small表空间size32G报错ORA-01144

    #报错现象 #创建Oracle数据库11g默认标准块大小8K,直接分配32g报错 create tablespace ceshi datafile '+data' size 32g * ERROR a ...

  8. Anaconda Error opening file for writing , failed to create anacoda menu等报错问题解决方案

    安装anaconda的时候可能会遇到这个报错, 原因可能是:路径不允许有空格 此外发生报错failed to create anacoda menu, 解决方案 进入 cmd,找到你安装的位置(我的是 ...

  9. Eclipse/MyEclipse向HDFS中如创建文件夹等操作报错permission denied解决办法

    不多说,直接上干货! 问题现象 当执行创建文件的的时候, 即: String Path = "hdfs://host2:9000"; FileSystem fileSystem = ...

随机推荐

  1. java--从控制台读入一些数据

    学一些东西应该,学以致用: 现在我开始使用流的办法从控制台读取数据 import java.io.*; public class Demo2{ public static void main(Stri ...

  2. java--多线程之前台幕后

    前台程序是相对于后台程序来说的,那么什么是后台程序呢? [后台程序]就是在启动了start()之前,调用了setDaemon(true)方法,这个线程就变成了后台.如果一个进程中只用后台线程在运行,那 ...

  3. 摘抄python __init__

    注意1.__init__并不相当于C#中的构造函数,执行它的时候,实例已构造出来了. 1 2 3 4 5 class A(object):     def __init__(self,name):   ...

  4. 分享非常有用的Java程序 (关键代码) (三)---创建ZIP和JAR文件

    原文:分享非常有用的Java程序 (关键代码) (三)---创建ZIP和JAR文件 import java.util.zip.*; import java.io.*; public class Zip ...

  5. Oracle多实例的配置方法

    SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME /dbhome_2) (PROGRAM ...

  6. debian网易163更新服务器 源

    sudo vi /etc/apt/sources.list 加入如下内容即可: deb http://mirrors.163.com/debian/ jessie main non-free cont ...

  7. UIViewController加载过程

    UIViewController是视图和数据的桥梁,UIViewController是所有controller的基类,ios内置了很多试图控制器,如导航控制器,tableViewController等 ...

  8. Android网络:开发浏览器(二)——功能完善之长按网页图片菜单

    上述的历史和书签的功能已经实现.不过如果我们长时间按住图片,并不会出现如同UC中的一系列选项,我们可以来看看UC中的长按图片出现的菜单. 图10.2.9    UC中的长按图片菜单 我们可以看到UC中 ...

  9. SDL2源码分析6:拷贝到渲染器(SDL_RenderCopy())

    ===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源 ...

  10. android HorizontalListView

    最近搞android 用到一个HorizontalListView 网上搜了一把.有一些国人实现的.但也有一些基本上是cp人家的开源项目. 本人找了两个.记录一下. 其一:https://github ...