旋转俄罗斯方块

时间:2014-07-17 09:39:30

标签: ios sprite-kit

我有另一个问题。我有SKSpriteNode aktualniBlock,这里是初始化代码:

-(SKSpriteNode *)createBlock
{
    SKSpriteNode *blok = [[SKSpriteNode alloc]init];
    SKSpriteNode *square = [SKSpriteNode spriteNodeWithImageNamed:@"Red Square"];
    square.position = CGPointMake(45, 0);
    [blok addChild:square];
    square = [SKSpriteNode spriteNodeWithImageNamed:@"Red Square"];
    square.position = CGPointMake(15, 0);
    [blok addChild:square];
    square = [SKSpriteNode spriteNodeWithImageNamed:@"Red Square"];
    square.position = CGPointMake(30, 0);
    [blok addChild:square];
    square = [SKSpriteNode spriteNodeWithImageNamed:@"Red Square"];
    square.position = CGPointMake(0, 0);
    [blok addChild:square];
    square = [SKSpriteNode spriteNodeWithImageNamed:@"Red Square"];
    square.position = CGPointMake(45, 15);
    [blok addChild:square];

    CGRect rect = [blok calculateAccumulatedFrame];
    blok.size = CGSizeMake(rect.size.width, rect.size.height);
    return blok;
}

当我点击它时,它会旋转90度:

-(void)tap:(UIGestureRecognizer *)gestureRecognizer
{
    [aktualniBlok setZRotation:aktualniBlok.zRotation+1.571];
}

但它的旋转点不在块的中间,而是在块的左下角。如何将其置于块的中间位置。我试过了anchorPoint,但它没有用。谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

您需要为anchorPoint节点设置blok属性。

在致电calculateAccumulatedFrame后设置此行:

CGRect rect = [blok calculateAccumulatedFrame];
blok.size = CGSizeMake(rect.size.width, rect.size.height);
blok.anchorPoint = CGPointMake(0.5, 0.5);

您可以阅读anchorPoint属性here

此外,为了设置轮播,使用M_PI_2代替1.571会为您提供更准确的值。

答案 1 :(得分:0)

SKSprites的AnchorPoint默认为他们的中心点。

[aktualniBlok setZRotation:aktualniBlok.zRotation+M_PI_2];

代码可以满足你的需要(相对于它的中心改变旋转),但是如果你想改变每个红色方块相对于它们的中心点的旋转,你应该尝试;

[square setZRotation:square.zRotation+M_PI_2];

答案 2 :(得分:0)

你的俄罗斯方块片不会绕左下角旋转。它在(0,0)处围绕块的中心旋转。要围绕工件的中心旋转,请从每个块的x位置减去22.5。我修改了你的代码,使这个部分围绕它的中心旋转。

- (SKSpriteNode *) createBlock
{
    SKSpriteNode *blok = [[SKSpriteNode alloc]init];
    SKSpriteNode *square;
    for (int i=0;i<4;i++) {
       CGFloat x = i*15-22.5;
       square = [SKSpriteNode spriteNodeWithImageNamed:@"Red Square"];
       square.position = CGPointMake(x, 0);
       [blok addChild:square];
    }
    square = [SKSpriteNode spriteNodeWithImageNamed:@"Red Square"];
    square.position = CGPointMake(22.5, 15);
    [blok addChild:square];

    CGRect rect = [blok calculateAccumulatedFrame];
    blok.size = CGSizeMake(rect.size.width, rect.size.height);
    return blok;
}