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

Posted

技术标签:

【中文标题】具有相同 SKPhysics 身体对象的多个精灵【英文标题】:Multiple sprites with same SKPhysics body object 【发布时间】:2014-02-24 11:07:19 【问题描述】:

我正在使用 sprite kit 构建一个机场模拟游戏。在添加 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 的附件图片,看看我在上面的代码中看到了什么。

现在,当我尝试将物理实体设置为我的平面精灵时,我的问题就从这里开始了。在我的“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;

设置Physicsbody后,我的场景是这样的

现在我的场景中只看到一个平面精灵,我不知道为什么?

【问题讨论】:

【参考方案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;

我还将代码转换为使用点表示法,我发现这更容易输入和阅读。

【讨论】:

感谢您的回复。我尝试了该选项,但仍然是同样的问题。 编辑了我的答案,您可能需要在添加或创建物理实体之前设置平面的位置。 解决了这个问题。添加 [planePhysics setDynamic:NO];解决了我的问题。

以上是关于具有相同 SKPhysics 身体对象的多个精灵的主要内容,如果未能解决你的问题,请参考以下文章

在精灵套件中发生碰撞时停止对象

SKPhysics体路径生成器

SKPhysics 到达某个位置后关闭 isDynamic

iOS7 SpriteKit 如何对两个或多个精灵节点子节点的动画进行分组?

为什么我的联系人识别器不起作用

Sprite Kit,使多个精灵遵循相同的方法