2015-11-19 4 views
0

Мне было интересно, был ли более эффективный способ изменения свойства SKSpriteNode в touchesBegan, чем мой текущий метод. Ниже приведен мой метод:Изменение свойства SKSpriteNode через touchhesBegan

 
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInNode:self]; 
    SKNode *node = [self nodeAtPoint:location]; 

    if ([node.name isEqualToString:@"Start"]){ 
     for (SKSpriteNode *node2 in [self children]){ 
      if ([node2.name isEqualToString:@"Start"]){ 
       node2.texture = [SKTexture textureWithImageNamed:@"button_beige_pressed"]; 
       } 
      } 
    } 
     ... 
} 
+0

Зачем вам нужно, если ([node.name isEqualToString: @ "Start"]) {и затем if ([node2.name isEqualToString: @ "Start"]) {? –

+0

В отдельном примечании вы должны как можно больше использовать текстуры. Метод textureWithImageNamed загружает текстуры, которые являются дорогостоящей операцией. Возможно, вы можете предварительно загрузить текстуру и просто применить ее позже. – mohkhan

+1

Можете ли вы создать 'SKTexture' вне цикла' for' (а затем назначить 'node2.texture' этой текстуре? Будет ли это лучше? – Gliderman

ответ

0

Я нашел решение:

 
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInNode:self]; 
    SKSpriteNode *node = (SKSpriteNode *)[self nodeAtPoint:location]; 

    if ([node.name isEqualToString:@"Start"]){ 
     node.texture = startPressed; 
    } 

} 

Я использовал узел, когда я должен был с помощью spritenode.

0

Ваша текущая логика предполагает, что у вас есть несколько узлов с именем «start». Если это действительно так, я предлагаю создать массив и сохранить все «стартовые» узлы в указанном массиве.

Если, однако, у вас есть только один узел с именем «start», то цикл не нужен, поскольку у вас уже есть ссылка на узел с сенсорной функцией.

Смежные вопросы