0

Sprite Kit で動かない固定の床・壁が手に入らないようです。

「床」として SKNode を持つシーンがあり、ユーザーが画面を押すと、ブロックがタッチ位置から「床」に落ちます。それはうまくいきますが、ユーザーが別のブロックを 20 個ほど追加すると、突然床が回転します。これは私のフロアのコードです:

SKSpriteNode *floorNode = [[SKSpriteNode alloc] initWithColor:[SKColor clearColor] size:CGSizeMake(self.size.width*2, 10)];
floorNode.position = CGPointMake(CGRectGetMidX(self.frame), -5);
floorNode.name = @"floor";
floorNode.zPosition = 1;

floorNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:floorNode.size];
floorNode.physicsBody.affectedByGravity = NO;
floorNode.physicsBody.dynamic = NO;
floorNode.physicsBody.usesPreciseCollisionDetection = YES;

return floorNode;

申し訳ありませんが、Sprite Kit は初めてです。私のコードの何が問題なのか誰か知っていますか?

編集:問題をもう少し明確にするために、いくつかの画像を追加しました。この画面でも起こるので。あなたが見るそれらの黒い球はキャノンボールのように左から右に飛んでいます. 問題が発生していることを示すために、球の数を増やしました。これはコードです:

- (SKNode *)newEditButton {
    SKLabelNode *editButtonNode = [SKLabelNode labelNodeWithFontNamed:@"chalkduster"];
    editButtonNode.text = @"EDIT CASTLE";
    editButtonNode.fontSize = 19;
    editButtonNode.fontColor = [SKColor darkGrayColor];
    editButtonNode.position = CGPointMake(CGRectGetMidX(self.frame) + 110, CGRectGetMidY(self.frame) + 30);
    editButtonNode.name = @"edit_button";
    editButtonNode.zPosition = 2;

    editButtonNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(140, 40)];
    editButtonNode.physicsBody.usesPreciseCollisionDetection = YES;
    editButtonNode.physicsBody.dynamic = NO;
    editButtonNode.physicsBody.affectedByGravity = NO;

    SKAction *hover = [SKAction sequence:@[[SKAction moveByX:0 y:6.0 duration:0.9],
                                           [SKAction moveByX:0 y:-6.0 duration:0.9]]];
    SKAction *hoverForever = [SKAction repeatActionForever:hover];
    [editButtonNode runAction:hoverForever];

    return editButtonNode;
}

- (SKNode *)newPlayButton {
    SKLabelNode *playButtonNode = [SKLabelNode labelNodeWithFontNamed:@"chalkduster"];
    playButtonNode.text = @"SLAUGHTER";
    playButtonNode.fontSize = 19;
    playButtonNode.fontColor = [SKColor darkGrayColor];
    playButtonNode.position = CGPointMake(CGRectGetMidX(self.frame) - 110, CGRectGetMidY(self.frame) + 30);
    playButtonNode.name = @"play_button";
    playButtonNode.zPosition = 2;

    playButtonNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(140, 40)];
    playButtonNode.physicsBody.usesPreciseCollisionDetection = YES;
    playButtonNode.physicsBody.dynamic = NO;
    playButtonNode.physicsBody.affectedByGravity = NO;

    SKAction *hover = [SKAction sequence:@[[SKAction moveByX:0 y:6.0 duration:0.9],
                                           [SKAction moveByX:0 y:-6.0 duration:0.9]]];
    SKAction *hoverForever = [SKAction repeatActionForever:hover];
    [playButtonNode runAction:hoverForever];

    return playButtonNode;
}

5~10秒経過すると、球体がぶつかるたびに「殺戮」と「城編集」という「ボタン」が回転し始めます。しかし、左に回転する場合、回転方向は常に左になるため、物理学で何かをする必要があるようには見えません。そして、右に回転し始めると、その回転方向は常に右になります回転前回転開始後

おもしろそうだけど!しかし、私が望むものではありません;-)

4

1 に答える 1

0

あなたはそれを知りませんが、SpriteKit に、砲弾からラベルへの衝突、およびブロックから床への衝突を適用するように指示しています!

これは、SKPhysicsBody.collisionBitMask をデフォルト値のままにして、すべての衝突を観察するためです。

ドキュメントから

Discussion
When two physics bodies contact each other, a collision may occur. This body’s collision mask is compared to the other body’s category mask by performing a logical AND operation. If the result is a nonzero value, this body is affected by the collision. Each body independently chooses whether it wants to be affected by the other body. For example, you might use this to avoid collision calculations that would make negligible changes to a body’s velocity.

The default value is 0xFFFFFFFF (all bits set).

したがって、次のようにします。

floorNode.physicsBody.collisionBitMask = 0
于 2015-06-05T18:02:32.690 に答える