cocos2d-x 血泪史(-4) cocos2d-x 中最近遇到的那些坑

本文详细介绍了在使用Cocos2d-x游戏开发框架时,遇到的两个常见问题:如何正确管理连续的移动动作,避免精灵移动位置超出预期;以及在使用CCDictionary时,如何避免因添加NULL值而引发的错误。文章提供了实际的代码示例和解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好吧,首先第一个坑:

[坑一]

CCMoveTo 这个action,看名字就是在指定时间内移动到某个点,用起来当然是像这样:

auto moveAction = CCMoveTo::create(1.f, ccp(200, 300));
sprite->runAction(moveAction);

看起来没什么问题,运行的时候那个sprite 确实也在1 秒内移动到200,300 了。那么这样呢:

for(int i = 0; i < 2; i++)
{
    auto moveAction = CCMoveTo::create(1.f, ccp(200, 300));
    sprite->runAction(moveAction);
}

猜猜看sprite 这东西在被连续要求执行两次move action 会怎样。

没错!!!它没有移动到200,300 !!! 而是飘到更远的地方了!!!(估计是400,600),这不科学啊,按理说action 指定的参数是一个固定点,又没有在第二次指定到其他点。懒得看内部怎么实现的了,估计是按步长移动的,最后也没确认是不是移动到指定点了。

那么,如果我们遇到这种情况,上一个移动的动作没有执行完的时候又有新的移动目标出现,这样不就gg 了,所以解决方法是:

给需要当前只能执行一种的action 一个固定的tag,比如moveaction 指定tag 为100,然后像这样:

#define TAG_ACTION_MOVE 100
#define TAG_ACTION_ROTATE 101
//...

//...
auto moveAction = CCMoveTo::create(1.f, ccp(200, 300));
moveAction->setTag(TAG_ACTION_MOVE);
sprite->stopActionByTag(TAG_ACTION_MOVE);
sprite->runAction(moveAction);

ok, 这样就没问题了。

[坑二]

CCDictionary 在添加元素的时候setObject(CCObject* obj, const string& key) 不允许添加NULL 值的元素。。。

我当时有点纳闷为啥不允许我dict["shit"] = NULL; 这种东西的存在,后来发现在setObject 的时候对传入的obj 会做retain 的调用,就像CCArray 里对加入的元素做retain 一样,也就是说CCArray 里也是不允许加入NULL 的元素的。。。。

好吧你赢了。。。 于是我的代码变成了这样:

// set, there's an obj that we don't know if it's NULL. let's say the 
// obj's type is a CCLayer pointer obj ? dict->setObject(obj, "shit") : 0; // get auto obj = dynamic_cast<CCLayer*>(dict->objectForKey("shit"));

Problem solved! NEXT!

转载于:https://www.cnblogs.com/strawhatboy/p/3639101.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值