菜鸟教程小白 发表于 2022-12-12 22:13:24

ios - Sprite Kit - 无法从对象获取自定义类数据


                                            <p><p>我正在尝试从我的自定义类 SKNode 对象中获取值。问题是当我触摸对象时,无论我触摸什么对象,它都会给我相同的值。
(蓝色按钮),我无法获得之前设置的 buttonID、buttonType。</p>

<p>一切正常,除非我需要获取我触摸或拖动的对象的 buttonType、buttonID。</p>

<p>我不确定我哪里出错了,任何帮助或朝着正确方向前进都会很棒。谢谢。</p>

<p>这是我的自定义类 .h 文件。</p>

<pre><code> #import &lt;SpriteKit/SpriteKit.h&gt;

@interface ButtonNode : SKNode {

          SKNode *buttonCustom;

}

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

@property NSString *buttonName;

   -(id)initWithButtonType:(int)buttonType;


@end
</code></pre>

<p>这是我的自定义类 .m 文件</p>

<pre><code>#import &#34;ButtonNode.h&#34;


#define kBoxSize CGSizeMake(40, 40)


@implementation ButtonNode

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


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


-(id)initWithButtonType:(int)buttonType {
   self = ;

   if (buttonType == 1) {
      NSLog(@&#34;BLUE BUTTON CREATE&#34;);
         ;
   }
    if (buttonType == 2) {
       NSLog(@&#34;RED BUTTON CREATE&#34;);
      ;
    }
   if (buttonType == 3) {
      NSLog(@&#34;Green BUTTON CREATE&#34;);
       ;
   }
   if (buttonType == 4) {
   NSLog(@&#34;Yellow BUTTON CREATE&#34;);
      ;
   }
   return self;
}

- (void) addButtonBlue {

    SKSpriteNode *rect;

       //button type 1
      rect = size:kBoxSize];

      int tmpInt = [ timeIntervalSince1970];
      NSString *tmpName = ;
      rect.name = tmpName; //unique name.

       rect.name = @&#34;1&#34;;

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

      rect.position = CGPointMake(xPos , yPos );
       ;
}

- (void) addButtonRed {

    SKSpriteNode *rect;

   //button type 2
   rect = size:kBoxSize];

   int tmpInt = [ timeIntervalSince1970];
   NSString *tmpName = ;
   rect.name = tmpName; //unique name.

   rect.name = @&#34;2&#34;;

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

   rect.position = CGPointMake(xPos , yPos );
    ;
}

- (void) addButtonGreen {

    SKSpriteNode *rect;

    //button type 3
    rect = size:kBoxSize];

    int tmpInt = [ timeIntervalSince1970];
    NSString *tmpName = ;

   rect.name = tmpName; //unique name.

   rect.name = @&#34;3&#34;;

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

   rect.position = CGPointMake(xPos , yPos );
   ;
}

- (void) addButtonYellow {

   SKSpriteNode *rect;

   //button type 4
   rect = size:kBoxSize];

   int tmpInt = [ timeIntervalSince1970];
   NSString *tmpName = ;

   rect.name = tmpName; //unique name.

   rect.name = @&#34;4&#34;;

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

   rect.position = CGPointMake(xPos , yPos );
   ;
}

@end
</code></pre>

<p>这里是我创建按钮的地方。
(在文件顶部与全局 ivar 的其余部分一起)
ButtonNode * newButton;</p>

<pre><code>    for (int i = 1; i &lt;= 6; i++) {

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

    NSLog(@&#34;tmp %i&#34; ,tmpInt);

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

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

}
</code></pre>

<p>这是无法正常工作的部分。</p>

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

       UITouch* touch = ;
       CGPoint loc = ;
       NSArray *nodes = ;

       for (SKNode *nod in nodes) {

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

                NSString * tmpType = nod.name;

               if () {
                  NSLog(@&#34;Node Type: %@&#34;, nod.name);
                  previousButton = @&#34;1&#34;;
                  NSLog (@&#34;%d&#34;,newButton.buttonType);
               }

               if () {
                   NSLog(@&#34;Node Type: %@&#34;, nod.name);
                   previousButton = @&#34;2&#34;;
                   NSLog (@&#34;%d&#34;,newButton.buttonType);
               }

            if () {
                NSLog(@&#34;Node Type: %@&#34;, nod.name);
               previousButton = @&#34;3&#34;;
                  NSLog (@&#34;%d&#34;,newButton.buttonType);

            }

            if () {
                NSLog(@&#34;Node Type: %@&#34;, nod.name);
                previousButton = @&#34;4&#34;;
                NSLog (@&#34;%d&#34;,newButton.buttonType);

            }

         }
       }
    }
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p><code>SKNode</code> 没有这些属性。</p>

<p>在你的 for 循环中试试这个:</p>

<pre><code>ButtonNode *myButton = (ButtonNode *)nod;
</code></pre>

<p>这会将 <code>nod</code> 正确地转换为 <code>ButtonNode</code>,您可以像这样使用 <code>myButton</code>:</p>

<pre><code>NSLog(@&#34;%d&#34;,myButton.buttonType);
</code></pre>

<p>那么您应该能够访问您在 <code>ButtonNode</code> 类中定义的属性。</p>

<p>如果您确定它是一个 ButtonNode,您可能只想进行该转换,但只是想帮助您理解为什么在您当前的代码下永远无法访问这些属性。 </p>

<p>此外,您在 <code>touchesBegan</code> 的循环中对 <code>newButton</code> 的使用并不是我认为您“认为”的那样。这将是创建的最后一个按钮,而不是当前节点存储在循环中的 <code>nod</code> 中。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Sprite Kit - 无法从对象获取自定义类数据,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/23506357/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/23506357/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Sprite Kit - 无法从对象获取自定义类数据