Ios 精灵套件:锚点正在改变精灵的实际位置
请帮我把这个困惑弄清楚 从Sprite工具包编程指南: 精灵节点的“anchorPoint”属性决定了节点中的哪个点 框架位于精灵的位置 我的理解是,如果我更改锚点,精灵的位置应该保持不变,只有纹理渲染应该相应地移动 但是当我设置锚定点时,我的精灵的位置实际上改变了!请看以下片段:Ios 精灵套件:锚点正在改变精灵的实际位置,ios,sprite-kit,anchorpoint,Ios,Sprite Kit,Anchorpoint,请帮我把这个困惑弄清楚 从Sprite工具包编程指南: 精灵节点的“anchorPoint”属性决定了节点中的哪个点 框架位于精灵的位置 我的理解是,如果我更改锚点,精灵的位置应该保持不变,只有纹理渲染应该相应地移动 但是当我设置锚定点时,我的精灵的位置实际上改变了!请看以下片段: /* debug */ if (self.currentState == self.editState) { printf("B: relativeAnchorPoint = %.02f,%.02f ",
/* debug */
if (self.currentState == self.editState) {
printf("B: relativeAnchorPoint = %.02f,%.02f ", relativeAnchorPoint.x, relativeAnchorPoint.y);
printf("position = %.02f,%.02f\n",self.position.x, self.position.y);
}
[self setAnchorPoint:relativeAnchorPoint];
/* debug */
if (self.currentState == self.editState) {
printf("A: relativeAnchorPoint = %.02f,%.02f ", relativeAnchorPoint.x, relativeAnchorPoint.y);
printf("position = %.02f,%.02f\n",self.position.x, self.position.y);
}
输出:
A:relativeAnchorPoint=0.65,0.48位置=1532.00384.00
B:相对点=0.65,0.48位置=1583.00384.00
我错过了什么
提前谢谢
*编辑:其他信息:*
只有当我的精灵将xScale设置为-1以反转图像时,才会发生这种情况。我做了一个快速测试以确认您的观察结果,它确实是正确的 当xScale变为负值时,锚点实际上会影响节点的位置 我倾向于认为这是一个bug,因为负xScale和x位置的增加之间似乎没有相关性。这不能被认为是正常的行为 而且,只有在xScale已经为负值之后更改锚点时,才会发生这种情况。你们可以设置主播点,然后改变xScale,一切都会好的,位置不会改变 我确认这个问题在Xcode 5.1 iOS 7和Xcode 6 beta iOS 8 beta中都存在 如果在新创建的Sprite Kit项目中运行以下代码,而不是自动创建的MyScene.m文件,您将看到,当anchorPoint在0.0和1.0之间随机更改时,Sprite的位置始终保持不变,直到xScale属性更改为负值。在这一点上,位置x开始显著增加
#import "MyScene.h"
@implementation MyScene
{
SKSpriteNode *sprite;
}
-(id) initWithSize:(CGSize)size
{
if (self = [super initWithSize:size])
{
self.backgroundColor = [SKColor colorWithRed:0 green:0 blue:0.2 alpha:1];
sprite = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
sprite.position = CGPointMake(CGRectGetMidX(self.frame),
CGRectGetMidY(self.frame));
sprite.anchorPoint = CGPointMake(0.2, 0.7);
[self addChild:sprite];
SKAction *action = [SKAction scaleXTo:-1.0 duration:10];
[sprite runAction:[SKAction repeatActionForever:action]];
}
return self;
}
-(void) update:(CFTimeInterval)currentTime
{
sprite.anchorPoint = CGPointMake(arc4random_uniform(10000) / 10000.0,
arc4random_uniform(10000) / 10000.0);
NSLog(@"pos: {%.1f, %.1f}, xScale: %.3f, anchor: {%.2f, %.2f}",
sprite.position.x, sprite.position.y, sprite.xScale,
sprite.anchorPoint.x, sprite.anchorPoint.y);
}
@end
此错误有一个解决方法:
如果xScale已经为负,则将其反转,然后设置锚点,然后重新反转xScale。如果yScale也会变为负值,则可能需要对其执行相同的操作
以下更新方法包含此解决方法,我确认此方法按预期工作:
-(void) update:(CFTimeInterval)currentTime
{
BOOL didInvert = NO;
if (sprite.xScale < 0.0)
{
didInvert = YES;
sprite.xScale *= -1.0;
}
sprite.anchorPoint = CGPointMake(arc4random_uniform(10000) / 10000.0,
arc4random_uniform(10000) / 10000.0);
if (didInvert)
{
sprite.xScale *= -1.0;
}
NSLog(@"pos: {%.1f, %.1f}, xScale: %.3f, anchor: {%.2f, %.2f}",
sprite.position.x, sprite.position.y, sprite.xScale,
sprite.anchorPoint.x, sprite.anchorPoint.y);
}
sprite.position现在在整个scaleXTo操作持续时间内保持不变。精灵的位置是锚定点,因此当您更改锚定点时,它会移动。@Code Monkey这是一个误解,节点的位置就是它所在的位置,锚定点不应该更改节点的位置,它仅确定节点纹理的位置(相对于节点的位置)drawn@LearnCocos2D感谢您的澄清。也许最好避免将xScale设置为-1,而是使用预览应用程序工具>水平翻转来反转图像。@CodeMonkey,图像反转必须在运行中完成,因为我不想在我的代码中复制每个精灵的图像,这将是一个巨大的内存浪费……您忘记在第一个if语句中设置didInvert。@LearnCos2D,感谢您提供的解决技巧。有没有一种方法可以通知苹果公司这种想法?是的,在这里:一定要添加到这篇文章的链接,我认为这篇文章很好地解释了这个问题。