我在Swift的Spite Kit中创建了这个游戏。我创造了一艘船,我可以确定它的位置是在船的位置上方或下方。船将移向我放置手指的Y轴。但是此时船只只会移动一定的数量,在这种情况下为30或-30。我怎样才能重写这段代码,以便船只继续移动直到我释放手指?
谢谢!
func addShip() {
// Initializing spaceship node
ship = SKSpriteNode(imageNamed: "spaceship")
ship.setScale(0.45)
ship.zRotation = CGFloat(-M_PI/2)
// Adding SpriteKit physics body for collision detection
ship.physicsBody = SKPhysicsBody(rectangleOfSize: ship.size)
ship.physicsBody?.categoryBitMask = UInt32(shipCategory)
ship.physicsBody?.affectedByGravity = false
ship.physicsBody?.dynamic = true
ship.physicsBody?.contactTestBitMask = UInt32(obstacleCategory)
//NEWLY ADDED
ship.physicsBody?.contactTestBitMask = coinCategory
ship.physicsBody?.collisionBitMask = 0
ship.name = "ship"
ship.position = CGPointMake(120, 160)
self.addChild(ship)
actionMoveUp = SKAction.moveByX(0, y: 30, duration: 0.2)
actionMoveDown = SKAction.moveByX(0, y: -30, duration: 0.2)
}
答案 0 :(得分:0)
我不喜欢将SKActions用于这些类型的东西,因为它们真的只适用于简单的动画。但是,根据游戏的要求,这可能是合适的。
如果您坚持使用SKActions而不是moveBy
,那么为什么不使用moveTo
利用触摸位置?你唯一需要做的就是根据你的精灵需要旅行的距离来提出一个比例,这样你的动画持续时间才是正确的。例如:
let curPoint = self.sprite.position
let destinationPoint = touch.position
let diffPoint = CGPoint(
x: curPoint.x - destinationPoint.x,
y: curPoint.y - destinationPoint.y
)
let distance = sqrt(pow(diffPoint.x, 2) + pow(diffPoint.y, 2))
let durationRatio = distance / CGFloat(600)
let moveAction = SKAction.moveTo(point, duration: NSTimeInterval(durationRatio))
self.sprite.runAction(moveAction, withKey: "move")
然后当你想要取消运动时。在touchesEnded
你做
self.sprite.removeActionForKey("move")
使用物理速度
let curPoint = CGPoint(x: 10, y: 10)
let destinationPoint = CGPoint(x: 100, y: 100)
let diffPoint = CGPoint(
x: curPoint.x - destinationPoint.x,
y: curPoint.y - destinationPoint.y
)
let distance = sqrt(pow(diffPoint.x, 2) + pow(diffPoint.y, 2))
let normalizedVector = CGPoint(
x: diffPoint.x / distance,
y: diffPoint.y / distance
)
let speed = CGFloat(100)
let velocity = CGVector(
dx: normalizedVector.x * speed,
dy: normalizedVector.y * speed
)
self.sprite.physicsBody!.velocity = velocity
在touchesEnded中你做了
self.sprite.physicsBody!.velocity = CGVector(dx: 0.0, dy: 0.0)