2015-09-14 2 views
0

Таким образом, мы имеем наше обнаружение здесьCGRectContainsPoint, используя форму в отличие от кадра

-(void)checkInFOVWithPlayer:(Player *)player andEnemy:(Player *)enemy { 
    SKNode *fovNode = [player childNodeWithName:player.playersFOVName]; 

    SKNode *node = [self childNodeWithName:@"enemy"]; 

    CGPoint newPosition = [self convertPoint:node.position toNode:fovNode.parent]; 

    if (CGRectContainsPoint(fovNode.frame, newPosition)) { 
     [self playerAimAtEnemy:enemy withPlayer:player]; 
    } 
} 

И наша реализация для поля зрения

SKShapeNode *fov = [SKShapeNode node]; 
UIBezierPath *fovPath = [[UIBezierPath alloc] init]; 
[fovPath moveToPoint:CGPointMake(0, 0)]; 
[fovPath addLineToPoint:CGPointMake(fovOpposite *-1, fovDistance)]; 
[fovPath addLineToPoint:CGPointMake(fovOpposite, fovDistance)]; 
[fovPath addLineToPoint:CGPointMake(0, 0)]; 
fov.path = fovPath.CGPath; 
fov.lineWidth = 1.0; 
fov.strokeColor = [UIColor clearColor]; 
fov.antialiased = NO; 
fov.fillColor = [UIColor greenColor]; 
fov.alpha = 0.2; 
fov.name = @"playerFOV"; 
[_playerImage addChild:fov]; 

Теперь, это работает. Однако диапазон обнаружения для «поля зрения» на самом деле не является границей BezierPath, на самом деле CGRect создает изображение.

Таким образом, обнаружение будет работать, даже если оно находится вне поля зрения.

Мне любопытно, есть ли для этого легкое решение, так как я действительно не хочу идти по физическим путям тела, если мне это не нужно.

ответ

0

Наконец-то я понял, что требуется.

Мне пришлось перерисовать путь и оптимизировать его для каждого кадра;

if (CGPathContainsPoint(fovPath.CGPath, nil, newPosition, NO)) {} 

Закончился.

Смежные вопросы