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

Ios 当背景与精灵颜色相同时,如何从父级中删除SkSpritEndode?,ios,xcode,sprite-kit,Ios,Xcode,Sprite Kit,我正在制作一个游戏,其中一个正方形的颜色将每秒改变,背景也将每秒改变颜色,用户必须点击正方形,当它与背景颜色相同时,分数将增加。但是我不知道怎么做。 这是我目前掌握的代码: #import "MyScene.h" @implementation MyScene -(id)initWithSize:(CGSize)size { if (self = [super initWithSize:size]) { /* Setup your scene here */

我正在制作一个游戏,其中一个正方形的颜色将每秒改变,背景也将每秒改变颜色,用户必须点击正方形,当它与背景颜色相同时,分数将增加。但是我不知道怎么做。 这是我目前掌握的代码:

#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

我建议您概括创建正方形和背景的代码,以简化为游戏添加更多颜色的过程。下面是一个如何做到这一点的示例:

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

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;
}
将此添加到touchesbeent方法以测试颜色匹配

    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");
        }
    }
剩下的就是创建一个SKAction,调用addSquareAndBackground,等待一秒钟,然后调用removeSquareAndBackground。泡沫,冲洗,重复

编辑:在@implementation MyScene语句上方添加以下内容:

@interface MyScene()

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

@end

[node runAction:[SKAction removeFromParent]]可以写为[node removeFromParent]@learnCos2D谢谢,我做了更改,你能帮我解决主要问题吗反正这会是一个很大的帮助你可以(大约)比较精灵和背景的颜色值,或者只是通过用户数据标记精灵dictionary@LearnCocos2D我将其添加到.h文件中:'@property(retain,非原子)NSMutableDictionary*userData;'但是我如何在上面的主代码中使用它呢?userData是任何节点的属性,这就是我的意思:-0x141E使用您的代码我得到这个错误,使用未清除的标识符“\u background”,而这个,使用未清除的标识符“\u square”。-(void)addSquareAndBackground{\u background=[自创建SpriteWithType:SpriteTypeBackground]square=[self-createSpriteWithType:SpriteTypeSquare];}我认为出于某种原因,这会导致问题,但我不能确定我是否编辑了我的答案。请参见“编辑”部分中的更改。