所以我们在这里进行检测
-(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 :(得分:0)
最后我弄明白了需要什么。
在此之后,我不得不重新绘制路径并为每个帧进行优化;
if (CGPathContainsPoint(fovPath.CGPath, nil, newPosition, NO)) {}
结束了我的问题。