【问题标题】:Getting userData from SKNode array in for loop在 for 循环中从 SKNode 数组获取 userData
【发布时间】:2014-05-09 11:03:19
【问题描述】:

我在从我的对象中获取 userData 值时遇到了一些问题。我知道正在为对象设置 userData,因为在我的代码中的其他地方我可以毫无问题地访问它。

我创建了一个 SKNode *column3 来保存该列中的所有按钮。像这样添加到场景中:

    column3 = [SKNode node];
    [self addChild:column3];
    column3.name = @"column3";

当我创建按钮时,我将它们分配给适当的列,如下所示:

    [column3 addChild:newButton];

稍后在我的代码中,我需要遍历 column3 节点组并从该组中的每个对象获取 @"buttonRow" userData。出于某种原因,它只给我“NULL”的值。 NSLog 只是我用来测试的,它们对我来说并不重要。

当从该列中删除/删除任何按钮时,我需要获取此 userData 以便将我的所有按钮向下移动以占用屏幕上的任何空白空间。游戏将向下移动按钮并将新按钮添加到顶部以填充列。

我尝试将 column3.children 更改为 self.children,它会将所有列节点 IE/column1、column2、column3 等都给我玩。所以我不确定为什么它不起作用。一直在阅读并试图弄清楚。

 for(SKNode * child in column3.children) { //loop through all children in Column3.

                SKSpriteNode* sprite = (SKSpriteNode*)child;
                NSString* name = sprite.name;
                NSLog(@"child name %@", name);

                NSString *childRowTmp = [child.userData objectForKey:@"buttonRow"];
                NSLog(@"child row %@", childRowTmp);

                int childRowNumber = [childRowTmp intValue];
                NSLog(@"child row # %i", childRowNumber);
            }

任何帮助或提示都会很棒,谢谢。

更新: 这是我使用我创建的按钮类文件创建按钮的方法。

    //Create Blue Button.
    NSString *rand = [self genRandStringLength:10];
    newButton = [[ButtonNode alloc] initWithButtonType:1 column:3 row:i uniqueID:rand];
    newButton.name = rand;

    [column3 addChild:newButton];   //add the button to correct column
    [column3Array addObject:newButton];

    blueTotal++;
    totalButtons++;
    column3Total++;

这是创建对象的自定义类文件。

-(id)initWithButtonType:(int)buttonType column:(int)buttonColumn row:(int)buttonRow uniqueID:(NSString *)uniqueID {
    self = [super init];

    uniqueStr = uniqueID;

    rowNumber = buttonRow;

    columnNumber = 3;   //this is just hard coded for testing

     buttonNumber = 1;
     [self addButtonBlue];
}

这是类中创建和添加按钮的部分

- (void) addButtonBlue {

    SKSpriteNode *button;

        //button type 1
        button = [SKSpriteNode spriteNodeWithColor:[UIColor blueColor] size:kBoxSize];

        button.name = uniqueStr;

        button.physicsBody.categoryBitMask = blueCategory;
        button.physicsBody.contactTestBitMask = blueCategory;
        button.physicsBody.collisionBitMask = blueCategory | redCategory | yellowCategory | greenCategory | orangeCategory;

        NSString *tmpColumn = [NSString stringWithFormat:@"%i",columnNumber];
        NSString *tmpType = [NSString stringWithFormat:@"%i",buttonNumber];
        NSString *tmpRow = [NSString stringWithFormat:@"%i",rowNumber];

        button.userData = [NSMutableDictionary dictionary];
        [button.userData setValue:uniqueStr forKey:@"buttonID"];
        [button.userData setValue:tmpType forKeyPath:@"buttonType"];
        [button.userData setValue:tmpColumn forKeyPath:@"buttonColumn"];
        [button.userData setValue:tmpRow forKey:@"buttonRow"];

        button.position = CGPointMake(xPos , yPos );

        [self addChild:button];
}

【问题讨论】:

  • 向我们展示如何创建和填充 userData 对象
  • @LearnCocos2D 请看我的更新,谢谢回复。
  • 我的猜测是您要么没有将 userData 分配给您正在处理的所有节点,要么您正在处理错误的节点。
  • @LearnCocos2D 我已经浏览了我的代码,似乎找不到这个 gremlin。我还在这里更新了我的代码以包含更多细节。请看一看。谢谢。

标签: objective-c sknode


【解决方案1】:

我遇到了同样的问题,请参阅下面生成绿色或红色精灵的代码。试图给它SKSpriteNode.userData 中的颜色值。在我的日志输出中,userData(null)

+(SKSpriteNode *)randomSprite {
    SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"green.png"];
    [sprite setUserData:[NSMutableDictionary dictionary]];

    if ((arc4random() %(2)-1) == 0){
        sprite = [SKSpriteNode spriteNodeWithImageNamed:@"green.png"];
        [sprite.userData setValue:@"GREEN" forKey:@"COLOR"];
    }else {
        sprite = [SKSpriteNode spriteNodeWithImageNamed:@"red.png"];
        [sprite.userData setValue:@"RED" forKey:@"COLOR"];
    }

    NSLog(@"user data = %@",sprite.userData);

    sprite.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:sprite.size.width/2];
    sprite.physicsBody.dynamic = YES;

    return sprite;
}

对于一种解决方法,我想我们可以创建一个引用字典,其中 SKSpriteNode 实例是键,NSDictionary 数据是值。

//----- * 更新** -------

难怪在userData被初始化之后,另一个精灵被初始化在它的位置,留下userData为零!

+(SKSpriteNode *)randomSprite {
    SKSpriteNode *sprite;

    if ((arc4random() %(2)-1) == 0){
        sprite = [SKSpriteNode spriteNodeWithImageNamed:@"green.png"];
        [sprite setUserData:[NSMutableDictionary dictionary]];
        [sprite.userData setValue:@"GREEN" forKey:@"COLOR"];
    }else {
        sprite = [SKSpriteNode spriteNodeWithImageNamed:@"red.png"];
        [sprite setUserData:[NSMutableDictionary dictionary]];
        [sprite.userData setValue:@"RED" forKey:@"COLOR"];
    }

    NSLog(@"user data = %@",sprite.userData);

    sprite.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:sprite.size.width/2];
    sprite.physicsBody.dynamic = YES;

    return sprite;
}

【讨论】:

  • 你正在用一个新对象破坏'sprite',然后没有初始化那个新对象的 userData
  • 现在非常明显。 拍脑袋谢谢!
猜你喜欢
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 2017-12-11
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多