Help us understand the problem. What is going on with this article?

SpriteKitでiOS7/8で動作が異なっていたところ

More than 5 years have passed since last update.

SpriteKitでゲームを作っていてiOS7と8で異なっていたところがあったので、書こうと思います。
そんなにSpriteKit使い倒してるわけでもないので、認識違ってるところだったり、もっとよい方法などぜひアドバイス頂きたいです!m(_ _)m

アプリをバックグラウンド/フォアグラウンド遷移時の挙動

iOS8

・バックグラウンド遷移時、画面が一時停止する(SKNode.paused = YESしたときのような挙動)。
・フォアグラウンド遷移時、画面が一時停止が解除される(SKNode.paused = NOしたときのような挙動)。
 →コードで明示的にSKNode.paused = YESで一時停止ていても、フォアグラウンド遷移時に一時停止が解除される。

iOS7

・バックグラウンド/フォアグラウンド遷移時に勝手に画面が一時停止/一時停止の解除がされない。

バイクのタイヤの作成処理

バイクを走らせるゲームを作っているため、バイクの加速に合わせてタイヤを回転させる必要があり、そのときにタイヤの中心点を車体に固定するコードを書く必要がありました。
その処理を行うためのコードがiOS8,7で異なっていました。

iOS8

・SKPhysicsBody.pinnedプロパティ(iOS8SDKで追加)にYESをセット。

iOS7

・SKPhysicsJointPinクラスを使って、self.physicsWorldにaddJoint。

//selfのクラスは、SKSceneのサブクラスを想定。

@property(nonatomic,strong) SKSpriteNode *myWorld;//親ノード
@property(nonatomic,strong) SKSpriteNode *bikeFrame;//車体
@property(nonatomic,strong) NSMutableArray *tires;//タイヤ(後輪、前輪)

static const uint32_t Collision_bitmask_tire = 0x1 << 0;


/**
 * バイクノード作成
 * かなり汚いコードで恐縮ですが、★付きのところがタイヤの中心点を車体に固定するコードです。。
 */
- (void)createBikeNode
{
    self.bikeFrame = [SKSpriteNode spriteNodeWithColor:[UIColor clearColor] size:CGSizeMake(40.f, 38.f)];
    self.bikeFrame.position = CGPointMake(50, Y_GROUND_START + (self.bikeFrame.size.height/2));
    self.bikeFrame.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.bikeFrame.size];
    self.bikeFrame.physicsBody.dynamic = YES;//重力影響(default:YES)
    self.bikeFrame.physicsBody.collisionBitMask = Collision_bitmask_bikeframe;//衝突bitMask。ぶつかったときに物理的に影響受けるか。はねかえったりするか。
    self.bikeFrame.physicsBody.contactTestBitMask = 0;//接触bitMask。ぶつかったときにdelegate実行されるか。
    self.bikeFrame.physicsBody.restitution = 0;//できるだけ弾まないようにする
    self.bikeFrame.name = NAME_BIKE;

    self.tires = [NSMutableArray new];
    CGFloat tireRadius = 7.;
    CGFloat tireMargin = 5.5;
    //タイヤ
    CGPoint center[] = {
        //後輪
        CGPointMake(0 - tireRadius - tireMargin + 2.0,
                    0 - tireRadius - 3),
        //前輪
        CGPointMake(0 + tireRadius + tireMargin + 0.5,
                    0 - tireRadius - 3)
    };

    for (int i=0; i<2; i++) {
        SKSpriteNode* tire;
        tire = [SKSpriteNode spriteNodeWithImageNamed:@"tire"];
        tire.position = CGPointMake(center[i].x, center[i].y);
        tire.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:tire.size.width/2.];
        tire.physicsBody.collisionBitMask = Collision_bitmask_tire;//地面と接触可能にする
        tire.physicsBody.usesPreciseCollisionDetection = YES;
        if(i == 0) {
            tire.physicsBody.categoryBitMask = Category_bike_back_wheel;
        } else {
            tire.physicsBody.categoryBitMask = Category_bike_front_wheel;
        }

        tire.physicsBody.contactTestBitMask = Category_ground;//コンタクト対象
        tire.physicsBody.restitution = 0;//できるだけ弾まないようにする
        tire.physicsBody.dynamic = NO;

        if([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
            tire.position = CGPointMake(center[i].x, center[i].y);
            [self.bikeFrame addChild:tire];
            //★★★★★★★★★★★★★★★
            tire.physicsBody.pinned = YES;//iOS8のときはここで親ノードにpin止め
            //★★★★★★★★★★★★★★★
        } else {
            tire.position = CGPointMake(self.bikeFrame.position.x + center[i].x,
                                        self.bikeFrame.position.y + center[i].y);
            [self.myWorld addChild:tire];
        }

        [self.tires addObject:tire];
    }

    //ここで車体をmyWorldに追加して、タイヤよりも前面表示にする。
    [self.myWorld addChild:self.bikeFrame];

    //★★★★★★★★★★★★★★★
    //iOS7の場合はここでタイヤをpin止め
    if([[UIDevice currentDevice].systemVersion floatValue] < 8.0) {
        for (SKSpriteNode* tire in self.tires) {
            SKPhysicsJointPin *pin = [SKPhysicsJointPin jointWithBodyA:self.bikeFrame.physicsBody bodyB:tire.physicsBody anchor:tire.position ];
            [self.physicsWorld addJoint:pin];
        }
    }
    //★★★★★★★★★★★★★★★


    //車体画像を追加。
    //iOS8ではここでやることにより、車体画像をタイヤよりも前面にしている
    SKSpriteNode* frame = [SKSpriteNode spriteNodeWithImageNamed:@"bikeFrame"];
    frame.position = CGPointMake(0.f, 0.f);//中央
    [self.bikeFrame addChild:frame];
}

HIkaruSato
ガンダムの芸術家、アプリエンジニア
https://itunes.apple.com/jp/developer/hikaru-sato/id733555195
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした