当背景颜色与精灵相同时,如何从父项中删除SKSpriteNode?

时间:2014-08-29 07:19:51

标签: ios xcode sprite-kit

我制作一个游戏,其中方块的颜色每秒都会改变,背景也会每秒改变颜色,当用户与背景颜色相同时,用户必须点击方块,分数会增加。但我不知道如何做到这一点。 这是我到目前为止的代码:

#import "MyScene.h"

@implementation MyScene

-(id)initWithSize:(CGSize)size {    
    if (self = [super initWithSize:size]) {
        /* Setup your scene here */
            [self performSelector:@selector(backgrounds) withObject:nil ];
            [self performSelector:@selector(createSquare) withObject:nil afterDelay:0];
            [self performSelector:@selector(createPSquare) withObject:nil afterDelay:0];

        }
    return self;

}

-(void) backgrounds {
    SKSpriteNode *background = [SKSpriteNode spriteNodeWithImageNamed:@"blueOutline"];
    background.name = @"blueOutline";
    background.size          = CGSizeMake(320, 480);
    background.position      = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame));
    [self addChild:background];

    //meathod sequence at interval

}

-(void) createSquare {
    SKSpriteNode *blueSprite = [SKSpriteNode spriteNodeWithImageNamed:@"blue"];
    blueSprite.name = @"blueSprite";
    blueSprite.size          = CGSizeMake(50, 50);
    blueSprite.position      = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame));
    [self addChild:blueSprite];

    //meathod sequence at interval

}

-(void) createPSquare {
    SKSpriteNode *pinkSprite = [SKSpriteNode spriteNodeWithImageNamed:@"pink"];
    pinkSprite.name = @"pinkSprite";
    pinkSprite.size          = CGSizeMake(50, 50);
    pinkSprite.position      = CGPointMake(CGRectGetMidX(self.frame)+10,CGRectGetMidY(self.frame));
    [self addChild:pinkSprite];

    //meathod sequence at interval

}



-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    /* Called when a touch begins */

    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInNode:self];
    SKNode *node = [self nodeAtPoint:location];


    if ([node.name isEqualToString:@"blueSprite"]) {
        [node runAction:[SKAction removeFromParent]]; //Removes Sprite from parent
    }


    if ([node.name isEqualToString:@"pinkSprite"]) {
        [node runAction:[SKAction removeFromParent]]; //Removes Sprite from parent
    }

}

-(void)update:(CFTimeInterval)currentTime {
    /* Called before each frame is rendered */
}

@end

1 个答案:

答案 0 :(得分:0)

我建议你概括一下创建方块和背景的代码,以简化为游戏添加更多颜色的过程。以下是如何执行此操作的示例:

定义一个标识要创建的精灵节点类型的类型

typedef NS_ENUM (NSInteger, SpriteType) {
    SpriteTypeBackground,
    SpriteTypeSquare
};

此方法为场景添加正方形和背景,每个场景都有一个随机选择的颜色

- (void) addSquareAndBackground {
    _background = [self createSpriteWithType:SpriteTypeBackground];
    _square = [self createSpriteWithType:SpriteTypeSquare];
}

这将从场景中删除方形和背景

- (void) removeSquareAndBackground {
    [_background removeFromParent];
    [_square removeFromParent];
}

根据指定的类型

创建方形或背景精灵
-(SKSpriteNode *) createSpriteWithType:(SpriteType)type {
    // Select a color randomly
    NSString *colorName = [self randomColorName];
    SKSpriteNode *sprite;
    if (type == SpriteTypeBackground) {
        NSString *name = [NSString stringWithFormat:@"%@Outline",colorName];
        sprite = [SKSpriteNode spriteNodeWithImageNamed:name];
        sprite.name = name;
        sprite.size = CGSizeMake(320, 480);
    }
    else {
        sprite = [SKSpriteNode spriteNodeWithImageNamed:colorName];
        sprite.name = [NSString stringWithFormat:@"%@Sprite",colorName];
        sprite.size = CGSizeMake(50, 50);
    }
    sprite.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame));
    [self addChild:sprite];

    return sprite;
}

随机选择颜色名称

// Set the total number of colors here
#define kNumberOfColors     2

- (NSString *) randomColorName {
    NSString *colorName;
    switch (arc4random_uniform(kNumberOfColors)) {
        case 0:
            colorName = @"blue";
            break;
        case 1:
            colorName = @"pink";
            break;
        // Add more colors here
        default:
            break;
    }
    return colorName;
}

将此添加到touchesBegan方法以测试颜色匹配

    if (node == _square) {
        // Extract the color name from the node name
        NSArray *squareNameParts = [node.name componentsSeparatedByCharactersInSet:[NSCharacterSet uppercaseLetterCharacterSet]];
        // Extract the color name from the node name
        NSArray *backgroundNameParts = [_background.name componentsSeparatedByCharactersInSet:[NSCharacterSet uppercaseLetterCharacterSet]];
        // Compare if the colors match
        if ([backgroundNameParts[0] isEqualToString: squareNameParts[0]]) {
            NSLog(@"Score");
        }
    }

剩下的就是创建一个调用addSquareAndBackground的SKAction,等待一秒钟,然后调用removeSquareAndBackground。泡沫,冲洗,重复!

编辑:在@implementation MyScene声明上方添加此内容:

@interface MyScene()

@property SKSpriteNode *background;
@property SKSpriteNode *square;

@end