Обнаружение столкновений в игре Cocos2d?
Я пытаюсь обнаружить столкновение двух спрайтов следующим образом... но когда я пытаюсь запустить игру, никакого столкновения не происходит.... что я, возможно, делаю неправильно??
- (void)update:(ccTime)dt {
CGRect projectileRect = CGRectMake(projectile.position.x - (projectile.contentSize.width/2),
projectile.position.y - (projectile.contentSize.height/2),
projectile.contentSize.width,
projectile.contentSize.height);
//CGRectMake(0,220,320,50);
CGRect targetRects = CGRectMake(_monkey.position.x - (_monkey.contentSize.width/2),
_monkey.position.y - (_monkey.contentSize.height/2),
_monkey.contentSize.width,
_monkey.contentSize.height);
if (CGRectIntersectsRect(projectileRect, targetRects)) {
NSLog(@"ha ha Collision detected");
}
}
спрайтснаряда анимируется сверху вниз экрана, а спрайт обезьяны анимируется слева направо внизу снаряд проходит через обезьяну, но журнал не вызывается???
- (void)update:(ccTime)dt {
CGRect projectileRect = [projectile boundingBox];
CGRect targetRects = [_monkey boundingBox];
if (CGRectIntersectsRect(projectileRect, targetRects))
{
NSLog(@"ha ha Collision detected");
}
CGRect projectileRects = CGRectMake(projectile.position.x - (projectile.contentSize.width/2),
projectile.position.y - (projectile.contentSize.height/2),
projectile.contentSize.width,
projectile.contentSize.height);
CGRect targetRect = CGRectMake(_monkey.position.x - (_monkey.contentSize.width/2),
_monkey.position.y - (_monkey.contentSize.height/2),
_monkey.contentSize.width,
_monkey.contentSize.height);
if (CGRectIntersectsRect(projectileRects, targetRect)) {
NSLog(@"@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
}
}
- (void) spriteMoveFinished: (id) отправитель {
//NSLog(@"spriteMoveFinished");
CCSprite *sprite = (CCSprite *)sender;
[self removeChild:sprite cleanup:YES];
if (sprite.tag == 1) {
[_targets removeObject:sprite];
} else if (sprite.tag == 2) {
[_projectiles removeObject:sprite];
}
}
- (void) addTarget {
projectile = [CCSprite spriteWithFile:@"egg.png" rect:CGRectMake(0, 0, 10, 10)];
projectile.position = ccp(_bear.position.x,_bear.position.y-20);
projectile.tag=2;
[self addChild:projectile];
CGPoint realDest = ccp(_bear.position.x, _bear.position.y - 380);
int minDuration = 2.0;
int maxDuration = 4.0;
int rangeDuration = maxDuration - minDuration;
int actualDuration = (arc4random() % rangeDuration) + minDuration;
// Move projectile to actual endpoint
[projectile runAction:[CCSequence actions:
[CCMoveTo actionWithDuration:actualDuration position:realDest],
[CCCallFuncN actionWithTarget:self selector:@selector(spriteMoveFinished:)],
nil]];
// Add to projectiles array
projectile.tag = 2;
[_projectiles addObject:projectile];
}
-(void) registerWithTouchDispatcher
{
[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];
}
- (BOOL) ccTouchBegan: (UITouch *) коснуться события:(UIEvent *) {
CGPoint touchLocation = [self convertTouchToNodeSpace:touch];
if(CGRectContainsPoint(CGRectMake(0,0,320,50),touchLocation))
{
if (![_walkMonkey isDone]) {
[_monkey runAction:_walkMonkey];
}
}
else {
}
return YES;
}
- (void) ccTouchEnded: (UITouch *) коснуться withEvent:(UIEvent *) событие {
CGPoint touchLocation = [self convertTouchToNodeSpace:touch];
if(CGRectContainsPoint(CGRectMake(0,0,320,50),touchLocation))
{
[_monkey stopAction:_walkMonkey];
}
}
- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint touchLocation = [self convertTouchToNodeSpace:touch];
CGPoint oldTouchLocation = [touch previousLocationInView:touch.view];
oldTouchLocation = [[CCDirector sharedDirector] convertToGL:oldTouchLocation];
oldTouchLocation = [self convertToNodeSpace:oldTouchLocation];
CGPoint translation = ccpSub(touchLocation, oldTouchLocation);
if (translation.x > 3) {
_monkey.flipX=YES;
}
else if (translation.x < -3){
_monkey.flipX=NO;
}
if(CGRectContainsPoint(CGRectMake(40,0,240,50),touchLocation))
{
CGPoint newPos = ccpAdd(translation,_monkey.position);
if(newPos.x >= 320 || newPos.x <= 20)
{
NSLog(@"monkey not walking");
}
else {
newPos.y = 100;
_monkey.position = newPos;
}
}
}
1 ответ
Вы должны использовать встроенную функциональность:
CGRect projectileRect = [projectile boundingBox];
CGRect targetRects = [_monkey boundingBox];
if (CGRectIntersectsRect(projectileRect, targetRects))
{
NSLog(@"ha ha Collision detected");
}
Метод boundingBox учитывает еще несколько вещей, например, если узел расположен относительно своего родителя.
Также обратите внимание, что добавление префиксов к знакам подчеркивания считается плохой практикой в Objective-C. Apple резервирует имена переменных с ведущими символами подчеркивания для своих внутренних библиотек. Если вам действительно нужно классифицировать переменные экземпляра, один из распространенных способов - добавить их к подчеркиванию.