Ios 如何使节点与移动场景的侧面碰撞?

Ios 如何使节点与移动场景的侧面碰撞?,ios,objective-c,sprite-kit,game-physics,skphysicsbody,Ios,Objective C,Sprite Kit,Game Physics,Skphysicsbody,嗨,我想知道我的节点如何与移动的场景发生碰撞。我有一个主节点,它可以沿x轴移动,并且可以与其他节点碰撞。我希望使非主节点与移动场景的侧面碰撞。我怎样才能做到?(摄影机仅跟随主节点) 我有一门障碍课 在我的传销中 -(id)init { if(self = [super init]) { int aux = arc4random()%3; switch (aux) { case 0: self = [MLObstaculo spriteNodeWithColor:[UICo

嗨,我想知道我的节点如何与移动的场景发生碰撞。我有一个主节点,它可以沿x轴移动,并且可以与其他节点碰撞。我希望使非主节点与移动场景的侧面碰撞。我怎样才能做到?(摄影机仅跟随主节点)

我有一门障碍课

在我的传销中

-(id)init
{
if(self = [super init])
{
int aux = arc4random()%3;
switch (aux) {
    case 0:
        self = [MLObstaculo spriteNodeWithColor:[UIColor greenColor] size:CGSizeMake((aux+1)*10,(aux+1)*13 )];
        break;
    case 1:
        self = [MLObstaculo spriteNodeWithColor:[UIColor blueColor] size:CGSizeMake((aux+1)*10,(aux+1)*15 )];
        break;
    case 2:
        self = [MLObstaculo spriteNodeWithColor:[UIColor redColor] size:CGSizeMake((aux+1)*10,(aux+1)*14 )];
        break;
}
self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.size];
self.physicsBody.affectedByGravity = NO;

self.physicsBody.categoryBitMask = obstacleCategory;
self.physicsBody.contactTestBitMask = visibleSidesCategory;
self.physicsBody.collisionBitMask = visibleSidesCategory;   
[self setDx:0.0];
[self setDy:2.4];
}
return self;
}
所以我给我的世界级增加了障碍

在我的世界里

-(void)GenerateWorld
{
SKSpriteNode *Ground = [SKSpriteNode spriteNodeWithColor:[UIColor greenColor] size:CGSizeMake(self.scene.frame.size.width,100)];
Ground.position = CGPointMake(0, -self.scene.frame.size.height/2 + Ground.size.height/2);
Ground.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:Ground.size];
Ground.physicsBody.dynamic = NO;


[self addChild:Ground];
for(int i = 0; i < 3; i++)
{

    MLObstaculo * auxobs= [[MLObstaculo alloc]initObstaculo];
    auxobs.position = CGPointMake((i+1)*50, Ground.position.y + Ground.size.height/2 +auxobs.size.height/2 );
    [self.Obstaculos addObject:auxobs];
    [self addChild:auxobs];
    auxobs = NULL;

}
}
更新

-(void)didSimulatePhysics
{
    [self centerOnNode:hero];
}

-(void)centerOnNode:(SKNode *)node
{
    CGPoint pointinScene = [self convertPoint:node.position fromNode:node.parent];
    world.position = CGPointMake(world.position.x -pointinScene.x , world.position.y);

}

我使用此格式初始化了所有类别变量(
static const uint32\u t ObstacleCategory=0x1通过定义冲突位掩码首次编辑

-(id)init
{
    self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.size];
    self.physicsBody.categoryBitMask = ObstacleCategory;
    self.physicsBody.contactTestBitMask = VisibleSidesCategory;
    self.physicsBods.collisionBitMask = VisibleSidesCategory;
}
其次,在Xcode->文件中执行此步骤新建->文件->C和C++->头文件

给出Physics.h的名称,并在其中添加以下行:

typedef enum : uint8_t {
    ObstacleCategory            = 1,
    VisibleSidesCategory        = 2,

} ColliderType;

然后将Physics.h导入到所有类中(物理不需要alloc或init.h,只需使用ObstacleCategory和VisibleSidesCategory)

从这个问题和另一个问题的问题中,我最终确定API中存在错误。具体地说,考虑节点的锚点(0,0)在初始化过程中,如果使用基于
的带rect:
FromRect:
的初始值设定项(但不是基于
RectOfSize:
center:
的初始值设定项),则会出现意外行为

因此,即使场景和其他对象的锚点设置为(0.5,0.5),节点也会相对于父节点的中点放置其左下角,而不是相对于父节点的中点放置子节点的中点

具体而言,这可以通过以下三种方式之一解决:

  • 使用(0,0)的锚点
  • 在不使用基于Rect的初始值设定项的情况下创建节点。您可以使用
    shapeNodeWithRectOfSize:
    而不是
    shapeNodeWithRect:
    BodyWithEdgeLopFromPath:
    而不是
    BodyWithEdgeLopFromRect:
  • 将矩形的初始位置设置为左下方,如下所示:

  • node.physicsBody=[SKPhysicsBody bodyWithEdgeLoopFromRect:CGRectMake(-node.size.width/2,-node.size.height/2,node.size.width,node.size.height)]

    您是否也向非主节点添加了物理?我尝试了您的代码。我知道应该可以,因为它也在Ios开发人员文档中,但不起作用。我已经用didBeginContact方法编写了代码。但仍然没有。您是否在内部将此代码编写为-(id)initWithSize:(CGSize)size{if(self=[超级初始化大小:大小]){你的所有节点都有物理特性吗?是的,这段代码应该可以用,我在我的应用程序中使用。是的,我的所有节点都有物理特性。我的节点实际上可以与任何东西碰撞,但不能与移动场景的侧面碰撞。你的所有节点都有唯一的categoryBitMasks吗?你也可以检查你所有节点的碰撞位Masks吗?这可能是p的来源问题OK我将障碍设置为处理碰撞。但问题仍然存在。到底发生了什么?从您的代码和您描述的所有内容来看,如果位掩码设置和应用正确,那么障碍不应该忽略边缘,因此,当您运行代码时,这将有助于准确了解您看到了什么。此外,您遇到障碍的原因是什么's unit不称其super's init?@XtDiego我编辑了我的答案,以便用您所说的内容提供问题的解决方案。我相信第二点,缺少主播点,可能是您遇到的问题。我的主播点设置在我的项目代码以及我的类的super init调用中。问题仍然存在。到底发生了什么当我的障碍物与我的主节点碰撞并飞走时,当它们与我的场景边缘接触时,它们应该碰撞,但节点只是通过。
    typedef enum : uint8_t {
        ObstacleCategory            = 1,
        VisibleSidesCategory        = 2,
    
    } ColliderType;