我已经阅读了无数关于锚点的帖子和文章及其对定位的影响,但我仍然发现自己处于完全没有意义的情况下。
示例:
@interface DisplayTest : CCSprite;
@property (nonatomic, strong) CCSprite *body;
@end
@implementation DisplayTest
-(instancetype)init {
if (self = [super initWithFile:@"test.png" rect:CGRectZero]) {
self.position = ccp(384, 512);
[self addChild:self.body];
self.body.scaleX = 384;
self.anchorPoint = ccp(0.5f, 0.5f);
}
return self;
}
-(CCSprite *)body {
if (!_body) {
CGRect rect = CGRectMake(1, 1, 1, 16);
_body = [[CCSprite alloc] initWithTexture:self.texture rect:rect];
_body.anchorPoint = ccp(0.5f, 0.5f);
}
return _body;
}
我得到一个384像素宽,16像素高的矩形,完全位于屏幕中心。
出色..
现在,让我们说我想对这个对象进行触摸检测。假设我要有很多其他的CCSprite孩子,我想在这个顶级对象上执行触摸检测,而不是在所有上面执行它孩子...
我不能这样做是因为:
(lldb) expr self.contentSize
(CGSize) $17 = (width = 0, height = 0)
好的,那么......没什么大不了的?
(lldb) expr self.contentSize = self.body.boundingBox.size
(CGSize) $19 = (width = 384, height = 16)
现在我的矩形离屏幕只有一半。什么??? WTF?为什么?!?!?!?!?!
现在要把它放回原处,我必须做以下其中一项:
self.anchorPoint = ccp(0.0, 0.0);
OR
self.position = ccp(384 + (self.contentSize.width/2), 512 + (self.contentSize.height / 2));
尽管将锚点设置为(0.0,0.0)通过将其放回屏幕中心来“修复”它,但是它使触摸检测完全不可能,因为当你调用convertToNodeSpace时,如果你触摸了在它左侧的精灵,值将为负,并且在矩形中找不到负值。请参阅我多年前写的这篇文章:touch detection of ccnode anchored so 0,0 is the center?
所以,为了完成这项工作,我不得不使用1/2的内容大小的偏移来定位事物,而老实说,我不明白为什么我必须这样做。锚点0.5,0.5应该意味着子精灵将相对于该位置(CENTERED)放置,假设子精灵也有一个0.5,0.5的锚点 - 在这种情况下确实如此。
有人可以向我解释一下吗?