从孩子到自我的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(@" ");
    

但是,nodeplayer 的子代,enemyself 的子代。那么如何检查它们是否相交呢?

这里是它们被初始化的地方

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 我该如何处理? @rmaddy CGPoint 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交集的主要内容,如果未能解决你的问题,请参考以下文章

既然做不了“别人家的孩子”那就自己努力拿高薪自我成就!

选择IT行业的自我心得,希望能帮助到各位!

用Lean Canvas 自我剖析

树--2.堆

如何计算 CGPath 和 CGRect 的交集? [复制]

5年GTD自我管理经验,一块听听