Система координат в SpriteKit
Я довольно запутался с системой координат spritekit. Мне нужны разъяснения по двум случаям.
Случай 1:
Когда узел спрайта добавляется в качестве дочернего к сцене:
SKSpriteNode * blueBall = [SKSpriteNode spriteNodeWithImageNamed:@"hRedBall.png"];
blueBall.name=@"blueball";
blueBall.size=CGSizeMake(75, 75);
blueBall.position=point; //I am varying this point
[self addChild:blueBall];
Я каждый раз добавлял узел в разные точки. Это точки, в которые я добавил узел:(100x100)(200x200)(300x300)(400x400)(900,600)
И на моем устройстве iphone 5 они выглядят так:
Если вы посмотрите на 100x100, когда я добавляю спрайт в точку (100,100), на устройстве, когда я регистрирую положение узла, он показывает мне (99,9,138,17), что является огромной разницей по сравнению с точкой (100,100).
Несмотря на то, что есть изменения в других точках, я пренебрегаю ими, поскольку разница слишком мала для других точек.
-(void)didMoveToView:(SKView *)view {
/* Setup your scene here */
[self bounceTheBlueBallAtPoint:CGPointMake(100, 100)];
}
-(void)bounceTheBlueBallAtPoint:(CGPoint)point{
SKSpriteNode * blueBall = [SKSpriteNode spriteNodeWithImageNamed:@"hRedBall.png"];
blueBall.name=@"blueball";
blueBall.size=CGSizeMake(75, 75);
blueBall.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:blueBall.frame.size.width/2];
blueBall.physicsBody.categoryBitMask=blueBallHitCategory;
blueBall.physicsBody.collisionBitMask=blueBallHitCategory|pinkBallHitCategory|wallHitCategory;
blueBall.physicsBody.contactTestBitMask=blueBallHitCategory|pinkBallHitCategory|wallHitCategory;
blueBall.physicsBody.dynamic=YES;
blueBall.physicsBody.affectedByGravity=NO;
blueBall.physicsBody.restitution=1.0;
blueBall.physicsBody.friction=0.0;
blueBall.physicsBody.linearDamping=0.0;
blueBall.physicsBody.angularDamping=0.0;
blueBall.position=point;
[self addChild:blueBall];
//applying impulse to bounce off
// CGVector impulse = CGVectorMake(30.0,60.0);
// [blueBall.physicsBody applyImpulse:impulse];
//
}
Я проверяю положение мяча в этом методе:
-(void)update:(CFTimeInterval)currentTime {
/* Called before each frame is rendered */
[self checkSpriteMovement];
}
-(void)checkSpriteMovement{
[self enumerateChildNodesWithName:@"blueball" usingBlock:^(SKNode * _Nonnull node, BOOL * _Nonnull stop) {
SKSpriteNode *ball=(SKSpriteNode *)node;
if (ball.physicsBody.resting) {
NSLog(@"The ball position is %@",NSStringFromCGPoint(ball.position));
}
}];
}
Случай 2:
Допустим, у меня есть фоновый узел спрайта, и я добавляю узел ball в этот фоновый узел вместо добавления узла ball в сцену.
_background = [SKSpriteNode spriteNodeWithImageNamed:@"parkImage.jpg"];
_background.size = self.frame.size; //frame size is (1024x768)
_background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
[self addChild:_background];
а затем я добавляю узел шара к этому фону:
[_background addChild:blueBall];
Это фоновый узел добавлен:
Теперь я попытался добавить мяч к добавленному фону:
В точке: (100 100):
В точке: (- 280, -150)
Я также хотел бы обсудить третий случай:
Случай 3:
Я хочу, чтобы на другом узле был спрайт backgorund под названием ring. А позже я хочу добавить мяч на задний план. Таким образом, будет 2 дочерних узла.
_ringNode=[SKSpriteNode spriteNodeWithImageNamed:@"hue_ring.png"];
_ringNode.size=CGSizeMake(80, 80);
_ringNode.position=CGPointMake(0, 0); //center point of background in this case
_ringNode.anchorPoint=CGPointMake(0.5,0.5);
_ringNode.name=kRingNodeName;
[_background addChild:_ringNode];
поэтому кольцо будет здесь:
А теперь я хочу добавить шариковый узел к фоновому узлу:
Я использовал тот же код, чтобы добавить мяч в точку (-280, -150):
Почему происходит изменение в системе координат узлов сцены и спрайта?
Еще одна проблема, с которой я сталкиваюсь:
Узлы не добавляются в сцену должным образом. Даже если сцена запущена, узлы не видны пользователю, но я вижу количество узлов, которое говорит, что на экране есть узлы. Мне нужно снова запустить код, чтобы увидеть узлы добавлены правильно на сцену. Это происходит раз в 4 раза. Мне просто нужно остановить код и запустить его снова, чтобы увидеть шары на экране, иначе я вижу только фон без каких-либо шариков, хотя я добавляю их в фон.
Почему это происходит?
Я добавляю все узлы вdidMoveToView