Sprite Kit 停止脉冲

Sprite Kit stop Impulse

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

然而,这只会在触摸完成后增加CGFloat,或者达到最大值。我想在触摸期间增加CGFloat ,这意味着你触摸的时间越长,Jump/CGFloat。

问题可能出在冲动上,应用了就改不了。也就是说,'Player'得到20的冲量后,再触摸屏幕,Float可能会增加,但冲量不会增加。

如果您查看我当前的代码,触摸屏幕时脉冲设置为最大,但如果释放,则应删除该动作。然而,不管用,冲动不止。

我知道你可以在按下后将 body 的速度设置为一个值,如果按下结束时速度回到 0,它就会停止 'jump',但这看起来并不像一时冲动那样顺利。

有body解决办法吗?

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 */

}

尝试改变这个:

if(self.pressed){

    let HigherJump = SKAction.runBlock({if(self.force < Constants.maximumJumpForce){
        self.force += 2.0
    }else{
        self.force = Constants.maximumJumpForce
        }})
    self.runAction(HigherJump)
}

对此:

if(self.pressed){
    if(self.force < Constants.maximumJumpForce) {
         self.force += 2.0
    }
    else {
         self.force = Constants.maximumJumpForce
    }
}

这里不需要使用runBlock SKAction。

1.Create 来自 Xcode 模板的“游戏”基于 SpriteKit
2.Copy 将列出的代码粘贴到 GameScene class

import SpriteKit

class GameScene: SKScene, SKPhysicsContactDelegate {

    var location = CGPoint()
    var floorSize = CGSize()
    var floorColor = UIColor()
    var player = SKSpriteNode()

    override func didMoveToView(view: SKView) {

        view.showsFPS = true;
        view.showsNodeCount = true;
        view.showsDrawCount = true;

        self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
        self.physicsBody?.categoryBitMask = 1
        self.physicsBody?.contactTestBitMask = 1
        self.physicsWorld.gravity = CGVectorMake(0, 0)
        self.physicsWorld.contactDelegate = self;

        location = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))

        player = SKSpriteNode(imageNamed:"Spaceship")
        player.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 320, height: 320))
        player.physicsBody?.categoryBitMask = 1
        player.physicsBody?.collisionBitMask = 1
        player.physicsBody?.contactTestBitMask = 1
        player.physicsBody?.linearDamping = 0;
        player.xScale = 1
        player.yScale = 1
        player.position = location
        self.addChild(player)

    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.physicsWorld.gravity = CGVectorMake(0, 0)
        let direction = Float(1.5708)//Float(player.zRotation) + Float(M_PI_2)
        player.physicsBody?.applyForce(CGVector(dx: 150000*CGFloat(cosf(direction)), dy: 150000*CGFloat(sinf(direction))))
    }

    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.physicsWorld.gravity = CGVectorMake(0, -7.9)
    }

}

3.Run 应用程序

这应该为您提供 'Jump' 游戏的起点 :)