Подтвердить что ты не робот

Физическое тело не придерживается якорной точки node

В моей сцене есть куча прямоугольников с физическими телами, размер которых равен размеру прямоугольника. Мне нравится привязывать все мои объекты к 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)];

Любые идеи или рекомендации для решения этой проблемы будут оценены. Например, если бы я мог визуализировать физические тела, это могло бы помочь, но я не уверен, как это сделать.

UPDATE: Я решил проблему, просто не установив опорную точку и не переместив мои прямоугольники. Таким образом, проблема все еще существует, но у меня есть работа вокруг, и работа вокруг работает хорошо.

4b9b3361

Ответ 1

Я написал это, чтобы исправить отсутствие Apple:

используйте pathForRectangleOfSize:withAnchorPoint:, чтобы заменить ваш вызов на bodyWithRectangleOfSize:, чья краткая документация говорит нам о проблеме: "Создает прямоугольное физическое тело, центрированное по собственному происхождению node".

@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

Изменить. Для обеспечения такого контроля существует новый API в 7.1.

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

Ответ 2

Вы можете использовать

      [SKPhysicsBody bodyWithRectangleOfSize:size center: center];


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

должен преобразовать ограничивающий прямоугольник в соответствии с якоремPoint родителей node

Ответ 3

Требуется привязка только при установке позиции spriteNode. Я не совсем понимаю, зачем вам нужно переместить физику (то есть размер node, я полагаю) в угол... Но вы можете найти этот метод класса [SKPhysicsBody bodyWithPolygonFromPath: путь].

Вот хороший генератор для этого: http://dazchong.com/spritekit/

Ответ 4

Я использую Swift, но SKPhysicsBody выглядел наполовину шириной и высотой. Я использую опорную точку (0,0). Затем я использовал метод с rectangleOfSize, center:

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

Я надеюсь, что это сработает для вас тоже, ребята... спасибо!

Ответ 5

Я сам использовал это при использовании SpriteKit. К сожалению, по-видимому, существуют проблемы, основанные на сроках создания физического тела и фактическом добавлении node к сцене. Если вы замените заказ на свой код и убедитесь, что вы не делаете НИКАКИХ изменений физики до тех пор, пока node на самом деле не появится в дереве рендеринга, это должно устранить "странность", и все будет полностью подлито.