Cocos2d iphone Cocos2D一个精灵的简单碰撞检测,另一个精灵的孩子
我的碰撞检测有问题(我使用的是cocos2d,不是box2D或花栗鼠)。基本上,我有播放器,它是一个CCSprite,还有射弹,也是一个CCSprite。到目前为止,使用CGRECT一切正常,但在游戏中玩家可以激活一个超级末日激光,它总是在玩家面前。我包括它的方式是,我将它添加为播放器的子项,因此我没有更多的代码来处理旋转或移动之类的事情。但我的问题是,它不能正确地检测到与射弹的碰撞,因为激光的位置总是0,0,因为它被添加到播放器中,而不是场景中 这是我的密码: Player.mCocos2d iphone Cocos2D一个精灵的简单碰撞检测,另一个精灵的孩子,cocos2d-iphone,collision-detection,ccsprite,bounding-box,Cocos2d Iphone,Collision Detection,Ccsprite,Bounding Box,我的碰撞检测有问题(我使用的是cocos2d,不是box2D或花栗鼠)。基本上,我有播放器,它是一个CCSprite,还有射弹,也是一个CCSprite。到目前为止,使用CGRECT一切正常,但在游戏中玩家可以激活一个超级末日激光,它总是在玩家面前。我包括它的方式是,我将它添加为播放器的子项,因此我没有更多的代码来处理旋转或移动之类的事情。但我的问题是,它不能正确地检测到与射弹的碰撞,因为激光的位置总是0,0,因为它被添加到播放器中,而不是场景中 这是我的密码: Player.m - (bool
- (bool) activateSuper{
bool activated = NO;
if (powerReady) {
NSLog(@"Super Activated!!!!!");
activated = YES;
_state = pSuper;
//Super sprite which is supposed to collide with projectiles
_sprSuper = [CCSprite spriteWithSpriteFrameName:@"Laser.png"];
_sprSuper.anchorPoint = ccp(0.5, 0.0);
_sprSuper.position = ccp(self.contentSize.width/2, self.contentSize.height);
[self addChild:_sprSuper];
//Delete
int duration = 5;
[self runAction:[CCSequence actionOne:[CCDelayTime actionWithDuration:duration]
two:[CCCallBlock actionWithBlock:^{
[self removeChild:_sprSuper cleanup:YES];
powerReady = NO;
curSuper = 0;
_state = pOK;
}]]];
//Empty super bar
GameScene *g = (GameScene*)[self parent];
[g.gameHUD emptyBar:duration];
}
return activated;
}
在GameSecene.m中(用于碰撞检测):
你认为我应该关注什么?是否有一种简单的方法来检测碰撞,或者我应该在场景中添加激光并添加代码使其与播放器一起移动
非常感谢你的回答 使用CCNode方法
convertToWorldSpace:
将投射物的边界框位置(原点)转换为世界空间坐标。这将转换坐标,就像将投射物添加到场景中一样,即位置变为相对于屏幕坐标0,0。您可以尝试以下方法:
convertToWorldSpace
和convertToNodeSpace
- 您可以向播放机发送激光参考,并覆盖播放机中的方法
setPosition()
在这里,每次移动播放器(CCMoveTo、CCMoveBy等)时,激光也会移动。 - 另一个选项是当你移动玩家时,向激光发送相同的动作
不起作用:(我的激光看起来像这样:O O>-============其中:O是屏幕的中心,O>是播放器,-是激光的定位点,是激光。convertToWorldSpace是否考虑了精灵的旋转?@LearnCos2D如果父精灵旋转,但子精灵位置从未改变,该怎么办怎么办?我遵循了你的第二个选择,效果非常好,非常感谢
- (void) update:(ccTime)dt{
Projectile *pToRemove = nil;
for (Projectile *p in projectiles){
if (player.state == pSuper && CGRectIntersectsRect(p.boundingBox, player.sprSuper.boundingBox)) {
pToRemove = p;
break;
}
}
if (pToRemove != nil) [self destroyProjectile:pToRemove];
}
-(void) setPosition(CGPoint newPos){
[laser setPosition:newPos];
[super setPosition:newPos];
}