【问题标题】:Spritekit physicsBody with swift not applying impulseSpritekit PhysicsBody 快速不施加脉冲
【发布时间】:2014-09-25 13:39:42
【问题描述】:

当尝试对SKPhysicsBody 施加脉冲时,编写代码会强制输入一个问号,然后在使用该行时,它不会应用任何脉冲

 override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        player.physicsBody!.applyForce(CGVectorMake(0, 400))
    }

物理体是这样初始化的

player.physicsBody = SKPhysicsBody(rectangleOfSize: player.size, center: CGPoint(x: player.size.width / 2, y: player.size.height / 2))

请帮忙

【问题讨论】:

  • 你有没有尝试过更大的冲动,比如 4000 或 40000? physicsBody 是动态的?
  • 我建议您发布创建精灵的代码。到目前为止,您发布的代码没有任何问题。

标签: ios xcode swift sprite-kit


【解决方案1】:

我尝试了那个确切的代码,它运行良好。这可能是因为没有在正确的位置定义播放器。确保播放器未在函数 didMoveToView 中定义。如果是,则应在 SKScene 的括号之后定义。

class GameScene: SKScene {

let bird = SKSpriteNode(imageNamed: "sprite_1")

override func didMoveToView(view: SKView) {
    /* Setup your scene here */

    self.physicsWorld.gravity = CGVectorMake(0.0, -5.0)

    bird.xScale = 2; bird.yScale = 2
    bird.position = CGPoint(x: self.frame.size.width/2.75, y: self.frame.size.height/2)
    bird.physicsBody = SKPhysicsBody(rectangleOfSize: bird.size)
    self.addChild(bird)
}

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    /* Called when a touch begins */
    for touch: AnyObject in touches {
        bird.physicsBody?.applyImpulse(CGVectorMake(0, 100))
    }
}

看看在 didMoveToView 函数中没有声明播放器(对我来说是鸟)。

我在查找如何应用冲动时发现了此页面,因此您的帖子对我很有用。希望对你有帮助。

【讨论】:

  • 另外,我忘了问,你是不是遇到了错误,或者它根本不起作用?
  • 如果他在didMoveToView 中定义player 又有什么关系呢?我遇到了和他一样的问题
【解决方案2】:

您说您正在应用“impulse”,但您在此处应用“Force”,这在这种情况下不起作用。我知道这已经很长时间了,但对于那些来看看这个问题的解决方案的人来说,你可以将 Force 更改为 Impulse,它应该可以工作。 所以,

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    player.physicsBody!.applyImpulse(CGVectorMake(0, 400))
}

可能还有许多其他原因,例如您的播放器数量太大,在这种情况下您需要更多的冲动来移动它,或者“播放器”分配了错误的文件名。您将需要对其进行调试。

【讨论】: