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

根据在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. dll文件32位64位检测工具以及Windows文件夹SysWow64的坑(很详细,还有自动动手编程探测dll)

    阅读目录 dll文件不匹配导致数据库无法启动 究竟是System32还是SysWow64 区分dll文件32位64位的程序让我倍感迷惑 再次判断究竟是System32还是SysWow64——意想不到的 ...

  2. Qt信号槽的一些事(第一次知道信号还有返回值,以及Qt::UniqueConnection)

    注:此文是站在Qt5的角度说的,对于Qt4部分是不适用的. 1.先说Qt信号槽的几种连接方式和执行方式. 1)Qt信号槽给出了五种连接方式: Qt::AutoConnection 0 自动连接:默认的 ...

  3. PHP脚本监控程序

    #!/bin/sh # Find ip IP=`/sbin/ifconfig eth1 | grep 'inet addr' | awk '{ print substr($2, index($2, & ...

  4. 搭建Windows SVN服务器及TortoiseSVN使用帮助和下载

    搭建Windows SVN服务器: 用的SVN服务器通常为外部,例如Google Code的服务器,不过,做为一个程序开发人员,就算自己一个人写程序,也应该有一个SVN版本控制系统,以便对开发代码进行 ...

  5. Ajax Post提交事例及SpringMVC注解@RequestMapping取不到参数值解决办法

    var xmlHttp; //定义变量,用来创建xmlHttp对象 function ajaxfunction(url,onreadystatechangMethod,param){ // 创建xml ...

  6. Square:从今天開始抛弃Fragment吧!

    原文链接 : Advocating Against Android Fragments 原文作者 : Pierre-Yves Ricau 译文出自 : 开发技术前线 www.devtf.cn 译者 : ...

  7. perl 匿名函数传参

    $subref=sub { my $a=shift; return $a; }; print $subref->("xxyyzz");

  8. [置顶] 64位Win2008_VS2012使用ODP.NET遭遇问题和解决办法

    最近为使用Oracle11G数据库做个快速开发的小程序,使用64位Win2008+Vs2012环境,结果碰壁连环,幸好不算太笨,终于解决了,特记录一下. 测试环境: Oracle11g (11.2.0 ...

  9. 开源解析器--ANTLR

      序言 有的时候,我还真是怀疑过上本科时候学的那些原理课究竟是不是在浪费时间.比方学完操作系统原理之后我们并不能自己动手实现一个操作系统:学完数据库原理我们也不能弄出个像样的DBMS出来:相同,学完 ...

  10. c#后台弹出提示

    Page.ClientScript.RegisterClientScriptBlock(typeof(string), "", @"<script>alert ...