Физическое тело не придерживается якорной точки 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: Я решил проблему, просто не установив опорную точку и не переместив мои прямоугольники. Таким образом, проблема все еще существует, но у меня есть работа вокруг, и работа вокруг работает хорошо.
Ответы
Ответ 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 на самом деле не появится в дереве рендеринга, это должно устранить "странность", и все будет полностью подлито.