1

我正在使用 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];

如果我在没有关节的情况下运行代码,鱼会留在钩子上并旋转。但是,一旦创建了关节并运行了动作,就不会调用来自上方的旋转动作(尽管会移动到钩子)。

我一点也不知道为什么会发生这种情况。有人有任何指示吗?

4

1 回答 1

2

我在这里说出来供参考:

在具有物理主体的节点上使用移动或旋转动作很可能会导致意外行为。

SKActions 被物理行为推翻——首先评估动作,然后模拟物理世界。

如果您希望节点根据其物理实体运行,您必须通过施加力、脉冲或直接改变实体的速度来移动和旋转实体。您不能通过动作移动或旋转物理体。动作影响节点的方式与主体影响节点的方式相同,但显然您不希望两者同时影响节点 - 必须优先考虑。

您可以确保物理体速度始终为零,并且物理体永远不会遇到任何碰撞反馈。然后你可以用动作来移动它,但除了一些奇怪的场景(即暂时停用物理体以将身体移回生成位置或其他东西)可能不是很有用。

于 2013-11-13T19:02:52.053 回答