#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
}
}