我正在使用SKSpriteKit制作钓鱼游戏。我有一个用于钩子的精灵节点,对于一些鱼(我为此扩展了SKSpriteNode类)。 理想情况下,当鱼被钩在钩子上时的行为是鱼嘴将移动到钩子的尖端(使用动作来做到这一点):
CGPoint hp = CGPointMake(self.hook.frame.size.width/2, 0);
CGPoint hookPoint = [self.scene convertPoint:hp fromNode:self.hook];
SKAction *moveAction = [SKAction moveTo:hookPoint duration:.1];
然后鱼会向下旋转一下以模拟悬挂在钩子上(另一个动作:)
SKAction * flip = [SKAction rotateToAngle:M_PI_4 duration:.1 ];
我认为这样运行:
[fish runAction:[SKAction sequence:@[moveAction, flip]]];
这或多或少有效(根据鱼的方向制作扭结)
我后来要做的是在鱼和钩子之间创建一个关节,所以如果我移动钩子并且它已经捕到了鱼,那么鱼就会跟着它。
我这样做:
SKPhysicsJointFixed *joint =
[SKPhysicsJointFixed jointWithBodyA:self.hook.physicsBody
bodyB:fish.physicsBody
anchor:hookPoint];
SKAction *createJoint = [SKAction runBlock:^{
[self.physicsWorld addJoint:joint];}];
[self.scene runAction:createJoint];
如果我在没有关节的情况下运行代码,鱼将停留在钩子上并旋转。然而,一旦关节被创建并且动作运行,从上面的旋转动作不会被调用(但是移动到钩子的确是这样)。
我对于为什么会发生这种情况一无所知。任何人有任何指针?
答案 0 :(得分:2)
我在这里说它是为了参考:
在具有物理主体的节点上使用移动或旋转操作很可能会导致意外行为。
物理行为推翻了SKActions - 首先评估行动,然后模拟物理世界。
如果您希望节点根据其物理体运行,则必须通过施加力,脉冲或直接改变身体的速度来移动和旋转身体。您无法通过动作移动或旋转物理主体。操作以与主体影响节点相同的方式影响节点,但显然您不希望两者同时影响节点 - 必须优先考虑节点。
您可以确保物理体速度始终为零,物理机体从不会遇到任何碰撞反馈。然后你可以用动作移动它,但除了一些奇怪的场景(即暂时停用物理体以将身体移回生成位置或其他东西),这可能不是很有用。