SpriteKit - набор шкал и физика

Каков правильный способ "уменьшить масштаб" на вашей сцене.

У меня есть объект, в котором я применяю импульс, чтобы запустить его по экрану. Например, он будет запускать около 100 пикселей в поперечнике. Это работает так, как ожидалось, - увеличивать силу, которую он летает больше, увеличивать плотность, которую он летает меньше и т.д.

Проблема, которую я имею, - масштабирование, единственный способ, который я знаю, чтобы уменьшить масштаб сцены, - это установитьScale, и сжимает все мои узлы, как ожидалось.

Но вместо того, чтобы объект летал на ту же сумму (просто уменьшился), он пролетает более чем в два раза.

Когда я регистрирую массу/плотность и т.д. объекта до и после масштабирования, они совпадают, как и ожидалось.

Так почему же он не теряет ту же сумму? Попробовал изменить импульс, чтобы он соответствовал шкале, но он не работает, да, он летает на меньшее расстояние, но не один на один с масштабированием.

Трудный вопрос...

Спасибо за идеи.

Ответ 1

Легкое исправление (спасибо Chris LaPollo, автор RW)

[self runAction:[SKAction scaleTo:0.5 duration:0]];

Больше ничего не нужно.

Странно, что вы не можете сделать

[self setScale:0.5];

Как вы получите это предупреждение, и это работает, но выполнение действия - странно!!!

SKScene: настройка масштаба SKScene не влияет.

Ответ 2

Я считаю, что вы не должны масштабировать SKScene (например, он подсказывает вам, если вы попробуете метод setScale с SKScene). Вместо этого попробуйте изменить размер.

myScene.scaleMode = SKSceneScaleModeAspectFill;

И затем при масштабировании:

myScene.size = CGSizeMake(myScene.size.width + dx, myScene.size.height + dy);

* Документация Apple говорит:

Задайте свойство scaleMode для SKSceneScaleModeResizeFill. Sprite Kit автоматически изменяет размер сцены так, чтобы она всегда соответствовала размеру просмотров.

Ответ 3

Для таких, как я, которые оказались здесь после поиска, изменение масштаба сцены, чтобы уменьшить масштаб, больше не работает. Вместо этого инкапсулируйте все ваши узлы в пустой SKNode и выполните действия над этим:

self.rootNode = [SKNode node];
// Add your children nodes here to the rootnode.
[self addChild:self.rootNode];
// Zoom out
[self.rootNode runAction:[SKAction scaleBy:2 duration:5]];
// Zoom in
[self.rootNode runAction:[SKAction scaleBy:.5 duration:5]];

self - это SKScene. Надеюсь, это поможет.