我的子弹类继承Sprite,重写了create函数
容器在子弹类中声明 Vector<BulletCreate*> BulletList
在函数在创建子弹,然后添加到容器
再用schedule1秒一次用这个函数
但是老是闪退,可能运行六七次能成功一次
显示的size=0,容器得初始化大小吗?
我的子弹类继承Sprite,重写了create函数
容器在子弹类中声明 Vector<BulletCreate*> BulletList
在函数在创建子弹,然后添加到容器
再用schedule1秒一次用这个函数
但是老是闪退,可能运行六七次能成功一次
显示的size=0,容器得初始化大小吗?
上部分代码吧。
应该是子弹对象被释放了掉了
Vector的大小是可以扩展的,这个问题不必担心,可能你在某个地方移除了,或者移除的不干净
void PlayerBullet::BulletShoot(float f)
{
Size visibleSize = Director::getInstance()->getVisibleSize();
auto bulletBody = PhysicsBody::createBox(Size(10, 60));
bulletBody->setCategoryBitmask(0x0001);
bulletBody->setCollisionBitmask(0x0001);
bulletBody->setContactTestBitmask(0x0001);
auto _plane = getChildByTag(1);
auto PlanePos = _plane->getPosition();
auto BulletPos = (Vec2(PlanePos.x, PlanePos.y + this->getContentSize().height+40));
auto bullet = PlayerBullet::create("bullet.png");
bullet->setTag(50);
bullet->setPhysicsBody(bulletBody);
bullet->setPosition(BulletPos);
auto bulletMove = MoveTo::create(1.0f,Vec2(bullet->getPositionX(),visibleSize.height+bullet->getContentSize().height*2));
bullet->runAction(bulletMove);
this->addChild(bullet);
BulletList.pushBack(bullet);
for (int i = 0; i < BulletList.size(); i++)
{
if (BulletList.at(i)->getPositionY() > visibleSize.height)
{
BulletList.at(i)->removeFromParent();
}
}
}
头文件中容器
cocos2d::Vector<PlayerBullet*> BulletList;
一发射子弹就闪退了,七八次能成功进入一次……
多谢指点…
— Begin quote from ____
引用第3楼张宇头破血流于2015-04-15 19:05发表的 回 1楼(xinchengquan) 的帖子 :
void PlayerBullet::BulletShoot(float f)
{
Size visibleSize = Director::getInstance()->getVisibleSize();
auto bulletBody = PhysicsBody::createBox(Size(10, 60));
… http://www.cocoachina.com/bbs/job.php?action=topost&tid=295966&pid=1284387
— End quote
我差不多知道原因了
你看看这段代码
for (int i = 0; i < BulletList.size(); i++)
{
if (BulletList.at(i)->getPositionY() > visibleSize.height)
{
BulletList.at(i)->removeFromParent();
}
}
红色的部分,,,你在List容器的循环中删除List中的元素会造成程序崩溃(运气好的时候,比如只有一个元素,那可能不会发生问题)
你要先把这些要删除的元素记录下来,然后退出循环的时候,一并删除。
你试试看,是不是问题解决了。
但是如果我把for循环注释掉,只添加元素进去,还是会闪退呢?
BulletShoot函数应该是定时调度的,不清楚你的这个多长时间调用一次,但是每次调用都会加进去一个PlayerBullet,而且这个tag都是50,所以this->addChild(bullet);这个语句就会崩溃(如果碰巧前一个节点被移出的话就没有问题,所以你的这个程序跑起来有时候可以跑成功就是这个原因),你试试将调用间隔放大看看。
你这个子弹类写得太乱了,估计整个程序框架也很乱,这样的框架会隐藏so多个bug。
我建议你重新搭建类框架。
谢谢!新手第一次做实战,确实够乱的,思路也不怎么清晰
— Begin quote from ____
引用第7楼张宇头破血流于2015-04-16 10:57发表的 回 6楼(xinchengquan) 的帖子 :
谢谢!新手第一次做实战,确实够乱的,思路也不怎么清晰 http://www.cocoachina.com/bbs/job.php?action=topost&tid=295966&pid=1284882
— End quote
给你一个建议,你可以这样将管理子弹的容器放在场景类里面,子弹类只做碰撞检测及伤害。
你首先把结构划分清楚,那些类负责那些功能,大家分工明确,这样出现问题也很容易解决。
空指针吧,可能是系统自动释放掉了,加上retain试试