草庐IT

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

coder 2024-01-25 原文

我正在尝试从我的自定义类 SKNode 对象中获取值。问题是当我触摸物体时,不管我触摸的是什么物体,都会给我相同的值。 (蓝色按钮)而且我无法获取我之前设置的 buttonID、buttonType。

一切正常,除非我需要获取我触摸或拖过的对象的 buttonType、buttonID。

我不确定我哪里出错了,任何帮助或插入正确的方向都会很棒。谢谢。

这是我的自定义类 .h 文件。

 #import <SpriteKit/SpriteKit.h>

  @interface ButtonNode : SKNode {

          SKNode *buttonCustom;

  }

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

  @property NSString *buttonName;

   -(id)initWithButtonType:(int)buttonType;


  @end

这是我的自定义类 .m 文件

#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

这是我创建按钮的地方。 (在文件顶部与全局 ivar 的其余部分) 按钮节点 * 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++;
    }

 }

这是工作不正常的部分。

     - (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);

            }

           }
       }
    }
}

最佳答案

SKNode 没有这些属性。

在你的 for 循环中试试这个:

ButtonNode *myButton = (ButtonNode *)nod;

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

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

然后您应该能够访问您在 ButtonNode 类中定义的属性。

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

此外,您在 touchesBegan 的那个循环中使用 newButton 并不是我认为您“认为”的那样。这将是最后创建的按钮,而不是循环中存储在 nod 中的当前节点。

关于ios - Sprite Kit - 无法从对象获取自定义类数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23506357/

有关ios - Sprite Kit - 无法从对象获取自定义类数据的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  3. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  4. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  5. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  6. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  7. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  8. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  9. ruby-on-rails - 无法在centos上安装therubyracer(V8和GCC出错) - 2

    我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e

  10. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

随机推荐