Как определить, задевается ли спрайт?

#ios #sprite-kit

#iOS #sprite-kit

Вопрос:

Я пытаюсь выяснить, как узнать, прикасается ли пользователь к спрайту.

Я упростил свой код до минимума, при инициализации я создаю один спрайт под названием «кнопка», а затем пытаюсь узнать, когда пользователь прикасается к нему / прекращает прикасаться.

Это то, что я пытаюсь сейчас:

 -(id)initWithSize:(CGSize)size {    
    if (self = [super initWithSize:size]) {
        self.backgroundColor = [SKColor colorWithRed:0 green:0 blue:0 alpha:1.0];

        // Add button
        SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"button"];
        sprite.name = @"button";
        sprite.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
        [self addChild:sprite];
    }
    return self;
}

-(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:@"button"]) {
        NSLog(@"Started touch on sprite");
    }
}

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

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

Комментарии:

1. touchesEnded там все будет в порядке. Похоже, вы нашли решение, и оно лучше моего. Опубликуйте это как ответ на свой вопрос, и я удалю свой.

Ответ №1:

Добавить в свойства: (позволяет получить к ним доступ различными способами)

 @property (nonatomic) BOOL touchInSprite;
@property (nonatomic) SKSpriteNode * sprite;
@end
  

Добавить методы:

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

    if ([self.sprite containsPoint: location])                
        self.touchInSprite = true;      
    else
        self.touchInSprite = false;
}

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

    if ([self.sprite containsPoint: location]) 
    {               
        self.touchInSprite = true;  
    }    
    else
    {
        self.touchInSprite = false;
        //user stop touches it
    }
}

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

    if (self.startTouchValid == true)                
    {
    //Perform action
    }    
}
  

Ответ №2:

Вы также можете использовать фрейм узла следующим образом:

 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint touchLocation = [touch locationInNode:self.scene];
    if (CGRectContainsPoint(sprite.frame, touchLocation))
    {
        // do something
    }
}