编辑:您好!(忘了打个招呼...)
我有一个非常烦人的问题。
我创建了一个小程序,到目前为止效果很好。但是,每当徘徊在另一个SKSpritenode上时,我都试图更改SKSpritenode纹理。为了测试实现,我添加了一个NSLOG()以打印悬停的节点来源。这样可行。但是,纹理变化仅在悬停在最后一个Itereat的节点上时起作用。复杂的。这是一些代码:
-(void)checkAimingHover{
for (SKSpriteNode *childSprite in [parentNode children]) {
CGRect boundingBox =
CGRectMake(childSprite.position.x-childSprite.size.width/2,
childSprite.position.y-childSprite.size.height/2,
childSprite.frame.size.width,
childSprite.frame.size.height);
if (CGRectContainsPoint(boundingBox, aiming.position)) {
// THIS works like a charm
NSLog(@"%f/%f",boundingBox.origin.x, boundingBox.origin.y);
// THIS only works on the last created boundingBox
[aiming setTexture:[SKTexture textureWithImageNamed:@"aim_hover"]];
} else [aiming setTexture:aimDefault];
}
}
AMING:SKSPRITENODE *AIMING;
和小更新():
-(void)update:(NSTimeInterval)currentTime {
if (lastUpdateTime) {
deltaTime = currentTime - lastUpdateTime;
} else {
deltaTime = 0;
}
lastUpdateTime = currentTime;
[self checkAimingHover];
}
您在每个循环上重置纹理。改用此方法:
BOOL hitTestDidHit = NO;
for (SKSpriteNode *childSprite in [parentNode children]) {
CGRect boundingBox =
CGRectMake(childSprite.position.x-childSprite.size.width/2,
childSprite.position.y-childSprite.size.height/2,
childSprite.frame.size.width,
childSprite.frame.size.height);
if (CGRectContainsPoint(boundingBox, aiming.position)) {
// THIS works like a charm
NSLog(@"%f/%f",boundingBox.origin.x, boundingBox.origin.y);
// THIS only works on the last created boundingBox
hitTestDidHit = YES;
}
}
if(hitTestDidHit) {
[aiming setTexture:[SKTexture textureWithImageNamed:@"aim_hover"]];
} else {
[aiming setTexture:aimDefault];
}
我也应该告诉您有关超级酷的.calculatecumulatulyframe属性,该属性几乎可以完成您的边界框,但与孩子一起做。