我正在用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];
如果我在没有关节的情况下运行代码,鱼将停留在鱼钩上并旋转。但是,一旦创建了关节并运行了动作,就不会调用上面的旋转动作(但会调用到钩子的移动)。
我一点也不知道为什么会发生这种情况。有谁有什么建议吗?
发布于 2013-11-13 19:02:52
我在这里说出来以供参考:
在具有物理实体的节点上使用移动或旋转操作的很可能会导致意外行为。
SKActions被物理行为所推翻--首先评估动作,然后模拟物理世界。
如果希望节点根据其物理身体进行行为,则必须通过应用力、脉冲或直接更改身体速度来移动和旋转身体。不能通过动作移动或旋转物理体。动作影响节点的方式与正文影响节点的方式相同,但显然您不希望这两个操作同时影响节点-其中一个必须优先。
您可以确保物理实体速度始终为零,并且物理实体永远不会经历任何碰撞反馈。然后你可以通过动作来移动它,但除了一些奇怪的场景(例如,暂时停用物理身体,将身体移回产卵位置或其他什么),这可能并不是很有用。
https://stackoverflow.com/questions/19959665
复制相似问题