具有相同SKPhysics主体对象的多个精灵

时间:2014-02-24 11:07:19

标签: sprite-kit skphysicsbody

我正在使用精灵套件制作机场模拟游戏。在添加SKPhysics主体之前,我的游戏布局完好无损,一旦为节点设置了SKPhysicsbody,我的精灵节点就会变得谨慎。

这是我在没有SKPhysicsBody的场景中添加的内容。想象一下机场有许多大门和飞机站在大门旁边。这就是我想用下面的代码实现的目标。

@implementation MyScene

-(id)initWithSize:(CGSize)size
{
    if (self = [super initWithSize:size])
    {
        allPlanes = [[NSMutableArray alloc]init];
        // setting gravity to 0 
        [[self physicsWorld] setGravity:CGVectorMake(0, 0)];
        [[self physicsWorld] setContactDelegate:self];

        [self setBackgroundColor:[UIColor whiteColor]];
       // Below method will provide runway and other static objects that can be seen in an airport
        [self setupAirport];

      /* This is where I am setting up by plane sprites.This method will provide a node which is added to the scene. As you can notice, the sprites are added at specific coordinates until they fill the screen. Imagine three or four gates with flights standing by those gates. That is what I am trying to achieve with below while loop */    

        int xval = 20;
        while (xval < kScreenWidth)
        {
            [self setupFlightAtPoint:xval];
            xval = xval + 60;
        }

    }

    return self;
}

现在编写方法代码[self setupFlightAtPoint:xPos]

-(void) setupFlightAtPoint:(CGFloat ) xPos
{
    // Below code will provide a static gate like object.gateNode is of type Gate class which is a subclass of SKNode
    gateNode = [[Gate node] newGate];
    [gateNode setPosition:CGPointMake(xPos, kScreenHeight * 0.37)];
    [self addChild:gateNode];

   // Below code provide plane node and positions it near the gate object.Plane is subclass of SKNode
    Plane *plane = [[Plane alloc]init];
    imageNode = [plane newPlane];
    imageNode.planeIdentifier = xPos;
    [imageNode setPosition:CGPointMake(gateNode.frame.origin.x + 12, gateNode.frame.origin.y+15)];
    [allPlanes addObject:imageNode];
    [self addChild:imageNode];

}

平面物体方法

-(instancetype) newPlane
{
    [self setScale:0.10];
    SKSpriteNode *spriteNode = [SKSpriteNode spriteNodeWithImageNamed:@"plane.png"];
    [self addChild:spriteNode];

    return self;
}

直到现在一切都很好。请查看名为scene1的附加图片,看看我在上面的代码中看到了什么。enter image description here

现在我的问题从这里开始,当我试图将物理体设置为我的飞机精灵。在我的“newPlane”方法中,我正在添加下面的代码

 -(instancetype) newPlane
 {
    [self setScale:0.10];
    SKSpriteNode *spriteNode = [SKSpriteNode spriteNodeWithImageNamed:@"plane.png"];
    [self addChild:spriteNode];

    SKPhysicsBody *planePhysics = [SKPhysicsBody bodyWithRectangleOfSize:spriteNode.frame.size];
    [spriteNode setPhysicsBody:planePhysics];
    [[spriteNode physicsBody] setAffectedByGravity:NO];

    return self;
}

设置Physicsbodies后,我的场景看起来像这样

enter image description here

现在我的场景中只能看到一个飞机精灵,我无法找出原因?

1 个答案:

答案 0 :(得分:1)

在将精灵添加为子项之前尝试初始化并指定物理主体:

-(instancetype) newPlane
{
    [self setScale:0.10];
    SKSpriteNode *spriteNode = [SKSpriteNode spriteNodeWithImageNamed:@"plane.png"];
    spriteNode.position = CGPointMake(100, 200);

    SKPhysicsBody *planePhysics = [SKPhysicsBody bodyWithRectangleOfSize:spriteNode.frame.size];
    spriteNode.physicsBody = planePhysics;
    spriteNode.physicsBody.affectedByGravity = NO;

    [self addChild:spriteNode];

    return self;
}

我还将代码转换为使用点符号,我发现这更容易键入和读取。