如何让精灵坐在移动的精灵上

Posted

技术标签:

【中文标题】如何让精灵坐在移动的精灵上【英文标题】:How to make sprite sit on a moving sprite 【发布时间】:2015-09-11 00:48:49 【问题描述】:

并与它一起旅行。我已经使红色盒子冲动地跳起来,当它落在正在移动的黑色块上时,红色盒子会停留在它掉落的地方,就像没有摩擦一样滑动移动的物体。在重力和摩擦力 1.0 的条件下,甚至尝试增加质量,但没有任何效果。请给我任何细节如何使它工作? 谢谢 覆盖函数 didMoveToView(视图:SKView) /* 在这里设置你的场景 */

    self.physicsWorld.gravity = CGVectorMake(0.0, -9.8)
    SquareOne.fillColor = UIColor.orangeColor()
    SquareOne.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
    SquareOne.physicsBody = SKPhysicsBody(rectangleOfSize: SquareOne.frame.size)
    SquareOne.physicsBody?.friction = 1.0
    SquareOne.physicsBody?.restitution = 0.0

    addChild(SquareOne)


    SquareTwo.fillColor = UIColor.greenColor()
    SquareTwo.position = CGPoint(x: self.frame.midX, y: self.frame.midY - 100)
    SquareTwo.physicsBody = SKPhysicsBody(rectangleOfSize: SquareTwo.frame.size)
    SquareTwo.physicsBody?.dynamic = false
    SquareTwo.physicsBody?.affectedByGravity = false
    SquareTwo.physicsBody?.friction = 1.0
    SquareTwo.physicsBody?.restitution = 0.0
    addChild(SquareTwo)



override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) 
    /* Called when a touch begins */

    for touch in (touches as! Set<UITouch>) 
        let location = touch.locationInNode(self)
        SquareTwo.runAction(SKAction.moveByX(-100, y: 0.0, duration: 3.0))
    

【问题讨论】:

如果只有红色和黑色两个块,这会更简单。红色受重力影响,黑色不受我的重力影响。在 touchesBegan 功能上,一旦我触摸黑色开始沿 x 方向移动。当它移动时,红色块滑倒。如何让它附着在黑色块上。 你的想法是对的。你只需要使用物理来移动黑色块。这是***.com/questions/31590885/… 【参考方案1】:

在物理模拟中,您应该应用速度和力以使模拟正常工作。使用SKAction 无法正确模拟物理。

首先需要使SquareTwo 动态化,以使其受到力的影响。使SquareTwo的质量变大,这样身体就不会受到其他SquareOne与之碰撞的影响。

SquareTwo.physicsBody?.dynamic = true
SquareTwo.physicsBody?.affectedByGravity = false
// Make the mass big so that the body is not affected by the other body colliding with it.
SquareTwo.physicsBody?.mass = 1000000

然后在touchesBegan 中,您可以将速度设置为SquareTwo

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) 
    /* Called when a touch begins */

    for touch in (touches as! Set<UITouch>) 
        let location = touch.locationInNode(self)
        SquareTwo.physicsBody?.velocity = CGVectorMake(-10, 0)
     

【讨论】:

感谢您的回答。有效。这是唯一的实现方式吗?【参考方案2】:

您可以删除红色块,然后将其作为子节点添加到移动块中:

var redBlockPosition = childNodeWithName("redBlockName")?.position //find where red block is in self
var movingBlockPosition = childNodeWithName("movingBlockName")?.position //find where moveing block is in self
var redBlockPositionFromMovingBlock = CGPointMake(redBlockPosition.x + movingBlockPosition.x, redBlockPosition.y - movingBlockPosition.y) //find where red block is from moving block's origin
childNodeWithName("redBlockName")?.removeFromParent() //remove red block
redBlock.position = redBlockPositionFromMovingBlock //change redBlock's position
childNodeWithName("movingBlockName")?.addChild(redBlock) //add red block as a child node of moving block

希望这会有所帮助,祝你好运。

【讨论】:

我无法移除红色块,因为它是主要块,它不断地从一个黑色块跳到另一个黑色块。所以我需要为每个移动的黑色块删除并添加红色块。我觉得这不是一种有效的方法。 尝试将摩擦力增加到最大,使块不能滑动。【参考方案3】:

试试redBox.physicsBody.allowsRotation = NO

一个布尔值,指示物理体是否受到影响 施加在其上的角力和冲量。

并在0.0到1.0之间调整redBox.physicsBody.restitution

物理体的弹性。

【讨论】:

@vaidhyanathan 如果您提供示例项目,我会看看。 我已经上传到谷歌驱动器drive.google.com/file/d/0BwsEelZ-x-VKbnJCeXc3ZXhsWDA/view请让我 @vaidhyanathan 嗯,我没听懂你的意思,所以我的代码没有帮助。但是您肯定会在 rakeshbs 的回答和 0x141E 的评论中找到一些有用的东西。祝你好运!【参考方案4】:

如果你有一个有持续时间的 skaction,它会保持对象移动直到持续时间结束,创建对象不会停留在另一个对象上。所以与其使用动作来移动对象,不如使用更新函数更新其位置,并使其在碰到块时停止移动。

【讨论】:

以上是关于如何让精灵坐在移动的精灵上的主要内容,如果未能解决你的问题,请参考以下文章

精灵图像的随机移动位置

如何旋转精灵和移动

玩家精灵在按住移动键时移动而无需输入

让精灵向各个方向移动

如何将新精灵附加到移动精灵?

如何使二维精灵在按键方向上以平滑的宽弧移动?