【问题标题】:Animate masked image in SpriteKit (SKCropNode)SpriteKit(SKCropNode)中的动画蒙版图像
【发布时间】:2013-10-08 20:39:04
【问题描述】:

我正在使用 Sprite Kit 创建我的第一个 iOS 应用程序,但我遇到了一个看似非常基本的问题。

我正在尝试为 SKCropNode (cropNode) 的内容 (fillNode) 设置动画。下面的代码很好地设置了 SKScene(我看到插图被正确掩盖,放置在正确位置的背景图像上)...

SKSpriteNode *logoBG = [[SKSpriteNode alloc] initWithImageNamed:logoBackground];
logoBG.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
[self addChild:logoBG];

SKCropNode *cropNode = [[SKCropNode alloc] init];
cropNode.maskNode = [[SKSpriteNode alloc] initWithImageNamed:logoMask];
SKSpriteNode *fillNode = [[SKSpriteNode alloc] initWithImageNamed:logoImage];

[cropNode addChild:fillNode];
fillNode.position = CGPointMake(0,300);
cropNode.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
self.logoContent = cropNode;
[self addChild:self.logoContent];

...但我无法访问蒙版插图来为其位置设置动画(我希望它从蒙版外部开始并滑入位置):

CGRect screenBound = [[UIScreen mainScreen] bounds];
CGSize screenSize = screenBound.size;

SKAction *moveUp = [SKAction moveByX: 0 y: 100 duration: 5];
SKAction *moveSequence = [SKAction sequence:@[moveUp]];
[self.logoContent.target_illustration runAction: moveSequence completion:^{ // '.target_illustration' = the SKSpriteNode that I want to animate; cropNode.fillNode
    SKScene *titleScreen  = [[TitleScreen alloc] initWithSize:self.size];
    SKTransition *fade = [SKTransition fadeWithDuration:(1)];
    [self.view presentScene:titleScreen transition:fade];
}];

我只能为整个 logoContent 而不是它的子节点设置动画。

有什么想法我哪里出错了吗?

【问题讨论】:

    标签: animation ios7 sprite-kit skcropnode


    【解决方案1】:

    如果有人想知道如何屏蔽,仅供参考,这里有一个简单的sn-p

    - (void) cropNodes
    {
        // the parent node i will add to screen
        SKSpriteNode *picFrame = [SKSpriteNode spriteNodeWithColor:[SKColor greenColor] size:CGSizeMake(100, 100)];
        picFrame.position = CGPointMake(200, 200);
    
        // the part I want to run action on
        SKSpriteNode *pic = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
        pic.name = @"PictureNode";
    
        SKSpriteNode *mask = [SKSpriteNode spriteNodeWithColor:[SKColor blackColor] size:CGSizeMake(80, 50)];
    
        SKCropNode *cropNode = [SKCropNode node];
        [cropNode addChild:pic];
        [cropNode setMaskNode:mask];
        [picFrame addChild:cropNode];
        [self addChild:picFrame];
    
        // run action in this scope
            //[pic runAction:[SKAction moveBy:CGVectorMake(30, 30) duration:10]];
    
        // outside scope - pass its parent
       [self moveTheThing:cropNode];
    }
    
    - (void) moveTheThing:(SKNode *) theParent
    {
        // the child i want to move
        SKSpriteNode *moveThisThing = (SKSpriteNode *)[theParent   childNodeWithName:@"PictureNode"];
        [moveThisThing runAction:[SKAction moveBy:CGVectorMake(30, 30) duration:10]];
    }
    

    【讨论】:

    • 我遇到的问题是由于在 didMoveToView 方法中调用了 runAction,而 logoContent 节点(及其命名的子节点)是在 createSceneContents 方法中创建的(从 didMoveToView 调用);由于范围,我无法访问命名的插图节点。在同一范围内调用 runAction 时,您的解决方案可以正常工作。
    • 你不想使用 childNodeWithName 方法?
    • 我试过了,但无法正常工作。怪我缺乏 Obj-C 经验!
    • 你所能做的就是尝试......可能只是一个它不起作用的SK错误。我会添加一个答案,看看它是否有效
    • 是的,您的代码确实有效......我遇到的问题是我的动画动作与节点的范围不同(它们是在函数中创建的)。将节点创建移动到与动画调用相同的函数,调用[self.logoContent.children[0] runAction: moveSequence completion:^{也是如此。
    【解决方案2】:

    知道了!

    [self.logoContent.target_illustration runAction: moveSequence completion:^{
    

    应该是

    [self.logoContent.children[0] runAction: moveSequence completion:^{
    

    我的插图现在按照指示移动:)

    【讨论】:

    • 啊,谢谢!我犯了完全相同的错误。你救了我万年的困惑。虽然是 2 年前。
    猜你喜欢
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    相关资源
    最近更新 更多