nodeAtPoint:
не дава същия резултат, ако използвате SKShapeNode
и SKSpriteNode
. Ако съм прав, nodeAtPoint:
ще използва containsPoint:
, за да провери кои възли са в дадената точка.
docu заявява, че containsPoint:
ще използва своята ограничаваща рамка.
Настроих проста сцена, където в ситуация 1 кръгът е родител на лилавия възел, а в ситуация 2 зеленият възел е родител на лилавия възел. Щракнах и в двата случая в област, където трябва да бъде ограничителната рамка на родителя.
Резултатът е различен. Ако използвам SKSpriteNode
, nodeAtPoint:
ще ми даде родителя. Ако използвам SKShapeNode
, той връща SKScene
.
(Кръстът маркира мястото, където натиснах с мишката.)
Кодът:
Първа настройка:
-(void)didMoveToView:(SKView *)view {
self.name = @"Scene";
SKShapeNode* circle = [SKShapeNode node];
circle.path = CGPathCreateWithEllipseInRect(CGRectMake(0, 0, 50, 50), nil);
circle.position = CGPointMake(20, 20);
circle.fillColor = [SKColor redColor];
circle.name = @"circle";
SKSpriteNode* pnode = [SKSpriteNode node];
pnode.size = CGSizeMake(50, 50);
pnode.position = CGPointMake(50, 50);
pnode.color = [SKColor purpleColor];
pnode.name = @"pnode";
[self addChild: circle];
[circle addChild: pnode];
}
Втора настройка:
-(void)didMoveToView:(SKView *)view {
self.name = @"Scene";
SKSpriteNode* gnode = [SKSpriteNode node];
gnode.size = CGSizeMake(50, 50);
gnode.position = CGPointMake(30, 30);
gnode.color = [SKColor greenColor];
gnode.name = @"gnode";
SKSpriteNode* pnode = [SKSpriteNode node];
pnode.size = CGSizeMake(50, 50);
pnode.position = CGPointMake(30, 30);
pnode.color = [SKColor purpleColor];
pnode.name = @"pnode";
[self addChild: gnode];
[gnode addChild: pnode];
}
Обаждане при щракване на мишката:
-(void)mouseDown:(NSEvent *)theEvent {
CGPoint location = [theEvent locationInNode:self];
NSLog(@"%@", [self nodeAtPoint: location].name);
}
Пропуснах ли нещо? Дали това е грешка в SpriteKit? Предназначено ли е да работи по този начин?