加入后奇怪的 SKPhysicsWorld 行为

Posted

技术标签:

【中文标题】加入后奇怪的 SKPhysicsWorld 行为【英文标题】:strange SKPhysicsWorld behavior after a join 【发布时间】:2013-11-13 16:51:02 【问题描述】:

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

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

我完全不知道为什么会发生这种情况。有没有人指点一下?

【问题讨论】:

【参考方案1】:

这里说出来供参考:

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

SKAction 被物理行为推翻 - 首先评估操作,然后模拟物理世界。

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

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

【讨论】:

谢谢,有帮助。我对此还是很陌生-我将如何施加力来旋转物理体?你能举个例子吗? 最简单的方法是改变身体的速度属性。否则使用 applyForce 或 applyImpulse developer.apple.com/library/ios/documentation/SpriteKit/… 基本三角函数会有所帮助。我敢肯定,SO 或网络上有很多例子。 ;) 还有一点值得一提的是,如果 allowRotation 设置为 false,SKPhysicsJointFixed 似乎无法正常工作(如***.com/questions/45174110/… 中所述)

以上是关于加入后奇怪的 SKPhysicsWorld 行为的主要内容,如果未能解决你的问题,请参考以下文章

iOS -- SKPhysicsWorld类

p:treenode 与 DefaultTreeNode 子类的奇怪行为

JSF p:dataTable 的奇怪行为(p:columns 中的第一个条目错误)

放置新的奇怪行为[重复]

在 Sprite Kit 中暂停 SKPhysicsWorld

malloc() 的奇怪行为