10
votes

What is the correct way to "zoom out" on your scene.

I have an object that I apply an impulse to fire it across the screen. It for example will fire about 100 px across., this works as expected - increase the force it flys more, increase the density it flys less etc.

The problem i have is zooming, the only way I know to zoom out on a scene is to setScale, and the shrinks all my nodes as expected.

But then instead of the object flying the same amount (just zoomed out) it flys more than double the distance.

When I log the mass / density etc of the object before and after I scale they are the same, as expected.

So why doesn't it fly the same amount ? Tried changing the impulse to match the scale, but it doesnt work, yes it flys less distance - but its not one for one with the scaling.

Tricky question...

Thanks for ideas.

3

3 Answers

11
votes

I believe you're not supposed to scale the SKScene (like it hints you if you try setScale method with SKScene). Try resizing it instead.

myScene.scaleMode = SKSceneScaleModeAspectFill;

And then while zooming:

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

*Apple documentation says:

Set the scaleMode property to SKSceneScaleModeResizeFill. Sprite Kit automatically resizes the scene so that it always matches the view’s size.

10
votes

The easy fix (thanks to Chris LaPollo, an author on RW)

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

Nothing else needed.

The odd thing is you cannot do

[self setScale:0.5];

As you get this warning, and it doenst work - but running an action does -- weird!!!

SKScene: Setting the scale of a SKScene has no effect.

1
votes

For those like me who ended up here after a search, changing the scale of the scene to zoom out no longer works. Instead, encapsulate all your nodes in an empty SKNode and run actions on this one:

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 is the SKScene. I hope this helps.