2014-02-15 5 views
0

У меня проблема с касаниями на спрайтах в SpriteKit.Включить касания спрайта (spritekit)

Вот мой код.

#define kRowCount 8 
#define kColCount 6 
#define kDotGridSpacing CGSizeMake (50,-50) 
#import "BBMyScene.h" 

@implementation BBMyScene 

@synthesize dot; 
@synthesize htoucharea; 
@synthesize vtoucharea; 
@synthesize hFrame; 
@synthesize vFrame; 



-(id)initWithSize:(CGSize)size {  
if (self = [super initWithSize:size]) { 
    /* Setup your scene here */ 

    self.userInteractionEnabled = YES; 

    // Set up Background 
    self.backgroundColor = [SKColor colorWithRed:0.957 green:0.957 blue:0.957 alpha:1]; /*#f4f4f4*/ 


    // Set up Lattice of Dots 
    CGPoint baseOrigin = CGPointMake(35, 385); 
    for (NSUInteger row = 0; row < kRowCount; ++row) { 


     CGPoint dotPosition = CGPointMake(baseOrigin.x, row * (kDotGridSpacing.height) + baseOrigin.y); 


     for (NSUInteger col = 0; col < kColCount; ++col) { 

      dot = [SKSpriteNode spriteNodeWithImageNamed:@"dot"]; 
      dot.position = dotPosition; 
      NSString *dotName = [NSString stringWithFormat:@"dot_%d_%d", row, col]; 
      dot.name = dotName; 
      [self addChild:dot]; 
      dotPosition.x += kDotGridSpacing.width; 



     } 

    } 


    //Set up horizontal touch areas 
    for (NSUInteger row = 0; row < kRowCount; ++row) { 

     CGPoint htouchareaPosition = CGPointMake(baseOrigin.x + 0.5*(kDotGridSpacing.width), row * (kDotGridSpacing.height) + baseOrigin.y); 

     for (NSUInteger col = 0; col < kColCount-1; ++col) { 

      htoucharea = [SKSpriteNode spriteNodeWithColor:[SKColor colorWithRed:0.18 green:0.702 blue:0.91 alpha:0.5] size:CGSizeMake(35,25)]; 
      htoucharea.position = htouchareaPosition; 
      NSString *htouchareaName = [NSString stringWithFormat:@"htoucharea_%d_%d", row, col]; 
      htoucharea.name = htouchareaName; 
      htoucharea.userInteractionEnabled = YES; 

      htouchareaPosition.x += kDotGridSpacing.width; 

      [self addChild:htoucharea]; 


     } 

    } 







    // Set up vertical touch areas 
    for (NSUInteger row = 0; row < kRowCount-1; ++row) { 

     CGPoint vtouchareaPosition = CGPointMake(baseOrigin.x, row * (kDotGridSpacing.height) + baseOrigin.y + 0.5*(kDotGridSpacing.height)); 

     for (NSUInteger col = 0; col < kColCount; ++col) { 

      vtoucharea = [SKSpriteNode spriteNodeWithColor:[SKColor colorWithRed:1 green:0.478 blue:0.478 alpha:0.5] size:CGSizeMake(25,35)]; 
      vtoucharea.position = vtouchareaPosition; 
      NSString *vtouchareaName = [NSString stringWithFormat:@"vtoucharea_%d_%d", row, col]; 
      vtoucharea.name = vtouchareaName; 
      vtoucharea.userInteractionEnabled = YES; 
      [self addChild:vtoucharea]; 
      vtouchareaPosition.x += kDotGridSpacing.width; 


     } 

    } 








} 

return self; 
} 





-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
/* Called when a touch begins */ 



UITouch *touch = [touches anyObject]; 
CGPoint location = [touch locationInView:self.view]; 

if (CGRectContainsPoint(vtoucharea.frame, location)) { 
    NSLog(@"Hello");; 
} 
















} 

-(void)update:(CFTimeInterval)currentTime { 
/* Called before each frame is rendered */ 
} 

@end 

У меня возникли проблемы. Когда я касаюсь одного из спрайтов, я хочу что-то сделать (на данный момент это только вход в консоль). Почему мои прикосновения не распознаются?

+0

вставить код в touchesEnded: withEvent: – AndrewShmig

+0

@AndrewShmig Это Безразлично» t, похоже, сработало ... – benblanchard

+0

Вы должны установить userInteractionEnabled в YES, прежде чем пытаться поймать touch, например, в вашем методе init. –

ответ

1

Эта функция вызывается только тогда, когда вы используете userInteractionEnabled = YES, которую вы пытаетесь сделать внутри той же функции, поэтому ее никогда не вызовете. Поместите этот код в свой метод спрайта init.

+0

Я сделал настройку, которую вы предложили, но она все еще не работает. Есть идеи? – benblanchard

+0

Не возражаете ли вы изменить свой вопрос, включив в него весь код? –

+0

Сделали, спасибо – benblanchard

0

Я пробовал ваш код, и касания регистрируются просто отлично. Тем не менее, есть несколько других проблем в коде:

  • В ваших для петель в инициализации, вы устанавливаете только последний созданный узел вашим Ивар (точка, hTouchArea, vTouchArea). И позже, в touchesEnded -method, вы пытаетесь использовать этот ivar, чтобы определить, было ли касание внутри фрейма этого узла. Конечно, это не сработает, поскольку у вас есть только последний кеш-файл. (Я использовал другой подход здесь - см. Метод touchhesBegan)

  • Если вы хотите зарегистрировать штрихи только в узле сцены, вы должны отключить взаимодействие пользователя с другими добавленными вами узлами. В противном случае вы, другие узлы, заблокируете вашу сцену от касания. (используйте userInteractionEnabled = NO).

  • [touch locationInView: self.view] дает вам местоположение в представлении. Вместо этого вы хотите иметь место в самом узле. Вместо этого вы должны использовать [touch locationInNode: self].

Здесь я установил для вас код (я проверил это так, он должен работать):

#import "Test scene" 
#define kRowCount 8 
#define kColCount 6 
#define kDotGridSpacing CGSizeMake (50,-50) 

@implementation TestScene 

-(id)initWithSize:(CGSize)size 
{ 
    if (self = [super initWithSize:size]) 
    { 
     self.userInteractionEnabled = YES; 
     self.backgroundColor = [SKColor colorWithRed:0.957 green:0.957 blue:0.957 alpha:1]; 

     CGPoint baseOrigin = CGPointMake(35, 385); 
     for (NSUInteger row = 0; row < kRowCount; ++row) 
     { 
      CGPoint dotPosition = CGPointMake(baseOrigin.x, row * (kDotGridSpacing.height) + baseOrigin.y); 

      for (NSUInteger col = 0; col < kColCount; ++col) 
      { 
       SKSpriteNode* dot = [SKSpriteNode spriteNodeWithColor:[UIColor redColor] size:CGSizeMake(10, 10)]; 
       dot.position = dotPosition; 
       dot.name = [NSString stringWithFormat:@"dot_%d_%d", row, col]; 

       dotPosition.x += kDotGridSpacing.width; 

       [self addChild:dot]; 
       dot.userInteractionEnabled = NO; 
      } 
     } 

     for (NSUInteger row = 0; row < kRowCount; ++row) 
     { 
      CGPoint htouchareaPosition = CGPointMake(baseOrigin.x + 0.5*(kDotGridSpacing.width), row * (kDotGridSpacing.height) + baseOrigin.y); 

      for (NSUInteger col = 0; col < kColCount-1; ++col) 
      { 
       SKSpriteNode* htoucharea = [SKSpriteNode spriteNodeWithColor:[SKColor colorWithRed:0.18 green:0.702 blue:0.91 alpha:0.5] size:CGSizeMake(35,25)]; 
       htoucharea.position = htouchareaPosition; 
       NSString *htouchareaName = [NSString stringWithFormat:@"htoucharea_%d_%d", row, col]; 
       htoucharea.name = htouchareaName; 
       htoucharea.userInteractionEnabled = YES; 

       htouchareaPosition.x += kDotGridSpacing.width; 

       [self addChild:htoucharea]; 
       htoucharea.userInteractionEnabled = NO; 
      } 
     } 

     for (NSUInteger row = 0; row < kRowCount-1; ++row) 
     { 
      CGPoint vtouchareaPosition = CGPointMake(baseOrigin.x, row * (kDotGridSpacing.height) + baseOrigin.y + 0.5*(kDotGridSpacing.height)); 

      for (NSUInteger col = 0; col < kColCount; ++col) 
      { 
       SKSpriteNode* vtoucharea = [SKSpriteNode spriteNodeWithColor:[SKColor colorWithRed:1 green:0.478 blue:0.478 alpha:0.5] size:CGSizeMake(25,35)]; 
       vtoucharea.position = vtouchareaPosition; 
       vtoucharea.name = [NSString stringWithFormat:@"vtoucharea_%d_%d", row, col]; 
       vtoucharea.userInteractionEnabled = YES; 

       vtouchareaPosition.x += kDotGridSpacing.width; 

       [self addChild:vtoucharea]; 
       vtoucharea.userInteractionEnabled = NO; 
      } 
     } 
    } 

    return self; 
} 


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

    for (SKNode* node in [self nodesAtPoint:touchLocation]) 
    { 
     NSLog(@"Node was touched: %@", node.name); 
    } 
} 

@end 

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