Комплект Sprite Kit Импульс

Я хочу увеличивать CGFloat каждый раз, пока экран прослушивается. Поплавок имеет заданное максимальное и минимальное значение. Я попытался выполнить это предложение: qaru.site/info/384184/...

Однако это только увеличивает CGFloat после того, как сделан сенсор или достигнут максимум. Я хочу увеличить CGFloat во время прикосновением, что означает, что чем дольше вы будете касаться выше Jump/CGFloat.

Проблема, вероятно, лежит в импульсе, который вы не можете изменить после применения. Это означает, что после того, как "Игрок" получит импульс 20, и экран будет больше касаться, Float может увеличиться, но импульс не будет.

Если вы посмотрите на мой текущий код, импульс будет установлен максимум при касании экрана, но если он будет выпущен, действие должно быть удалено. Однако это не работает, импульс не останавливается.

Я знаю, что вы можете установить скорость тела при значении после нажатия, и если пресса закончила скорость обратно на 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 */

}

Ответ 1

1.Создайте игру из шаблона Xcode на основе SpriteKit
2. Копия вставить код в класс GameScene

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. Запустите приложение

Это должно дать вам начальную точку для игры "Jump":)

Ответ 2

Попробуйте изменить это:

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.