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]];