我添加了几个节点,如下所示:
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.
});
方法中添加的。