Swift SKshapenode对Physicsbody没有响应

Swift SKshapenode对Physicsbody没有响应,swift,sprite-kit,skphysicsbody,skshapenode,Swift,Sprite Kit,Skphysicsbody,Skshapenode,我创建了一个SKShapeNode,并为其分配了一个physicsBody。但是,当有接触时,它不会被触发 创建SKShapeNode代码: -(SKShapeNode*)gravityline{ //SKSpriteNode *lolo=[[SKSpriteNode alloc]init]; SKShapeNode *lolo = [[SKShapeNode alloc] init]; CGPoint fff=CGPointMake(ray1.position.x, r

我创建了一个
SKShapeNode
,并为其分配了一个
physicsBody
。但是,当有接触时,它不会被触发

创建
SKShapeNode
代码:

-(SKShapeNode*)gravityline{
    //SKSpriteNode *lolo=[[SKSpriteNode alloc]init];
    SKShapeNode *lolo = [[SKShapeNode alloc] init];
    CGPoint fff=CGPointMake(ray1.position.x, ray1.position.y);
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, fff.x, fff.y);
    CGPathAddLineToPoint(path, 0,rayoriginpoint.x,rayoriginpoint.y );
    CGPathCloseSubpath(path);
    lolo.path = path;
    lolo.name=@"gravityline";
    lolo.strokeColor=[SKColor greenColor];
    lolo.glowWidth=.1;
    CGPathRelease(path);
    lolo.physicsBody=[SKPhysicsBody bodyWithEdgeFromPoint:fff toPoint:rayoriginpoint];
    //lolo.physicsBody=[SKPhysicsBody bodyWithEdgeLoopFromPath:path];
    //lolo.physicsBody=[SKPhysicsBody bodyWithPolygonFromPath:path];
    lolo.physicsBody.categoryBitMask=raylightCategory;
    lolo.physicsBody.collisionBitMask=batCategory;
    lolo.physicsBody.contactTestBitMask=batCategory;
    lolo.physicsBody.usesPreciseCollisionDetection=YES;
    lolo.physicsBody.linearDamping=0;
    lolo.physicsBody.restitution=1.0;
    lolo.physicsBody.dynamic=NO;

    return lolo;
}
以下是触发代码:

- (void)didBeginContact:(SKPhysicsContact *)contact
{
    SKPhysicsBody *firstBody, *secondBody;
    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
    {
        firstBody = contact.bodyA;
        secondBody = contact.bodyB;
    }
    else
    {
        firstBody = contact.bodyB;
        secondBody = contact.bodyA;
    }
    if (firstBody.categoryBitMask == raylightCategory && secondBody.categoryBitMask==batCategory)
    {
        NSLog(@"Contact with bat have been made");
        [secondBody.node removeFromParent];
    }
}
-(void)didBeginContact:(skphysiccontact*)联系人
{
SKPhysicsBody*第一个Body,*第二个Body;
if(contact.bodyA.categoryBitMask

如果有人知道我做错了什么,为什么
SKShapeNode
没有激活physicsBody,请告诉我。

这肯定行不通:

lolo.physicsBody=[SKPhysicsBody bodyWithEdgeFromPoint:fff toPoint:rayoriginpoint];
如果有任何问题,这将返回已分配给其他节点的实体。但我猜它只是返回零

此注释行也不起作用:

//lolo.physicsBody=[SKPhysicsBody bodyWithEdgeLoopFromPath:path];
边缘形状将创建静态(如:不可移动)实体。因此,这个节点不会在物理过程中移动,如果我没有弄错的话,你也不会从与静态物体的接触中得到接触响应,只有动态物体

这一条应该有效:

//lolo.physicsBody=[SKPhysicsBody bodyWithPolygonFromPath:path];
但是你在这里把物体设置为静态物体:

lolo.physicsBody.dynamic=NO;

因此,同样的规则适用于创建具有边循环的实体。

您的代码没有完全显示“重力线”与什么发生碰撞。我只能从它的描述推测,它没有检测到与圆形物体(球和球棒)的碰撞

“重力线”方法似乎返回一个由基于边的形状定义的SKShapeNode:

lolo.physicsBody=[SKPhysicsBody-withedgecompoint:fff-toPoint:rayoriginpoint];

当谈到碰撞时,阅读苹果的Sprite工具包编程指南非常重要,特别是它对三种形状的解释

1) 动态体积模拟具有体积和质量的物理对象,这些体积和质量可能会受到系统中的力和碰撞的影响。使用动态体积表示场景中需要四处移动和相互碰撞的项目

2) 静态体积类似于动态体积,但其速度被忽略,且不受力或碰撞的影响。但是,因为它仍然有体积,其他对象可以从它反弹或与它交互。使用静态体积表示场景中占用空间但不应被模拟移动的项目。例如,可以使用静态体积表示迷宫的墙。 虽然将静态体积和动态体积视为不同的实体很有用,但实际上,这是两种不同的模式,可以应用于任何基于体积的物理体。这可能很有用,因为您可以有选择地启用或禁用实体的效果

3) 边是无体积的静态实体。边永远不会被模拟移动,它们的质量也无关紧要。边用于表示场景中的负空间(例如另一个实体中的空心点)或不可交叉、不可见的薄边界。例如,边经常用于表示场景的边界。 边和体积之间的主要区别在于,边允许在其自身边界内移动,而体积被视为实体对象如果边缘通过其他方式移动,则它们仅与卷交互,而不与其他边缘交互。

基于上述信息,如果您阅读了BodyWithEdgeComposite:toPoint:使用的方法的文档,您将看到您正在创建一个“基于边的”物理实体

返回值

一种新的基于边缘的物理体

讨论

边没有体积或质量,并且始终将其视为“动力学”属性等于“否”。边只能与基于体积的物理体碰撞

要使碰撞生效,必须确保边与基于体积的物理体碰撞。每个物理体形状创建方法都记录了它创建的形状的类型

如果使用的是与边缘碰撞的基于体积的物理体,则另一种可能性可能是由于所涉及对象的大小或速度。同样,阅读苹果的文档可以清楚地说明这一点

为小型或快速移动的对象指定高精度碰撞: 当Sprite Kit执行碰撞检测时,它首先确定场景中所有物理实体的位置。然后确定是否发生碰撞或接触。这种计算方法很快,但有时会导致错过碰撞。一个小物体可能移动得如此之快,以至于它完全穿过另一个物理物体,而没有两个物体相互接触的动画帧

若你们有必须碰撞的物理实体,你们可以提示精灵工具包使用更精确的碰撞模型来检查相互作用。这种型号比较贵,所以应该节约使用。当任何一个物体使用精确碰撞时,会接触并测试多个运动位置,以确保检测到所有接触

其他可能性也可能会导致碰撞混乱,例如指定给物理实体的路径的错误位置信息。重要的是要理解,当设置节点的路径时,形状是使用节点的局部坐标系设置的。请务必记住,Sprite Kit中的原点位于左下角(而不是UIKit的左上角),并且在将路径指定给节点的物理体时,该路径是相对于节点的定位点放置的

ship.physicsBody.usesPreciseCollisionDetection = YES;

SKShapeNode *ball = [[SKShapeNode alloc] init];
CGRect ballFrame = CGRectMake(-25.0, -25.0, 50.0, 50.0);
[ball setPath:[UIBezierPath bezierPathWithOvalInRect:ballFrame].CGPath];
[ball setPosition:CGPointMake(100.0, 450.0)];
[ball setFillColor:[UIColor redColor]];
[ball setPhysicsBody:[SKPhysicsBody bodyWithCircleOfRadius:25.0]];