我正在学习SpriteKit
并尝试使用SKAction.moveToY
将节点向上移出屏幕。我想首先让它接近顶部(我假设一旦我到达节点的顶部仍然会在屏幕上,我必须调整,但不应该是一个问题)。
问题在于我尝试使用UIScreen.mainScreen().bounds.size.height
和(didMoveToView
方法内)SKView
的bounds.size.height。如果我println
他们两个都返回正确的顶部值(5s返回568.0)。当我将该值添加到SKAction.moveToY(screenHeightVariable, duration: 2)
时,它可以正常工作并移动节点,但它会停止大约75%的路径到5s的顶部,并且大约90%的路径到6的顶部加上。是否有不同的方法我应该在屏幕的顶部获得Y值?这是我的一些代码(尝试忽略一些更不合逻辑的东西,比如红色不明飞行物,因为这更像是学习和错误的试验):
override func didMoveToView(view: SKView) {
physicsWorld.contactDelegate = self
println(view.bounds.size.height)
xVal = self.frame.width/2
ufoNode = ufo(imageNamed: "ufo")
ufoNode!.position = CGPoint(x: xVal!, y: 30)
ufoNode!.physicsBody?.categoryBitMask = charCat
ufoRedNode = obstacle(imageNamed: "ufo-red")
ufoRedNode!.position = CGPoint(x: (self.frame.width/2 - 50), y: 30)
ufoNode!.physicsBody?.categoryBitMask = sceneCat
self.addChild(ufoRedNode!)
self.addChild(ufoNode!)
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
/* Called when a touch begins */
for touch: AnyObject in touches {
let location = touch.locationInNode(self)
if location.x < self.frame.width/2 {
// Left
direction = Selector("moveLeft:")
} else {
// Right
direction = Selector("moveRight:")
}
movementTimer = NSTimer.scheduledTimerWithTimeInterval(0.005, target: self, selector: direction!, userInfo: nil, repeats: true)
self.fireBullet(self)
fireBulletTimer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: "fireBullet:", userInfo: nil, repeats: true)
}
}
func fireBullet(sender: AnyObject!) {
var singleBullet: bullet?
bulletY = ufoNode!.position.y + 10
if bulletSide == "Left" {
bulletX = (ufoNode!.position.x - ((ufoNode!.size.width/4) ))
bulletSide = "Right"
// println("left")
} else {
bulletX = (ufoNode!.position.x + ((ufoNode!.size.width/4) ))
bulletSide = "Left"
// println("right")
}
singleBullet = bullet(imageNamed: "bullet")
singleBullet!.position = CGPoint(x: bulletX!, y: bulletY!)
var bulletAction: SKAction = SKAction.moveToY(screenHeight, duration: 2)
singleBullet!.runAction(bulletAction)
self.addChild(singleBullet!)
}
答案 0 :(得分:0)
position
的{{1}}默认为精灵的中点。因此,将SKSpriteNode
移至node
,会将精灵的中点移至screenHeight
。 screenHeight
的下半部分仍然在屏幕内。
如果您想完全删除它,可以尝试通过node
抵消最终位置。
singleBullet.size.height/2
您还可以重新配置更改var bulletAction: SKAction = SKAction.moveToY(screenHeight + singleBullet.size.height/2, duration: 2)
的{{1}}属性,以更改spriteNode中的哪个点移动到spriteNode的anchorPoint
属性
anchorPoint :定义精灵中与之对应的点 节点的位置。您可以在单位中指定此属性的值 坐标空间。默认值为(0.5,0.5),表示该值 精灵以其位置为中心。
同时将node
替换为position
。 NSTimer
与SKActions
无法正常工作。例如。
NSTimers