web-dev-qa-db-ja.com

Physicsbodyがノードのアンカーポイントに準拠していません

私のシーンには、長方形と同じサイズの物理ボディを持つ長方形がたくさんあります。すべてのオブジェクトをCGPointZeroに固定するのが好きですが、そうすると、物理体が中央に固定されたままであることに気付きました。言い換えれば、私の物理体の位置は、視覚的表現の100ピクセル下と左のようなものです。

コードの簡単なスニペットは次のとおりです。

SKSpriteNode* square = [SKSpriteNode spriteNodeWithColor:[SKColor blackColor] size:CGSizeMake(width, height)];
square.anchorPoint = CGPointZero; //position based on bottom-left corner
square.position = CGPointMake(x, y);

square.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(width, height)];

この問題を解決するためのアイデアやアドバイスをいただければ幸いです。たとえば、物理体を視覚化できれば役立つかもしれませんが、その方法がわかりません。

更新:アンカーポイントを設定せず、長方形を再配置するだけで問題を解決しました。したがって、問題はまだ存在しますが、回避策があり、回避策はうまく機能しています。

32
Jason McCarrell

私はこれをAppleの欠如を修正するために書いた:

pathForRectangleOfSize:withAnchorPoint:を使用して、bodyWithRectangleOfSize:への呼び出しを置き換えます。その簡単なドキュメントで問題がわかります: "所有ノードの原点を中心とする長方形の物理ボディを作成します。"

@implementation SKPhysicsBody (CWAdditions)

+ (CGPathRef)pathForRectangleOfSize:(CGSize)size withAnchorPoint:(CGPoint)anchor {
  CGPathRef path = CGPathCreateWithRect( CGRectMake(-size.width * anchor.x, -size.height * anchor.y,
                                                    size.width,   size.height), nil);
  return path;
}

+ (SKPhysicsBody *)bodyWithRectangleOfSize:(CGSize)size withAnchorPoint:(CGPoint)anchor {
  CGPathRef path = [self pathForRectangleOfSize:size withAnchorPoint:anchor];
  return [self bodyWithPolygonFromPath:path];
}

@end

編集:この監視を提供するために7.1に新しいAPIがあります。

+ (SKPhysicsBody *)bodyWithRectangleOfSize:(CGSize)s center:(CGPoint)center
13
bshirley

使用できます

      [SKPhysicsBody bodyWithRectangleOfSize:size center: center];


       CGPoint center = CGPointMake(size.width*(anchorPoint.x-0.5f), size.height*(0.5f-anchorPoint.y))

親ノードのanchorPointに従ってバウンディングボックスを変換する必要があります

Swiftを使用していますが、SKPhysicsBodyの幅と高さが半分間違っていました。アンカーポイント(0,0)を使用しています。次に、rectangleOfSizecenter

var cc = SKSpriteNode(color: UIColor.greenColor(), size: CGSizeMake(32, 64))
cc.physicsBody = SKPhysicsBody(rectangleOfSize: cc.size, center: CGPointMake(32/2, 64/2))

私はそれがあなたにもうまくいくことを願っています...ありがとう!

4

スプライトノードの位置を設定する場合にのみ、anchorPointが必要です。なぜphysicsBody(ノードと同じサイズだと思います)をコーナーに移動する必要があるのか​​よくわかりません...しかし、このクラスメソッド[SKPhysicsBody bodyWithPolygonFromPath:path]が役立つかもしれません。

これがそのための素晴らしいジェネレータです: http://dazchong.com/spritekit/

4
Maxiller

SpriteKitを使用しているときに、私はこれに遭遇しました。残念ながら、物理ボディを作成して実際にノードをシーンに追加するタイミングに基づく問題があるようです。コードから順序を入れ替えて、ノードが実際にレンダーツリーに入るまで物理的な変更を行わないようにすると、「奇妙さ」が解決され、すべてが肉汁になります。

2
Sam

Swift 4.1

centerPoint = CGPoint(x:house1.size.width/2-(house1.size.width * house1.anchorPoint.x)、y:house1.size.height/2-(house1.size.height * house1.anchorPoint。 y))

house1.physicsBody = SKPhysicsBody(rectangleOf:house1.size、center:centerPoint)

0
uplearnedu.com

デフォルトのアンカーポイントを使用すると、問題が解決するはずです。同じ問題が発生し、シーン内のすべての物理ボディに対して、プログラムでアンカーポイントをx:0.5およびy:0.5に設定する必要がありました。これで私の問題は解決しました。

0