从孩子到自我的CGRect交集
Posted
技术标签:
【中文标题】从孩子到自我的CGRect交集【英文标题】:CGRect intersection from child to self 【发布时间】:2015-09-12 19:02:29 【问题描述】:问题
如何实现两个精灵的交集,一个是self
的孩子,另一个是sprite
的孩子?
由于他们的立场完全不同,所以相互比较?
示例;这是在每一帧之前运行以确定它们是否相交
-(void)checkInFOVWithPlayer:(Player *)player andEnemy:(Player *)enemy
SKNode *node = [player childNodeWithName:player.playersFOVName];
if (CGRectIntersectsRect(node.frame, enemy.frame))
// [self playerAimAtEnemy:enemy withPlayer:player];
NSLog(@"inframe");
else
NSLog(@" ");
但是,node
是 player
的子代,enemy
是 self
的子代。那么如何检查它们是否相交呢?
这里是它们被初始化的地方
float radianAngle = ((fovAngle) / 180.0 * M_PI);
float fovOpposite = atanf(radianAngle) * fovDistance;
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];
and enemy
NSString *bundle = [[NSBundle mainBundle] pathForResource:@"enemyImage" ofType:@"png"];
UIImage *image = [[UIImage alloc] initWithContentsOfFile:bundle];
SKTexture *texture = [SKTexture textureWithImage:image];
_enemy = [Player spriteNodeWithTexture:texture];
_enemy.position = CGPointMake(100, 100);
_enemy.size = CGSizeMake(20, 20);
_enemy.playerAimAngle = [self returnRandomNumberBetween:0 to:360];
_enemy.anchorPoint = CGPointMake(0.5, 0.5);
_enemy.playerHealth = 100;
_enemy.playerIsDead = false;
[self addChild:_enemy];
【问题讨论】:
将两个框架都转换成一个共同的坐标系,比如屏幕。 @rmaddy 我该如何处理? @rmaddyCGPoint positionInScene = [node.scene convertPoint:enemy.position toNode:node.parent];
尝试玩这个,仍然无法获得任何结果。
您必须将两个帧都转换为同一个节点。
@rmaddy 我实际上不可能将它们放在同一个节点中,因为敌人的寻路依赖于不同的节点,而 FOV 是玩家的子节点,所以这不太可能.没有解决办法吗?
【参考方案1】:
-(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];
这最终是我解决问题的方法,但是现在,我必须找到一种方法来更改节点的框架,使其不是矩形。
【讨论】:
以上是关于从孩子到自我的CGRect交集的主要内容,如果未能解决你的问题,请参考以下文章