Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 物理问题:球弹得太高了_Swift_Sprite Kit_Skphysicsbody - Fatal编程技术网

Swift 物理问题:球弹得太高了

Swift 物理问题:球弹得太高了,swift,sprite-kit,skphysicsbody,Swift,Sprite Kit,Skphysicsbody,我正在做一个游戏,一个球反弹,击中一个平台,然后反弹回来。理想情况下,球应该反弹到它开始时的准确高度。然而,在我的比赛中,球慢慢地反弹得越来越高。我看了文档,试图改变所有的物理属性,但似乎没有任何效果 有什么建议吗 import SpriteKit class GameScene: SKScene, SKPhysicsContactDelegate { let ballCategory:UInt32 = 0x1 << 0; let circleCategory:U

我正在做一个游戏,一个球反弹,击中一个平台,然后反弹回来。理想情况下,球应该反弹到它开始时的准确高度。然而,在我的比赛中,球慢慢地反弹得越来越高。我看了文档,试图改变所有的物理属性,但似乎没有任何效果

有什么建议吗

import SpriteKit

class GameScene: SKScene, SKPhysicsContactDelegate {

    let ballCategory:UInt32 = 0x1 << 0;
    let circleCategory:UInt32 = 0x1 << 1;
    let platformCategory:UInt32 = 0x1 << 2;

    var ball = SKShapeNode(circleOfRadius: 20.0)
    var circle = SKShapeNode(circleOfRadius: 200.0)
    var platform = SKShapeNode(rectOfSize: CGSizeMake(10, 1))

    var circleColor = 2
    var ballColor = 3

    var scoreLabel: SKLabelNode!
    var score = 0

    override func didMoveToView(view: SKView) {

        setUpLabels()

        self.physicsWorld.contactDelegate = self

        backgroundColor = (UIColor.whiteColor())
        ball.fillColor = SKColor.redColor()
        ball.strokeColor = SKColor.clearColor()
        ball.position = CGPoint(x: self.size.width/2, y: self.size.height/2+60)

        ball.physicsBody = SKPhysicsBody(circleOfRadius: 20)
        ball.physicsBody?.categoryBitMask = ballCategory
        ball.physicsBody?.collisionBitMask = platformCategory
        ball.physicsBody?.contactTestBitMask = platformCategory
        ball.physicsBody?.dynamic = true
        ball.physicsBody?.restitution = 1.0
        ball.physicsBody?.affectedByGravity = true
        ball.physicsBody?.linearDamping = 0.0
        ball.physicsBody?.friction = 0.0


        self.addChild(ball)


        circle.fillColor = SKColor.clearColor()
        circle.strokeColor = SKColor.redColor()
        circle.lineWidth = 5.0
        circle.position = CGPoint(x: self.size.width/2, y: self.size.height/2)

        circle.physicsBody = SKPhysicsBody(edgeLoopFromPath: circle.path)
        circle.physicsBody?.categoryBitMask = circleCategory

        self.addChild(circle)


        platform.fillColor = SKColor.clearColor()
        platform.strokeColor = SKColor.clearColor()
        platform.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(10, 1))
        platform.position = CGPoint(x: self.size.width/2, y: circle.position.y/2)
        platform.physicsBody?.categoryBitMask = platformCategory
        platform.physicsBody?.dynamic = false
        platform.physicsBody?.friction = 0.0


        self.addChild(platform)
    }

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {


        circleColor += 1

        if circleColor%3  == 1 {

            circle.strokeColor = UIColor.redColor()
        }

        if circleColor%3  == 2 {

            circle.strokeColor = UIColor.greenColor()
        }

        if circleColor%3  == 3 {

            circle.strokeColor = UIColor.yellowColor()
        }

        if circleColor%3  == 4 {

            circle.strokeColor = UIColor.greenColor()
        }

        if circleColor%3  == 5 {

            circle.strokeColor = UIColor.blueColor()
        }
        if circleColor%3  == 0 {

            circle.strokeColor = UIColor.yellowColor()
        }


    }


    func didBeginContact(contact: SKPhysicsContact) {

        if ball.fillColor == circle.strokeColor {
            score += 1
            scoreLabel.text = String("Score \(score)")
        }


        if ball.fillColor != circle.strokeColor {
            let transition = SKTransition.revealWithDirection(SKTransitionDirection.Down, duration: 1.0)

            let scene = SecondScene(size: self.scene!.size)
            scene.scaleMode = SKSceneScaleMode.AspectFill


            self.scene!.view!.presentScene(scene, transition: transition)
        }



        ballColor = Int(arc4random_uniform(10))


        if ballColor%3  == 1 {

            ball.fillColor = UIColor.redColor()
        }

        if ballColor%3  == 2 {

            ball.fillColor  = UIColor.greenColor()
        }

        if ballColor%3  == 3 {

            ball.fillColor  = UIColor.yellowColor()
        }

        if ballColor%3  == 4 {

            ball.fillColor  = UIColor.greenColor()
        }

        if ballColor%3  == 5 {

            ball.fillColor  = UIColor.blueColor()
        }
        if ballColor%3  == 0 {

            ball.fillColor  = UIColor.yellowColor()
        }


    }

    func setUpLabels () {

        scoreLabel = SKLabelNode(fontNamed: "Arial")
        scoreLabel.position = CGPoint(x: 60, y: self.size.height-30)
        scoreLabel.text = String("Score \(score)")
        scoreLabel.fontColor = UIColor.blackColor()
        scoreLabel.fontSize = 25
        self.addChild(scoreLabel)


    }

    override func update(currentTime: CFTimeInterval) {

    }
}
导入SpriteKit
类游戏场景:SKScene,SKPhysicContactDelegate{

让ballCategory:UInt32=0x1稍微减少
restoration
,以控制物理体的弹性。如下所示:


ball.physicsBody?.restitution=0.9

在一般的数值微分方程解算器中,为下一个时间步解算常微分方程的解算器会将能量引入系统,这就是为什么你看到了你所看到的。你可以通过引入阻尼力来缓解这一问题。对于SpriteKit,这意味着改变恢复力或线性阻尼系数


有关发生漂移的更多信息,请参见:或。

谢谢。我尝试了恢复,最后将其设置为0.99,使其正常工作