我有一个问题。 我在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来说是否可行?如果可行,这怎么可能? 非常感谢你。
答案 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)
}
}