user2415313
user2415313

Reputation: 101

SKSpriteNode ScaleUpFrom?

Problem

Scaling up a 2D image, scales up from the image centre point, however. I need it to scale up from a specific co-ordinate?

[backgroundImage setScale:rifleZoom];

My current technique to scaling up the image.

I need to scale up from centre screen as opposed to centre image

Now my way to place a rifle shot on the screen @ centre is this way:

CGPoint positionNow = CGPointMake(backgroundImage.position.x, backgroundImage.position.y);
CGPoint positionPrev = CGPointMake(0.5, 0.5);

float xdiff = positionNow.x - positionPrev.x;
float ydiff = positionNow.y - positionPrev.y;

CGPoint newPositionOne = CGPointMake(0.5- xdiff, 0.5 - ydiff);
newPositionOne = CGPointMake(newPositionOne.x/rifleZoom, newPositionOne.y/rifleZoom);

Now this works perfectly no matter how much the image is scaled, however. I cannot seem to implement it into scaling the image up from the centre of the screen opposed to centre of the image.

What I've Tried

I've tried to change the position of the image before scaling it up. To the same same point make as newPositionOne However, this does not work or not being done right.

EDIT

This scales and brings centre to screen centrepoint, or messes up completely. It's a little too off the cuff to make a decision exactly what it's doing.

CGPoint positionNow = CGPointMake(backgroundImage.position.x, backgroundImage.position.y);
CGPoint positionPrev = CGPointMake(0.5, 0.5);

float xdiff = positionNow.x - positionPrev.x;
float ydiff = positionNow.y - positionPrev.y;

CGPoint newPositionOne = CGPointMake(0.5- xdiff, 0.5 - ydiff);
newPositionOne = CGPointMake(newPositionOne.x/rifleZoom, newPositionOne.y/rifleZoom);


double xPosition = newPositionOne.x / backgroundImage.size.width;
double yPosition = newPositionOne.y / backgroundImage.size.height;

CGPoint prevAnchorPoint = backgroundImage.anchorPoint;
backgroundImage.anchorPoint = CGPointMake(xPosition,yPosition);

double positionX = backgroundImage.position.x + (backgroundImage.anchorPoint.x - prevAnchorPoint.x) * backgroundImage.size.width;
double positionY = backgroundImage.position.y + (backgroundImage.anchorPoint.y - prevAnchorPoint.y) * backgroundImage.size.height;

backgroundImage.position = CGPointMake(positionX,positionY);


[backgroundImage runAction:[SKAction repeatAction:[SKAction scaleTo:rifleZoom duration:1.0] count:1]];

Upvotes: 1

Views: 53

Answers (1)

rakeshbs
rakeshbs

Reputation: 24572

You can use the anchor point property of the background node to change the point from which image scales. By default the anchorPoint is at (0.5,0.5). This indicates the center of the node. If you make the anchorPoint (0,0), then its moved to the bottom left corner.

anchorPoint : Defines the point in the sprite that corresponds to the node’s position. You specify the value for this property in the unit coordinate space. The default value is (0.5,0.5), which means that the sprite is centered on its position.

When you shift the anchorPoint, you have to adjust the background position again to counteract the movement due to changing the anchorPoint.

So you can use,

CGPoint xPosition = convertedPoint.x / background.size.width
CGPoint yPosition = convertedPoint.y / background.size.height

CGPoint prevAnchorPoint = background.anchorPoint
background.anchorPoint = CGPointMake(xPosition,yPosition)

CGFloat positionX = background.position.x + (background.anchorPoint.x - prevAnchorPoint.x) * background.size.width
CGFloat positionY = background.position.y + (background.anchorPoint.y - prevAnchorPoint.y) * background.size.height

background.position = CGPointMake(positionX,positionY)

Upvotes: 1

Related Questions