ios - NodesAtPoint 未找到节点

标签 ios objective-c sprite-kit

我正在尝试在我的应用中创建 10 个气球。我创建一个随机 CGPoint 来设置节点的位置并进行检查,如果此时已经存在节点,我会再次尝试。

我不知道为什么,气球总是被放在另一个气球上。 知道我做错了什么吗?

这是我的代码:

-(void)gerarBaloes:(int)quantidade
{
    balloons = [NSMutableArray new];
    u_int32_t maxHorizontal = 900;
    u_int32_t minHorizontal = 100;
    u_int32_t maxVertical = 650;
    u_int32_t minVertical = 100;
    for (int i=1; i<= quantidade; i++) {
        CGPoint posicao = CGPointMake(arc4random_uniform(maxHorizontal - minHorizontal + 1) + minHorizontal, arc4random_uniform(maxVertical - minVertical + 1) + minVertical);
        while (![self validPosition:posicao]) {
            posicao = CGPointMake(arc4random_uniform(maxHorizontal - minHorizontal + 1) + minHorizontal, arc4random_uniform(maxVertical - minVertical + 1) + minVertical);
        }
        balao* nBalao = [[balao alloc]initWithPosition:posicao];
        SKLabelNode* numero = [[SKLabelNode alloc]initWithFontNamed:@"Arial Rounded MT Bold"];
        numero.text = [NSString stringWithFormat:@"%d",i];
        numero.zPosition = 1;
        nBalao.body.zPosition = 0;
        [nBalao addChild:numero];
        nBalao.body.name = @"balloon";
        [balloons addObject:nBalao];
        [self addChild:nBalao];
    }
}

这是我的验证方法:

-(BOOL)validPosition:(CGPoint)position
{
    NSArray* nodes = [self nodesAtPoint:position];
    NSLog(@"total de nodes %d",nodes.count);
    if (nodes.count > 0) {
        for (SKNode* n in nodes) {
            if ([n isKindOfClass:[balao class]]) {
                return NO;
            }
        }
        return YES;
    }else{
        return YES;
    }
}

Baao.m类:

@implementation balao

-(id)initWithPosition:(CGPoint)pos
{
    if (self = [super init]) {
        self.position = pos;
        int n = arc4random_uniform(4);
        _balloonAtlas = [SKTextureAtlas atlasNamed:[NSString stringWithFormat:@"balloon%d",n]];
        _explosionFrames = [NSMutableArray array];
        int numImages = _balloonAtlas.textureNames.count;
        for (int i=1; i<= numImages; i++){
            NSString *textureName = [NSString stringWithFormat:@"balloon_%d",i];
            SKTexture *temp = [_balloonAtlas textureNamed:textureName];
            [_explosionFrames addObject:temp];
        }
        SKTexture *textInicial = [_explosionFrames[0] copy];
        [_explosionFrames removeObjectAtIndex:0];
        self.body = [SKSpriteNode spriteNodeWithTexture:textInicial];
        [self addChild:_body];
    }
    return self;
}

- (void)explodeBalloon
{
    SKAction* explosao = [SKAction animateWithTextures:_explosionFrames timePerFrame:0.02f resize:NO restore:YES];
    [self.body runAction:explosao completion:^(void){
        [self removeFromParent];
    }];
    [self runAction:[SKAction playSoundFileNamed:@"popSound.mp3" waitForCompletion:NO]];
}

气球是这样出现的:

Balloons

编辑: 我尝试了建议的方法,使用 CGRectCointainsPoint,但它也不起作用。 :/

enter image description here

最佳答案

在给定点检查节点 不足以防止重叠。您需要检查该点是否落在另一个气球的框架内。您可以像这样修改函数

-(BOOL)validPosition:(CGPoint)position
{
    NSArray* nodes = [self children];
    if (nodes.count > 0) {
        for (SKNode* n in nodes) {
            if ([n isKindOfClass:[balao class]]) {
                if (CGRectContainsPoint([n getBalloonFrame], position)) // Changed line
                {
                    return NO
                }
            }
        }
        return YES;
    }
    return YES;

}

CGRectContainsPoint 检查给定的矩形是否包含一个点。

在 balao 类中定义以下函数。还要注意上面代码中更改的行。

-(void)getBalloonFrame
{
    return CGRectOffset(self.body.frame, self.frame.origin.x, self.frame.origin.y)
} 

关于ios - NodesAtPoint 未找到节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28459391/

相关文章:

iphone - UIControlEvents 和子类化 UIControl

ios - Spritekit游戏设计

ios - 如何从 superview 获取所有元素(如 : UiLabel, UITextfield)并设置标签文本颜色和文本字段占位符颜色

java - 通过AsyncSocket向objective-c中的java服务器发送消息

objective-c - NSMassFormatter 无法将克转换为磅 (NSUnitMass) 或显示值

ios - Skaction 之后是场景转换

ios - SpriteKit SKScene size.width 说 1024 文档说它应该是 768

ios - react native : Sample App crashes after upgrading to Mac 10. 12.6

ios - NativeScript - Angular 2 自定义 AppDelegate

ios - 如何使用 Swift 删除 Parse.com 中的列