请帮助我解决这个困惑。
从Sprite Kit编程指南:
精灵节点的anchorPoint属性确定中的哪个点 框架位于精灵的位置。
我对此的理解是,如果我改变锚点,精灵的位置应保持不变,只应相应地移动纹理渲染。
但是当我设置锚点时,我的精灵位置实际上发生了变化!看一下这个片段:
/* 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 position = 1532.00,384.00
B:relativeAnchorPoint = 0.65,0.48 position = 1583.00,384.00
我错过了什么?
提前致谢
*编辑:其他信息:* 它只发生在我的精灵将xScale设置为-1以反转图像
时答案 0 :(得分:0)
我做了一个快速测试以确认你的观察,这确实是正确的。
当xScale变为负值时,anchorPoint实际上会影响节点的位置。
我倾向于将此视为错误,因为负xScale与x位置的增加之间似乎没有相关性。并且它不能被视为正常行为。
此选项仅在xScale已经为负数后更改anchorPoint时发生。您可以设置anchorPoint,然后根据需要更改xScale,一切都会正常,位置不会改变。
我确认Xcode 5.1(iOS 7)和Xcode 6 beta(iOS 8 beta)都存在此问题。
如果在新创建的Sprite Kit项目中运行以下代码来代替其自动创建的MyScene.m文件,您将看到当anchorPoint在0.0和1.0之间随机变化时,精灵的位置始终保持不变,直到xScale属性更改为负值。此时,position.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已经为负,则将其反转,然后设置anchorPoint,然后重新反转xScale。如果yScale也可能变为负数,您可能需要对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动作持续时间内保持不变。