2014-02-20 4 views
0

Я в основном ищу, чтобы выполнить действие, как только коснется космос. Это мой код до сих пор, но в настоящее время он, похоже, не выполняет функцию, которая мне нужна. Может ли кто-нибудь заметить что-нибудь? СпасибоSpriteKit - CGRects, Sprites, Touch - Ничего не работает до сих пор

NB: код устанавливает решетку точек с прямоугольными спрайтами между точками, которые должны представлять области касания. то есть когда затрагивается одна из сенсорных областей и выполняется действие. Если мое объяснение того, что это выглядит как плохое, пожалуйста, обратитесь к следующему:

http://cl.ly/image/1W1e263B2b08/Screen%20Shot%202014-02-20%20at%2020.43.17.png

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

@implementation BBMyScene 

@synthesize dot; 
@synthesize htoucharea; 
@synthesize vtoucharea; 




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

-(CGRect)getSpriteRect:(SKNode *)inSprite 
{ 
CGRect sprRect = CGRectMake(htoucharea.position.x, htoucharea.position.y, 35, 25); 


return sprRect; 
} 





- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
// get the touch 
UITouch *touch = [touches anyObject]; 

// get the location of the touch in the main view of the view controller 
CGPoint touchPoint = [touch locationInView:self.view]; 

CGRect hRect = [self getSpriteRect:htoucharea]; 


if (CGRectContainsPoint(hRect, touchPoint)) 
{ 
    NSLog(@"Hello"); 
} 

} 

ответ

0

Вашего указатель htoucharea будет только указать последний час спрайт вы сделали. Этот код может работать над одним спрайтом. Не уверен, не проверив его. Вы можете поместить все ваши спрайты в массив и протестировать их прямо против точки касания, или вы можете подкласс спрайтов и иметь каждый отчет, если они были затронуты.

Метод массива, вероятно, легче понять. Когда вы создаете каждый спрайт, добавьте его в свойство изменяемого массива. Тогда вы попросите их протестировать.

+0

Спасибо за ваш быстрый ответ и ответ! – benblanchard

0

Лично я принял во внимание тот факт, что SKSpriteNode является потомком UIResponder и имеют спрайты сами регистрируют прикосновение через touchesBegan: withEvent: Я реализовал все это с рисунком делегата, где сцена выступает в качестве делегатов спрайтов. Тогда в моей спрайтов подкласса Я просто:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    [self.delegate touchesBeganOnSprite:self]; 
} 

тогда в моей сцене я могу:

- (void)touchesBeganOnSprite:(SKSpriteNode *)sprite{ 
    // do whatever I like with the sprite... 
} 

Конечно, вы можете использовать touchesBegan:withEvent: без использования шаблона делегата, а также. Либо используя уведомления, либо выполнив вызовы селектора/метода в свойстве scene узла. (Я лично считаю, что шаблон делегата - это путь к успеху).

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