5

iPad の画面内でボールが跳ねるゲームを作成しています。ポンゲームに似ています。SKScene の SKPhysicsWorld には重力プロパティがあり、オブジェクト同士の衝突方法も制御していることがわかりました。

スプライトの端が画面の端に衝突したかどうかを自動的に検出できる方法はありますか? または、独自の衝突コードを作成する必要がありますか?

4

4 に答える 4

10

ボールが画面の端で跳ね返るようにするために多くのコードを記述する必要はありません。物理環境は上記のすべてを処理できます。必要なのは、スプライトを正しい方法でインスタンス化することだけです。

まず、シーンのphysicsBodyを次のように設定する必要があります:

self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];

シーンの .h ファイルで、2 つのビットマスク カテゴリを作成します。

static const uint8_t ballCategory = 1;
static const uint8_t wallCategory = 2;

そして、シーンの物理体にカテゴリを与えます:

self.physicsBody.categoryBitMask = wallCategory;

次に、スプ​​ライトを作成します。

SKSpriteNode *spriteNode = [SKSpriteNode spriteNodeWithImageNamed:@"ball.png"]; 

spriteNode.name = @"ball";

spriteNode.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:25];
spriteNode.position = CGPointMake(10.0,10.0); //or anything you want
spriteNode.physicsBody.dynamic = YES;
spriteNode.physicsBody.affectedByGravity = NO;

spriteNode.physicsBody.categoryBitMask = ballCategory;
spriteNode.physicsBody.collisionBitMask = wallCategory;

spriteNode.physicsBody.restitution = 1.0;
spriteNode.physicsBody.friction = 0.0;
spriteNode.physicsBody.linearDamping = 0.0;
spriteNode.physicsBody.angularDamping = 0.0;

[self addChild:spriteNode];

spriteNode に を与える代わりに、その[SKAction moveTo: duration:]物理ボディにインパルスを適用します。

CGVector impulse = CGVectorMake(1.0,1.0);
[spriteNode.physicsBody applyImpulse:impulse];

そして出来上がり!ボールは壁に跳ね返り、止めるものは何もありません。

.h ファイルは次のようになります。

#import <SpriteKit/SpriteKit.h>

static const uint8_t ballCategory = 1;
static const uint8_t wallCategory = 2;

@interface BallBounce : SKScene

@end

.m ファイルは次のようになります。

#import "BallBounce.h"

@implementation BallBounce

-(instancetype)initWithSize:(CGSize)size
{
    if (self = [super initWithSize:size])
    {
        self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
        self.physicsBody.categoryBitMask = wallCategory;

        SKSpriteNode *spriteNode = [SKSpriteNode spriteNodeWithColor:[UIColor greenColor] size:CGSizeMake(50, 50)];

        spriteNode.name = @"ball";

        spriteNode.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:25];
        spriteNode.position = CGPointMake(10.0,10.0); //or anything you want
        spriteNode.physicsBody.dynamic = YES;
        spriteNode.physicsBody.affectedByGravity = NO;

        spriteNode.physicsBody.categoryBitMask = ballCategory;
        spriteNode.physicsBody.collisionBitMask = wallCategory;

        spriteNode.physicsBody.restitution = 1.0;
        spriteNode.physicsBody.friction = 0.0;
        spriteNode.physicsBody.linearDamping = 0.0;
        spriteNode.physicsBody.angularDamping = 0.0;

        [self addChild:spriteNode];

        CGVector impulse = CGVectorMake(100.0,100.0);
        [spriteNode.physicsBody applyImpulse:impulse];

    }

    return self;
}

@end
于 2013-12-05T10:57:05.693 に答える
2

これはhttp://www.raywenderlich.com/49721/how-to-create-a-breakout-game-using-spritekitからのものです

    SKPhysicsBody* borderBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
    // 2 Set physicsBody of scene to borderBody
    self.physicsBody = borderBody;
    // 3 Set the friction of that physicsBody to 0
    self.physicsBody.friction = 0.0f;

    // 1
    SKSpriteNode* ball = [SKSpriteNode spriteNodeWithImageNamed: @"Sphere.png"];
    ball.name = @"ball";
    ball.position = CGPointMake(self.frame.size.width/3, self.frame.size.height/3);
    [self addChild:ball];

    // 2
    ball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:ball.frame.size.width/2];
    // 3
    ball.physicsBody.friction = 0.0f;
    // 4
    ball.physicsBody.restitution = 1.0f;
    // 5
    ball.physicsBody.linearDamping = 0.0f;
    // 6
    ball.physicsBody.allowsRotation = NO;
    ball.physicsBody.affectedByGravity = NO;

    [ball.physicsBody applyImpulse:CGVectorMake(10.0f, 10.0f)];
于 2014-03-07T05:47:48.580 に答える
2

これにより、ノードが Swift のフレームに表示されます。

self.physicsBody = SKPhysicsBody (edgeLoopFromRect: self.frame)
于 2015-08-10T06:56:02.170 に答える