斯威夫特向物理体添加相对力量

时间:2014-11-06 21:16:27

标签: macos sprite-kit physics game-physics physics-engine

我有一个问题。 我在Swift for OSX中忙于游戏(为了自己的教育目的)。 我正在尝试创造一种可以转动并可以移动的汽车。 我使用这个更新功能:

override func update(currentTime: CFTimeInterval) {
    self.moveMentForward()
    self.moveMentSteer()

    var point: CGPoint = CGPoint(x: self.car.size.width, y: self.car.size.height/2)
    var force2: CGVector = CGVector(dx: self.directionForwardForce!, dy: 0)

    self.car.physicsBody?.applyForce(force2, atPoint: point)
    self.car.physicsBody?.applyAngularImpulse(CGFloat(self.directionSteerForce!))
}

但是applyForce总是在X和Y方向,因此汽车只会向左或向右移动。 但我希望汽车能够向不同的方向移动,例如向上或向下或向不同的方向移动。 所以实际上力必须始终应用到汽车后部,如下图所示: force 1 http://oi62.tinypic.com/95wizb.jpg force 2 http://oi62.tinypic.com/34tc00m.jpg

这对Swift来说是否可行?如果可行,这怎么可能? 非常感谢你。

1 个答案:

答案 0 :(得分:2)

以下是一个简单的汽车模拟。汽车以固定的速度移动。通过点击屏幕的任一侧来转动汽车。

class GameScene: SKScene {
    let sprite = SKSpriteNode(imageNamed:"Spaceship")

    override func didMoveToView(view: SKView) {
        self.scaleMode = .ResizeFill
        // Set the properties of the sprite
        sprite.size = CGSizeMake(64, 64);
        sprite.position = CGPointMake(CGRectGetMidX(view.frame), CGRectGetMidY(view.frame))
        sprite.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size)
        sprite.physicsBody?.affectedByGravity = false

        self.addChild(sprite)
    }

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        /* Called when a touch begins */
        for touch: AnyObject in touches {
            var action:SKAction
            let location = touch.locationInNode(self)
            if (location.x < CGRectGetMidX(self.frame)) {
                action = SKAction.rotateByAngle(CGFloat(M_PI/45.0), duration: 1.0)
            }
            else {
                action = SKAction.rotateByAngle(-CGFloat(M_PI/45.0), duration: 1.0)
            }
            sprite.runAction(action)
        }
    }

    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
        let r = 15.0
        // Get the direction of the car (in radians)
        let theta = Double(sprite.zRotation)+M_PI_2
        // Convert angle and speed to vector components
        let dx = CGFloat(r * cos(theta))
        let dy = CGFloat(r * sin(theta))
        // Set velocity of the car
        sprite.physicsBody?.velocity = CGVectorMake(dx, dy)
    }
}