【问题标题】:merge two sprite nodes in sprite kit合并精灵套件中的两个精灵节点
【发布时间】:2014-07-27 23:35:23
【问题描述】:

我正在设计一个精灵工具包游戏,我想将两个精灵节点(矩形形状)合并在一起,然后将它们作为一个精灵节点进行操作和移动?

我搜索了很多,但没有找到结果

在精灵套件中可以吗?我该怎么做?

感谢您的帮助,谢谢

【问题讨论】:

  • 创建一个 SKNode,然后使用 addChild 将两个精灵添加到节点。
  • 感谢您的回答,但是我如何在父级上运行 SKAction,假设我定义了 SKNode *blocks;我将两个块添加到同一个父级 [blocks addChild: firstBlock]; [块 addChild: secondBlock];当我将 SKAction 应用于父级时:[blocks runAction moveOneStep];什么都没有动!!两个块不应该移动吗?那么问题出在哪里?
  • moveOneStep 是如何定义的?

标签: objective-c sprite-kit


【解决方案1】:

添加一个节点作为另一个节点的子节点。如果您将其设置为node2.physicsbody.dynamic=NO;,它将作为单个节点移动。会有单独的物理体,但您可以将它们设置为相同的类别位掩码。

此处链接的答案可能对符号有所帮助:How to detect contact on different areas of a physicsbody

【讨论】:

  • 感谢您的回答,但是我如何在父级上运行 SKAction,假设我定义了 SKNode *blocks;我将两个块添加到同一个父级 [blocks addChild: firstBlock]; [块 addChild: secondBlock];当我将 SKAction 应用于父级时:[blocks runAction moveOneStep];什么都没有动!!两个块不应该移动吗?那么问题出在哪里?
  • 我有来自我链接工作的答案的代码。您的 *blocks 节点是否在没有将两个块添加为子块的情况下移动?我不确定这是否有帮助,但也许可以尝试使用 spritenodes,而不仅仅是节点。
  • 你看过 SKPhysicsJoint 吗?如果您使用 SKPhysicsJointFixed,您可以将两个物理体连接在一起,当您移动一个时,另一个将跟随。其他一切都可以使用各种属性进行编辑。 developer.apple.com/library/prerelease/ios/documentation/…
【解决方案2】:

如果你有两个精灵节点,你只需这样做:

[firstSprite addChild:secondSprite]

【讨论】:

  • 感谢您的回答,但是我如何在父级上运行 SKAction,假设我定义了 SKNode *blocks;我将两个块添加到同一个父级 [blocks addChild: firstBlock]; [块 addChild: secondBlock];当我将 SKAction 应用于父级时:[blocks runAction moveOneStep];什么都没动!!两个块不应该移动吗?那么问题出在哪里?
  • 另外,你应该开始一个新问题,因为这个问题根本没有提到 SKAction。如果您使用物理,则存在一些潜在问题。但是,如果您不完全解释并发布相关代码,我们如何提供帮助?
  • 谢谢,我会将 Xcode 项目的链接添加到新问题
  • 谢谢你,新问题与 Xcode 项目的链接:stackoverflow.com/questions/25088617/merge-two-sprite-nodes
【解决方案3】:

这是我使用 SpriteKit (Swift) 实现您所寻找的答案

  • 首先将物理应用到您的场景中

例子:

self.physicsWorld.gravity = CGVectorMake(0, -9.8)
physicsWorld.contactDelegate = self
let sceneBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
        sceneBody.friction = 1
        self.physicsBody = sceneBody
        self.physicsBody?.categoryBitMask = PhysicsCategory.Boarder
        self.physicsBody?.contactTestBitMask = PhysicsCategory.None
        self.physicsBody?.collisionBitMask = PhysicsCategory.Item
  • 其次,将物理应用到要连接在一起的两个 skspritenode 上

例子

func mySpritetie1() {
        spritetie1 = SKSpriteNode(imageNamed: "img1")
        spritetie1.name = kAnimalNodeName
        spritetie1.position  = CGPoint(x: 170, y: 35)
        spritetie1.size = CGSizeMake(36, 100)
        spritetie1.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(22, 100))
        spritetie1.physicsBody?.affectedByGravity = false
        spritetie1.physicsBody?.categoryBitMask = PhysicsCategory.Item
        spritetie1.physicsBody?.collisionBitMask = PhysicsCategory.Boarder
        spritetie1.physicsBody?.contactTestBitMask = PhysicsCategory.Monster
        self.addChild(spritetie1)
    }


    func mySpritetie2() {
        spritetie2 = SKSpriteNode(imageNamed: "img2")
        spritetie2.name = kAnimalNodeName
        spritetie2.position  = CGPoint(x: 250, y: 60)
        spritetie2.size = CGSizeMake(90, 79)

        spritetie2.physicsBody = SKPhysicsBody(circleOfRadius: 25)
        spritetie2.physicsBody?.affectedByGravity = false
        spritetie2.physicsBody?.categoryBitMask = PhysicsCategory.Item
        spritetie2.physicsBody?.collisionBitMask = PhysicsCategory.Boarder
        spritetie2.physicsBody?.contactTestBitMask = PhysicsCategory.Monster
        self.addChild(spritetie2)
    }
  • 第三,现在加入他们

例子

let joint  = SKPhysicsJointFixed.jointWithBodyA(spritetie1.physicsBody!, bodyB: spritetie2.physicsBody!,
                    anchor: CGPointMake(CGRectGetMidX(spritetie1.frame), CGRectGetMinY(spritetie2.frame)))

self.physicsWorld.addJoint(joint)

这将在您给定的锚点处连接两个主体。

现在您可以使用 SKAction 为其中任何一个(spritetie1 或 spritetie2)设置动画,而另一个将设置动画,就好像它们是在您定义的锚点处连接的一样。

如果您觉得此答案有帮助,请批准。希望它会帮助那里的人。

请使用这两个链接了解我的代码中的所有内容:

https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Physics/Physics.html

一个非常基础和很好的学习模拟物理的教程https://www.youtube.com/playlist?list=PLa41xEuH5n_pwuNm7Z3L5qxDhVE0sOEqb

谢谢

【讨论】: