【问题标题】:SKAction scaleXTo:-1SKAction scaleXTo:-1
【发布时间】:2014-03-28 01:56:36
【问题描述】:

我正在尝试使用SKAction *mirrorDirection = [SKAction scaleXTo:-1 y:1 duration:0.0]; 镜像我的 SKSpriteNode,但每次我这样做时,精灵的物理主体似乎都搞砸了,它从屏幕上掉了下来。我在精灵下面有几个物体(地板),它穿过所有物体,就好像它们不存在一样。

这只发生在我镜像精灵时。有谁知道如何解决这个问题?

更新: 不幸的是,按照建议的一个答案重置物理体并不能解决问题。似乎只有物理体的接触部分出现故障。当小家伙像石头一样下落时,重力仍然会产生影响。

我也尝试过再次重置self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(self.size.width, self.size.height)];

就在self.xScale = -1; 之后,但这也没有解决问题。

【问题讨论】:

  • 您是否尝试过将镜像节点添加为常规 SKNode 的子节点,并将物理体设置在 SKNode 而不是负缩放节点上?

标签: ios sprite-kit skspritenode skphysicsbody


【解决方案1】:

将您的可镜像节点添加为某个常规 SKNode 的子节点,并将物理体设置在该父节点上,而不是负缩放节点。

【讨论】:

  • 我做了一个测试项目,这个方法似乎有效。尽管编码是一件乏味的事情。希望苹果能在未来的更新中解决这个问题。感谢您的帮助和建议!
【解决方案2】:

我不知道如何解决这个问题,但我想建议一种创建镜像精灵的方法。

要实现这一点,请将精灵节点的 x 或 y 比例设置为 -1。然后使用 SKView 方法 textureFromNode: 从这个镜像节点创建纹理。

然后您可以使用此纹理创建一个新的 sprite 节点,该节点被镜像但不需要任何负缩放。

【讨论】:

  • 这个选项可能适用于简单的精灵,但我预装了一堆动画......走路,跑步,跳跃等......不幸的是,创建新精灵会导致游戏流程明显延迟。
  • 您是否担心纹理的生成导致延迟或只是在动画中失去位置而导致跳跃?我建议在加载序列期间进行任何纹理生成并重用此纹理,这应该可以缓解第一个问题。
【解决方案3】:

不要使用 SKAction,只需将其直接设置为 SKSpriteNode 的 xScale 属性即可。

self.yourSprite.xScale = -1;

【讨论】:

  • 尝试了您的建议,但不幸的是,小家伙仍然像石头一样掉下来。
【解决方案4】:

Roecrew 关于直接设置 xScale 属性是正确的。我建议你试试这个:

node.xScale = -1;
node.physicsBody = node.physicsBody;

每次更改 xScale 属性时,您都需要“重置”physicsBody。

physicsBody 的 xScale 问题是 SpriteKit 中的一个错误,但我能够使用第二行“保留”physicsBody。

【讨论】:

  • 还尝试了物理体重置的建议,但没有任何乐趣。
  • physicsBody 必须至少正常初始化一次才能正常工作。
  • 正如我所说,一切正常,没有任何问题。一旦我镜像精灵,问题就开始了。
  • @sangony 你在做平台游戏吗?如果是这样,您是否考虑过使用 tmx 映射?
  • 我正在使用 Tiled 应用。
【解决方案5】:

我遇到的问题和你的一模一样。我花了大约 2 个小时才弄明白。

在你 scaleX 后初始化你的物理体,我不知道为什么,但我通过这种方式纠正了这个问题。

walkRight   = [SKAction sequence:@[resetDirection,[SKAction runBlock:^{
            [self changePhysicsDirectionRight];
        }],[SKAction repeatActionForever: walk]]];
walkLeft   = [SKAction sequence:@[mirrorDirection,[SKAction runBlock:^{
            [self changePhysicsDirectionLeft];
        }],[SKAction repeatActionForever: walk]]];

walkRight 和 walkLeft 是我改变方向时的动作,resetDirection 和 mirrorDirection 正是我用来 scaleXTo:1 和 scaleXTo:1 的动作

所以在我 scaleXTo 之后,我使用一个方法调用 changePhysicsDirectionRight 来重新初始化我的 physicBody

- (void)changePhysicsDirectionRight{
    self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(self.size.width,self.size.height)];
    self.physicsBody.categoryBitMask = guyCategory;
    self.physicsBody.contactTestBitMask = 0;
    self.physicsBody.collisionBitMask   = 0;
}

记得重新分配你所有的类别和你之前初始化的所有东西。

希望spritekit的专业人士能告诉我原因....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-05
    • 2014-07-01
    • 2013-10-10
    • 1970-01-01
    • 2020-10-18
    • 2014-04-30
    • 2014-01-06
    • 1970-01-01
    相关资源
    最近更新 更多