如何让精灵坐在移动的精灵上
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,它会保持对象移动直到持续时间结束,创建对象不会停留在另一个对象上。所以与其使用动作来移动对象,不如使用更新函数更新其位置,并使其在碰到块时停止移动。
【讨论】:
以上是关于如何让精灵坐在移动的精灵上的主要内容,如果未能解决你的问题,请参考以下文章