Sprite Kit停止Impulse

Alb*_*ert 10 physics ios sprite-kit swift

我想CGFloat在屏幕点击时每次增加一次.浮点数具有设定的最大值和最小值.我试图通过这个建议:StackOverflow

但是,这只会在触摸后增加CGFloat,或达到最大值.我想触摸期间增加CGFloat ,这意味着你触摸的时间越长,Jump/CGFloat越高.

问题可能在于冲动,在应用之后你无法改变它.这意味着,在'玩家'获得20的冲动,并且屏幕被更长时间触摸后,浮动可能会增加,但冲动不会.

如果查看我当前的代码,触摸屏幕时脉冲设置为最大值,但如果释放,则应删除该操作.但是,它不起作用,冲动不会停止.

我知道你可以在按下之后将身体的速度设置为一个值,如果按下已经结束速度回到0,那么它会停止它'跳',但是看起来并不是很平滑有冲动.

有人有解决方案吗?

struct Constants {

static let minimumJumpForce:CGFloat = 20.0
static let maximumJumpForce:CGFloat = 60.0
}

class GameScene: SKScene, SKPhysicsContactDelegate {

var force: CGFloat = 20.0

func longPressed(longPress: UIGestureRecognizer) {

    if (longPress.state == UIGestureRecognizerState.Began) {

        println("Began")

        self.pressed = true

        let HigherJump = SKAction.runBlock({Player.physicsBody?.applyImpulse(CGVectorMake(0, Constants.maximumJumpForce))})

        self.runAction(HigherJump , withKey:"HighJump")

    }else if (longPress.state == UIGestureRecognizerState.Ended) {

        println("Ended")

        self.pressed = false

        self.removeActionForKey("HighJump")

    }

}

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)

    }
}

override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
    for touch in (touches as! Set<UITouch>) {
        let location = touch.locationInNode(self)

}
}

override func update(currentTime: CFTimeInterval) {
    /* Called before each frame is rendered */

}
Run Code Online (Sandbox Code Playgroud)

Ale*_*huk 3

1.基于SpriteKit从Xcode模板创建\xe2\x80\x98Game\xe2\x80\x99
\n2.将列出的代码复制粘贴到GameScene类

\n\n
import SpriteKit\n\nclass GameScene: SKScene, SKPhysicsContactDelegate {\n\n    var location = CGPoint()\n    var floorSize = CGSize()\n    var floorColor = UIColor()\n    var player = SKSpriteNode()\n\n    override func didMoveToView(view: SKView) {\n\n        view.showsFPS = true;\n        view.showsNodeCount = true;\n        view.showsDrawCount = true;\n\n        self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)\n        self.physicsBody?.categoryBitMask = 1\n        self.physicsBody?.contactTestBitMask = 1\n        self.physicsWorld.gravity = CGVectorMake(0, 0)\n        self.physicsWorld.contactDelegate = self;\n\n        location = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))\n\n        player = SKSpriteNode(imageNamed:"Spaceship")\n        player.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 320, height: 320))\n        player.physicsBody?.categoryBitMask = 1\n        player.physicsBody?.collisionBitMask = 1\n        player.physicsBody?.contactTestBitMask = 1\n        player.physicsBody?.linearDamping = 0;\n        player.xScale = 1\n        player.yScale = 1\n        player.position = location\n        self.addChild(player)\n\n    }\n\n    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {\n        self.physicsWorld.gravity = CGVectorMake(0, 0)\n        let direction = Float(1.5708)//Float(player.zRotation) + Float(M_PI_2)\n        player.physicsBody?.applyForce(CGVector(dx: 150000*CGFloat(cosf(direction)), dy: 150000*CGFloat(sinf(direction))))\n    }\n\n    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {\n        self.physicsWorld.gravity = CGVectorMake(0, -7.9)\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

3.运行应用程序

\n\n

这应该为您的“跳跃”游戏提供起点:)

\n