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];}我认为出于某种原因,这会导致问题,但我不能确定我是否编辑了我的答案。请参见“编辑”部分中的更改。