cocos2d-x 疑难奇葩错误

1. Invalid Type for cocos2d::Vector<T>! 
cocos2d::Vector<XX*> 定义在头文件里XX不能用前向声明,即class XX; ,只能在头文件里包含 #include "XX.h",否则会出此错

2. CCRANDOM_0_1函数不随机,每次运行生成数据都一样! 

关于随机数 cocos2d-x 定义了一个宏 CCRANDOM_0_1() 生成的是 [0, 1] 之间的值

因此,要生成  [0-100] 之间的数    CCRANDOM_0_1() * 100

生成 [1,5]  之间的float 数,  就是 CCRANDOM_0_1() * 4 + 1

此函数调用了rand(),使用rand()要设定随机数种才能实现真正随机
//指定随机数种子,随机数依据这个种子产生 采用当前时间生成随机种子:
struct timeval now;
gettimeofday(&now, NULL); //计算时间种子
unsigned rand_seed = (unsigned)(now.tv_sec*1000 + now.tv_usec/1000);
srand(rand_seed);
接下来调用  CCRANDOM_0_1就OK了

3. schedule函数不起作用,定时函数不执行
我的代码:

void Wave::start()
{
	this->schedule(schedule_selector(Wave::startRunEnemy), _beginRate);
}
但进入游戏后startRunEnemy死活不执行,原因是schedule有个变量m_bRunning没有激活。这个变量必须在调用了Node::onEnter()才会置为true。所以出现这个问题原因是:1. Wave没有继承为Node类  2.Wave没有挂载到场景上  3. 没有调用Node::onEnter(),解决这个问题很简单,在schedule之前加上onEnter就是,目测也没什么副作用,如下:
void Wave::start()
{
	Node::onEnter();
	this->schedule(schedule_selector(Wave::startRunEnemy), _beginRate);
}

但是在unschedule函数之前,即取消定时器的时候还要加上Node::onExit(),否则也是不能取消定时器

4. 项不会计算为接受一个参数的函数

都说运行时错误难找,但编译时报错有时也很头疼,定位于错误居然是xrefwrap什么玩意的文件,我想妈呀,这回是内核级错识了,我哪有本事改,但没本事改也的改呀,只好看报错位置,是_VARIADIC_EXPAND_0X(_APPLYX_CALLOBJ, , , , )什么天书一样的东东,看样子好像是函数绑定之类,我想起了代码只有一个地方用到了函数指针绑定,有一个函数定义是这样的:

void addFixturesToBody(b2Body *body, std::string shapeName, std::function<void*(int)> userdataCallBack, float scale);

其中std::function<void*(int)>是重点怀疑对象,是不是std::function我用错了语法了呢,我只知道void*是返回值,(int)表示函数只有一个int型指针,但其他的我就不知道了,对这个新东西我确实不熟,再加上返回值还是void*,就更复杂了,与是我把它改了又改,还是错误依旧。

我想要是运行时报错就好了,起码我还能下个断点知道哪里错,这编译时出错我哪知道哪一句出错了呢,我不死心看vs的输出窗口,果然在最下面被我发现了,

d:\cocos2dpro\spacegame\classes\shapecache.cpp(111): 参见对正在编译的函数 模板 实例化“std::function<_Fty>::function<int>(_Fx &&)”的引用

好,我定位到shapecache.cpp第111行,果然被我找到了罪魁祸首,函数调用这儿:

this->addFixturesToBody(body, shapeName, NULL, scale);  我用那个NULL代替了函数指针,原来找不到这个函数指针,所以不能转化,奇怪的是我把NULL改成nullptr就好了,不知道原因

看来出错了多看看输出还是有好处的。

5. Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call..

这是最奇葩的错误了,有的时候不怎么出现,但一旦报这个错保准能让你求生不得求死不能。为什么?太高深了太低层了呀。查网上有关这错误的,有的说是函数调用时有内存溢出把栈给冲毁了。你说这怎么改?还有的说是调用错误,应该声明_stdcall。可是我又没用到那玩艺,难道要改低层cocos2d-x引擎呀?终于,找到一篇有用的文章说是还是函数指针错误 ,函数指针调用时与规定的格式参数不匹配会报这个错。我这个错是在update函数里出现的,调用如下:在某层init方法中:

//设置定时回调方法
auto sched = Director::getInstance()->getScheduler();
sched->schedule(//设置定时回调方法
auto sched = Director::getInstance()->getScheduler();
sched->schedule(SEL_SCHEDULE(&MenuLayer::update), this, 0.1f, false);  //每0.1秒回调一下

问题就是这个update方法声明,这位大牛是在android环境下写的,在类声明中写成void update();

但我们知道update是声明标准是void update(float dt);而且SEL_SCHEDULE也声明了update是带参数float型,所以这里函数指针与规定的不匹配,就会报这个难解的错误,我搜索工程中所有的update,都加上参数float dt,问题解决!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天马流星2719

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值