Flappy bird管道碰撞问题

在一个场景中我添加两根管子,再添加了一只鸟,然后遍历这两个碰撞,为什么小鸟不与上面管子碰撞,反而与两根管子的空隙相撞,并且小鸟可以实现下面的管子碰撞,我找不到原因啊,添加小鸟的代码:
//小鸟的飞行动画
m_bird = Cbird::create();
CC_BREAK_IF(! m_bird);
birdie->addObject(m_bird);
m_gameBatchNode->addChild(m_bird,3);

设置上下管道
//设置上水管
m_upipe = CCSprite::createWithSpriteFrameName(“obstacle_up.png”);
m_upipe->setAnchorPoint(ccp(0,0));
m_upipe->retain();

//设置下水管
m_dpipe = CCSprite::createWithSpriteFrameName(“obstacle_down.png”);
m_dpipe->setAnchorPoint(ccp(0,1));
m_dpipe->retain();
addChild(m_upipe,2);
addChild(m_dpipe,2);

设置者两个管道的位置:

//生成随机数0~1
float rheight = CCRANDOM_MINUS1_1();
float minx = 100;
float qheight = 150;
float qwidth = 100;

float pp = (600 - 2*minx - qheight)/2;

dpipePos = ccp( ((float)rand()/RAND_MAX)(qwidth - m_dpipe->getContentSize().width),40+minx+pp+pprheight+100);
upipePos = ccp( ((float)rand()/RAND_MAX)(qwidth - m_upipe->getContentSize().width),40+qheight+minx+pp+pprheight);

m_dpipe->setPosition(ccp(bufStartPos + dpipePos.x,dpipePos.y));
m_upipe->setPosition(ccp(bufStartPos + upipePos.x,upipePos.y));
fraise->addObject(m_dpipe);
//fraise->addObject(m_upipe);

碰撞:

 CCObject* units;   //管道

CCObject* bullets; // 小鸟

//判断管道和主角碰撞
CCARRAY_FOREACH(fraise,units)//遍历管道
{
CPipe* enemy = (CPipe*)units;// 管道
CCARRAY_FOREACH(birdie,bullets)//遍历小鸟
{
Cbird* bullet = (Cbird*)bullets;
if (collid(bullet,enemy))//
{
endGame();
return;
}
}
}

求大神指点,感激不尽!

collid 也拿出来看看

bool CGameScene::collid( Cbird * a, CPipe * b )
{
if(!a || !b)
{
return false;
}
CCRect aRect = a->collideRect();
CCRect bRect = b->collideRect();
if (aRect.intersectsRect(bRect)) //判断碰撞矩形
{
return true;
}
return false;
}
小鸟
cocos2d::CCRect Cbird::collideRect()
{
CCPoint POS = this->getPosition();
return CCRectMake(POS.x-3,POS.y-3,6,6);
}

管道

cocos2d::CCRect CPipe::collideRect()
{
CCPoint POS = this->getPosition();
CCSize size = getContentSize();
return CCRectMake(POS.x - size.width/2,POS.y-size.height/2,size.width,size.height/2);
}

小鸟和管道是否不是add在同一个层上?如果不在同一个层上,需要借用convertToWorldSpace(const cocos2d::CCPoint &nodePoint)方法将位置进行转换

不,小鸟和管道实在同一个层上的,并且诺不是在同一个层上的话,那么小鸟为什么它会与下面的那个班管道发生碰撞呢,我觉得是相对位置问题,可是我找不到在哪里,有可能不是,纠结啊

你没有考虑你的位置锚点

m_upipe,m_dpipe类型是CCSprite, cocos2d::CCRect CPipe::collideRect()这边类型是CPipe。。。。。so奇怪

大哥,你打印一下CCRect数据不就行了,调试才是王道

为何不上物理引擎检测呢?

感觉是锚点的问题
你把上管道的锚点设在左下,下管道的锚点设在左上
但是CPipe::collideRect()确是把中心点当锚点在返回

管道的rect计算有问题啊,position是根据锚点来的,所以你计算rect的时候不仅要考虑position,还要考虑锚点的。

锚点?那要怎么设置哈,那玩意我不太会用

管道的RECT那里怎么考虑描点啊

LZ 建议你直接在游戏里面显示各个管道以及小鸟的矩形判定点,这样子更方便判断问题

管道

cocos2d::CCRect CPipe::collideRect()
{
CCPoint POS = this->getPosition();
CCSize size = getContentSize();
return CCRectMake(POS.x - (0.0-getanchorpoint().x)*size.width,POS.y-(0.0-getanchorpoint().y)*size.height,size.width,size.height);
}

理论上是这样的,,,其实我建议你转化为世界坐标比较

CCRectMake里怎么还要0减去获取瞄带你的坐标?