我如何使一个节点与移动场景的侧面碰撞



嗨,我想知道我的节点如何与移动场景碰撞。我有一个主节点,它可以沿着x轴移动并且可以与其他节点碰撞。我想让非主节点与移动场景的侧面碰撞。我怎么能做到呢?(摄像机只跟随主节点)。

我有一个障碍课。

in my MLObstacle.m

-(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;
}

所以我添加障碍物到我的WorldClass

In my world .m

-(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;
}
}

然后我将世界添加到我的场景

Scene.m

-(id)initWithSize:(CGSize)size
{
     if(self = [super initWithSize:size]
     {
        WorldGen * world = [[WorldGen alloc] init];
        self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
        self.physicsWorld.contactDelegate = self;
        self.physicsBody.categoryBitMask = VisibleSidesCategory
        self.physicsBody.collisionBitMask = ObstacleCategory;
        self.anchorPoint = CGPointMake(0.5,0.5);
        [self addChild:world];
        [world GenerateWorld];
     }
}

更新……

-(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_t ObstacleCategory = 0x1 <<1;)

首先通过定义collisionBitMask进行编辑

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

,然后导入物理。h 到你所有的类(你不需要分配或初始化物理。h,只使用ObstacleCategory和visblesidescategory)

从这个和另一个问题的问题,我终于确定有一个错误的API。具体来说,如果使用基于WithRect:FromRect:的初始化器(而不是基于RectOfSize:center:的初始化器),则在初始化期间将节点的anchorPoint视为(0,0),因此会得到意想不到的行为。

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

具体来说,这可以通过以下三种方式中的任何一种来解决:

  1. 使用(0,0)的锚点。
  2. 不使用基于Rect的初始化器创建节点。你可以用shapeNodeWithRectOfSize:代替shapeNodeWithRect:,用bodyWithEdgeLoopFromPath:代替bodyWithEdgeLoopFromRect:
  3. 将Rect的初始位置设置为较低且向左,如下所示:

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

最新更新