简单的碰撞检测在cocos2d box2d..nothing发生在碰撞
问题描述:
我想弄清楚如何做到这一点,我有一个精灵称为'球员'和精灵'岩' 我试图检测之间的冲突两个精灵.....但没有发生碰撞!简单的碰撞检测在cocos2d box2d..nothing发生在碰撞
继承人我做了什么:下面
-(void)addRock {
rock = [CCSprite spriteWithFile:@"rock.png"
rect:CGRectMake(0, 0, 27, 40)];
// Determine where to spawn the target along the X axis
CGSize winSize = [[CCDirector sharedDirector] winSize];
int minX = rock.contentSize.width/2;
int maxX = winSize.width - rock.contentSize.width/2;
int rangeX = maxX - minX;
int actualX = (arc4random() % rangeX) + minX;
// Create the target slightly off-screen along the right edge,
// and along a random position along the X axis as calculated above
rock.position = ccp(actualX, 500);
rock.tag = 1;
[rockArray addObject:rock];
[self addChild:rock];
播放器代码:
-(id) init{
if((self=[super initWithColor:ccc4(255, 255, 255, 255)])) {
CGSize winSize = [[CCDirector sharedDirector] winSize];
player = [CCSprite spriteWithFile:@"Player.png"
rect:CGRectMake(0, 0, 27, 40)];
player.position = ccp(winSize.width/2, winSize.height/4+15); //position of where the player is placed
player.tag = 2;
[playerArray addObject:player];
[self addChild:player];
精灵移动完成:
-(void)spriteMoveFinished:(id)sender {
CCSprite *sprite = (CCSprite *)sender;
[self removeChild:sprite cleanup:YES];
if (sprite.tag == 1) { // rock
[rockArray removeObject:sprite];
} else if (sprite.tag == 2) { // players
[playerArray removeObject:sprite];
的init(数组初始化):
rockArray = [[NSMutableArray alloc]init];
playerArray = [[NSMutableArray alloc]init];
[self schedule:@selector(update:)];
更新方法
- (void)update:(ccTime)dt {
NSMutableArray *rocksToDelete = [[NSMutableArray alloc] init];
for (rock in rockArray) {
CGRect rockRect = CGRectMake(
rock.position.x - (rock.contentSize.width/2),
rock.position.y - (rock.contentSize.height/2),
rock.contentSize.width,
rock.contentSize.height);
NSMutableArray *playersToDelete = [[NSMutableArray alloc] init];
for (player in playerArray) {
CGRect pRect = CGRectMake(
player.position.x - (player.contentSize.width/2),
player.position.y -(player.contentSize.height/2),
player.contentSize.width,
player.contentSize.height);
if (CGRectIntersectsRect(rockRect, pRect)) {
[rocksToDelete addObject:rock];
}
for (rock in rocksToDelete) {
[rockArray removeObject:rock];
[self removeChild:rock cleanup:YES];
}
if (rocksToDelete.count > 0) {
[playersToDelete addObject:player];
}
[rocksToDelete release];
for (player in playersToDelete) {
[playerArray removeObject:player];
[self removeChild:player cleanup:YES];
}
[playersToDelete release];
我一直在努力整夜排序我的问题。我似乎可以使碰撞检测工作。如果是这样,有人可以给我看一个简短的代码吗?
答
很好,检查两个精灵之间的碰撞,你必须每帧调用一个方法(或者你经常选择)来检查是否发生了碰撞。 添加以下代码init方法:
[self scheduleUpdate];
...这将调用下面的方法(你必须添加到您的类的实现),每帧:
-(void)update:(ccTime)delta {
if (CGRectIntersectsRect(player.boundingBox, rock.boundingBox)) {
//Do Stuff
}
}
对于以前的代码您必须将Player和Rock sprite声明为成员变量,以便在整个课程中使用它们。
如果你在场景中有多个岩石精灵你想检查碰撞,你将不得不使用一个数组。简单的例子:
1声明在你类接口的数组:
NSMutableArray *rockArray;
2 init方法
rockArray = [NSMutableArray array];
3分配内存为它在 “addRock” 方法中添加创建的岩石精灵到阵列,然后作为一个孩子到现场
-(void) addRock {
CCSprite *rock = [CCSprite spriteWithFile:@"rock.png"
rect:CGRectMake(0, 0, 27, 40)];
//...
[rockArray addObject:rock];
[self addChild:[rockArray lastObject]];
}
4在“更新”方法你现在lo OP通过数组和检查&玩家
for (CCSprite *_rock in rockArray) {
if (CGRectIntersectsRect(player.boundingBox, rock.boundingBox)) {
//Do Stuff e.g remove that rock from the scene
[self removeChild:_rock cleanup:YES];
}
}
希望这有助于;-)随意问任何问题,岩石之间的碰撞
当我宣布CCSprite *播放器和CCSprite *岩石,我得到一个警告.m文件说'本地声明的'播放器'隐藏实例变量'和岩石相同 – sahil 2012-02-11 18:32:56
我声明CCSprite *播放器和CCSprite *岩石在.h文件中 – sahil 2012-02-11 18:37:52
如果在.h文件(接口)中声明变量可以通过实现(.m文件)中的名称来访问这些var,例如player = [CCSprite spriteWith ...]。 – 2012-02-11 18:46:53