Frage

I am trying to get the value from my custom class SKNode object. The problem is when I touch on the object no matter what is gives me the same value regardless of the object I touch on. (blue button) and I cannot get the buttonID,buttonType that I set earlier.

Everything works well, except when I need to get the buttonType, buttonID of the object I touch or drag over.

I am not sure where I am going wrong, any help or push in the right direction would be great. Thanks.

here is my custom class .h file.

 #import <SpriteKit/SpriteKit.h>

  @interface ButtonNode : SKNode {

          SKNode *buttonCustom;

  }

  @property int buttonType, buttonColumn, buttonID, xPos, yPos;

  @property NSString *buttonName;

   -(id)initWithButtonType:(int)buttonType;


  @end

Here is my custom class .m file

#import "ButtonNode.h"


 #define kBoxSize CGSizeMake(40, 40)


 @implementation ButtonNode

 @synthesize buttonColumn,buttonType,buttonID,xPos,yPos,buttonName;


 static const uint32_t blueCategory = 1 << 0;
 static const uint32_t redCategory = 1 << 1;
 static const uint32_t greenCategory = 1 << 2;
 static const uint32_t yellowCategory = 1 << 3;


-(id)initWithButtonType:(int)buttonType {
     self = [super init];

     if (buttonType == 1) {
        NSLog(@"BLUE BUTTON CREATE");
         [self addButtonBlue];
     }
    if (buttonType == 2) {
       NSLog(@"RED BUTTON CREATE");
        [self addButtonRed];
    }
   if (buttonType == 3) {
      NSLog(@"Green BUTTON CREATE");
       [self addButtonGreen];
   }
   if (buttonType == 4) {
     NSLog(@"Yellow BUTTON CREATE");
      [self addButtonYellow];
   }
     return self;
 }

- (void) addButtonBlue {

    SKSpriteNode *rect;

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

        int tmpInt = [[NSDate date] timeIntervalSince1970];
        NSString *tmpName = [NSString stringWithFormat:@"%i", tmpInt];
        rect.name = tmpName; //unique name.

       rect.name = @"1";

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

        rect.position = CGPointMake(xPos , yPos );
       [self addChild:rect];
}

- (void) addButtonRed {

    SKSpriteNode *rect;

   //button type 2
   rect = [SKSpriteNode spriteNodeWithColor:[UIColor redColor] size:kBoxSize];

   int tmpInt = [[NSDate date] timeIntervalSince1970];
   NSString *tmpName = [NSString stringWithFormat:@"%i", tmpInt];
   rect.name = tmpName; //unique name.

   rect.name = @"2";

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

   rect.position = CGPointMake(xPos , yPos );
    [self addChild:rect];
}

- (void) addButtonGreen {

    SKSpriteNode *rect;

    //button type 3
    rect = [SKSpriteNode spriteNodeWithColor:[UIColor greenColor] size:kBoxSize];

    int tmpInt = [[NSDate date] timeIntervalSince1970];
    NSString *tmpName = [NSString stringWithFormat:@"%i", tmpInt];

   rect.name = tmpName; //unique name.

   rect.name = @"3";

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

   rect.position = CGPointMake(xPos , yPos );
   [self addChild:rect];
}

- (void) addButtonYellow {

   SKSpriteNode *rect;

   //button type 4
   rect = [SKSpriteNode spriteNodeWithColor:[UIColor yellowColor] size:kBoxSize];

   int tmpInt = [[NSDate date] timeIntervalSince1970];
   NSString *tmpName = [NSString stringWithFormat:@"%i", tmpInt];

   rect.name = tmpName; //unique name.

   rect.name = @"4";

   rect.physicsBody.mass = 1;
   rect.physicsBody.categoryBitMask = yellowCategory;
   rect.physicsBody.contactTestBitMask = yellowCategory;
   rect.physicsBody.collisionBitMask = blueCategory | redCategory | yellowCategory | greenCategory;

   rect.position = CGPointMake(xPos , yPos );
   [self addChild:rect];
}

@end

Here is where I create the buttons. (at top of file with rest of global ivar ) ButtonNode * newButton;

    for (int i = 1; i <= 6; i++) {

    //create random Int
    int tmpInt = arc4random() %3;

    NSLog(@"tmp %i" ,tmpInt);

    column1.position = CGPointMake(100, self.frame.size.height - 40);

    if (tmpInt == 0) {
        //button type 1
        newButton = [[ButtonNode alloc] initWithButtonType:1];
        newButton.xPos = column1.position.x;
        newButton.yPos = column1.position.y *i;
        newButton.buttonID = 344224351; //unique name
        newButton.buttonColumn = 2;
        newButton.buttonType = 1;
        [column1 addChild:newButton];
        blueTotal++;
        totalButtons++;
        column1Total++;
}
    if (tmpInt == 1) {
        //button type 2
        newButton = [[ButtonNode alloc] initWithButtonType:2];
        newButton.xPos = column1.position.x;
        newButton.yPos = column1.position.y *i;
        newButton.buttonID = 344224351; //unique name
        newButton.buttonColumn = 2;
        newButton.buttonType = 1;
        [column1 addChild:newButton];
        redTotal++;
        totalButtons++;
        column1Total++;
    }

 }

Here is the Part that is not working correctly.

     - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    for (UITouch *touch in touches) {

       UITouch* touch = [touches anyObject];
       CGPoint loc = [touch locationInNode:self];
       NSArray *nodes = [self nodesAtPoint:loc];

       for (SKNode *nod in nodes) {

          NSString *tmp = nod.name;
             if (tmp.length !=0) {

                NSString * tmpType = nod.name;

               if ([tmpType isEqualToString:@"1"]) {
                    NSLog(@"Node Type: %@", nod.name);
                    previousButton = @"1";
                    NSLog (@"%d",newButton.buttonType);
               }

               if ([tmpType isEqualToString:@"2"]) {
                   NSLog(@"Node Type: %@", nod.name);
                   previousButton = @"2";
                   NSLog (@"%d",newButton.buttonType);
               }

              if ([tmpType isEqualToString:@"3"]) {
                NSLog(@"Node Type: %@", nod.name);
                 previousButton = @"3";
                  NSLog (@"%d",newButton.buttonType);

            }

            if ([tmpType isEqualToString:@"4"]) {
                NSLog(@"Node Type: %@", nod.name);
                previousButton = @"4";
                NSLog (@"%d",newButton.buttonType);

            }

           }
       }
    }
}
War es hilfreich?

Lösung

A SKNode does not have those properties.

Try this just inside your for loop :

ButtonNode *myButton = (ButtonNode *)nod;

That will cast nod correctly as a ButtonNode, and you can use myButton like this :

NSLog(@"%d",myButton.buttonType);

Then you should be able to access the properties you have defined in the ButtonNode class.

You might only want to do that cast if you are sure it's a ButtonNode, but was just trying to help you understand why those properties would NEVER be accessible given your current code.

Also, your usage of newButton in that loop in touchesBegan is not what I think you 'think' it is. It's going to be the last button created, not the current node being stored in nod in the loop.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top