web-dev-qa-db-ja.com

スプライトキットのSKPhysicsbody境界線を視覚的に確認する方法はありますか?

BodyWithPolygonFromPathを使用して物理ボディのボリュームを定義し、

http://dazchong.com/spritekit/

必要なパスを取得します。しかし、パスは正しくないようです。形状が正しいかどうかを確認するために、Physicsbodyパスの境界線を確認します。

物理学者のボリュームの概要を確認する方法はありますか?

次のコードを試してみましたが、機能しません。

ship = [SKSpriteNode spriteNodeWithImageNamed:@ "Spaceship"];

CGFloat offsetX = ship.frame.size.width * ship.anchorPoint.x;
CGFloat offsetY = ship.frame.size.height * ship.anchorPoint.y;

CGMutablePathRef path = CGPathCreateMutable();

CGPathMoveToPoint(path, NULL, 50 - offsetX, 110 - offsetY);
CGPathAddLineToPoint(path, NULL, 18 - offsetX, 16 - offsetY);
CGPathAddLineToPoint(path, NULL, 140 - offsetX, 15 - offsetY);

CGPathCloseSubpath(path);

SKShapeNode *yourline = [SKShapeNode node];
yourline.name = @"yourline";
yourline.path = path;
[yourline setStrokeColor:[UIColor redColor]];
 [self addChild:yourline];


ship.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
//[ship setScale:0.5];
ship.zRotation = - M_PI / 2;
29
user2832367

Objective-CおよびiOS <7.1の場合

あなたのViewController.mでこのコードを見つけてください

SKView *skView = (SKView *)self.view;
skView.showsFPS = YES;
skView.showsNodeCount = YES;

最後の行の後に追加

skView.showsPhysics = YES;

ビルドして実行すると、すべての物理ボディの境界線が表示されます。

spriteNodeではなく、selfにshapeNodeを追加していることに気付いたので、以下を試してください。

SKSpriteNode *ship = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
CGFloat offsetX = ship.frame.size.width * ship.anchorPoint.x;
CGFloat offsetY = ship.frame.size.height * ship.anchorPoint.y;

CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 50 - offsetX, 110 - offsetY);
CGPathAddLineToPoint(path, NULL, 18 - offsetX, 16 - offsetY);
CGPathAddLineToPoint(path, NULL, 140 - offsetX, 15 - offsetY);
CGPathCloseSubpath(path);

ship.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];

[self addChild:ship];

SKShapeNode *shape = [SKShapeNode node];
shape.path = path;
shape.strokeColor = [SKColor colorWithRed:1.0 green:0 blue:0 alpha:0.5];
shape.lineWidth = 1.0;
[ship addChild:shape];

Swift&iOS> = 8.0の場合

let skView = self.view as! SKView
skView.showsFPS = true
skView.showsNodeCount = true
skView.showsPhysics = true

カスタムの境界線が必要な場合

let ship = SKSpriteNode(imageNamed: "Spaceship")
let offsetX = ship.frame.size.width * ship.anchorPoint.x
let offsetY = ship.frame.size.height * ship.anchorPoint.y

let path = CGPathCreateMutable()
CGPathMoveToPoint(path, nil, 50 - offsetX, 110 - offsetY)
CGPathAddLineToPoint(path, nil, 18 - offsetX, 16 - offsetY)
CGPathAddLineToPoint(path, nil, 140 - offsetX, 15 - offsetY)
CGPathCloseSubpath(path)

ship.physicsBody = SKPhysicsBody(polygonFromPath: path)
addChild(ship)

let shape = SKShapeNode()
shape.path = path
shape.strokeColor = SKColor(red: 1.0, green: 0, blue: 0, alpha: 0.5)
shape.lineWidth = 1.0
addChild(shape)

テスト済み:]

幸運を!!

64
Julio Montoya

新しい7.1ベータには、上記のようにこれを可能にする機能があります。

1
Stuart Welsh

私はこれが少し遅れていることを知っていますが、スプライト画像の周りにパスを自動的に作成する新しいツールに興味があると思ったので(手動でポイントをクリックする必要がないため)、さまざまな調整ができます要件に合わせた設定。このツールはまた、Objective CとSwift Sprite physics bodyにパスを追加するためのプログラムコードの両方を出力します。一部の人に役立つことを願っています。ありがとう:

http://www.radicalphase.com/pathgen/

1
Clive Minnican

テスト目的で、私は船をSKShapeNodeとしてセットアップし、今のところあなたのラインSKShapeNodeをコメントアウトし、ship.pathをSKPhysicsBodyに使用しているのと同じパスに設定します。

またはこれを使用することができます:

https://github.com/ymc-thzi/physicsDebugger

1
joshd

シェイプノードコードは正しいです。実際の船の前にyourlineがシーンに追加される可能性があるため、船のスプライトがその上に描画され、不明瞭になります。必ずyourline.zPositionを最上位の値に設定するか、[self addChild:yourline][self addChild:ship]の後に実行されるようにしてください。

0
Batalia

Swift

GameViewController.Swift、次の行を追加します:

override func viewDidLoad() {
    ...        
    if let view = self.view as! SKView? {
        ...
        view.showsPhysics = true // <--- add this line
    }
}
0
joshuakcockrell

これにより、ノードの上に赤い線が追加されます。ノードの物理本体に定義したのと同じパスを使用します。

+(void)debugPath:(CGPathRef)path onNode:(SKNode*)node {
    SKShapeNode *yourline = [SKShapeNode node];
    yourline.name = @"yourline";
    yourline.path = path;
    [yourline setStrokeColor:[UIColor redColor]];
    [node addChild:yourline];
}

つまり使用法:

[[self class] debugPath:ship.physicsBody.path onNode:ship];
0
Jonny