SKShapeNode职位问题

时间:2015-11-14 15:30:55

标签: ios iphone sprite-kit position skshapenode

我添加了几个节点,如下所示:

SKShapeNode* node= [SKShapeNode shapeNodeWithRectOfSize:rect.size];  // always 32x32
node.fillColor= [UIColor darkGrayColor];
node.strokeColor= [UIColor lightGrayColor];
node.position= position;
node.physicsBody= [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(rect.size.width - 2.0, rect.size.height - 2.0)];
node.physicsBody.categoryBitMask= catSomeNode;
node.physicsBody.contactTestBitMask= catSomeOtherNode;
node.physicsBody.dynamic= YES;
node.physicsBody.usesPreciseCollisionDetection= YES;
node.physicsBody.affectedByGravity= NO;
node.physicsBody.collisionBitMask= 0;

[self addChild:node];

NSLog(@"Adding node at position %@", NSStringFromCGPoint(node.position));

e.g。对于第一个形状:

2015-11-14 16:17:25.162 MyApp[13479:632495] Adding node at position {16, 16}

稍后,我会尝试在触摸时为其设置动画。要确定动画的方向,我需要找出节点的位置。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
   UITouch* touch = [touches anyObject];
   CGPoint location = [touch locationInNode:self];

   SKNode* node = [self nodeAtPoint:location];

   if (!(node.physicsBody.categoryBitMask & catSomeNode))
      return;

   if ([node isKindOfClass:[SKShapeNode class]])
   {
      // Here, the position is different
   }
}

根据调试器更改的位置是:

(lldb) p position
(CGPoint) $0 = (x = 15.999996185302734, y = 15.999996185302734)

这会弄乱我的逻辑,因为我无法轻易比较位置。

2个问题:

1)定位

是否正确,定位始终基于节点中心,与例如UIView?这意味着当我想将节点放在0/0时,我必须将位置设置为width / 2 / height / 2,对吧? 这感觉有点麻烦,但是,我可以使用它。

2)触摸检测

正如您在我的示例中所看到的,砖的位置已经改变。这是为什么?在[self addChild:node];之后,该位置将保持在16/16,但在触摸检测之后,它将更改为15.999996185302734 / 15.999996185302734。

什么错了?我甚至将节点的指针保存为类成员,以检查位置(如果nodeAtPoint返回不同的对象)。但这个立场仍然搞砸了。

[编辑]做了一些更多的测试。我将指针保存到我班级上面添加的SKShapeNode,然后在场景的update:方法中输入调试信息,打印出节点的位置。这就是:

2015-11-14 18:39:07.560 MyApp[14414:696141] Node position {16, 16}
2015-11-14 18:39:07.701 MyApp[14414:696141] Node position {15.999999046325684, 15.999999046325684}
2015-11-14 18:39:07.866 MyApp[14414:696141] Node position {15.999998092651367, 15.999998092651367}
2015-11-14 18:39:07.951 MyApp[14414:696141] Node position {15.999997138977051, 15.999997138977051}
2015-11-14 18:39:08.019 MyApp[14414:696141] Node position {15.999996185302734, 15.999996185302734}

第一个update:和第二个- (void)didMoveToView:(SKView *)view之间没有执行代码。我也没有点击,所以没有进行触摸检测。

这让我相信我有一些初始化问题,因此一旦加载应用程序或场景变得可见,场景就会有所改变。我以为我已经覆盖了这个,因为节点是在$( '#lock-refresh' ).click(function() { $( this ).addClass( 'fa-spin' ); var $el = $(this); setTimeout(function() { $el.removeClass( 'fa-spin' ); }, 1000); startup(); // Whatever here. }); 方法中添加的。

0 个答案:

没有答案