UIScreen.mainScreen()。bounds.size.height返回正确的数字,但SKSpriteNode没有显示在顶部

时间:2015-03-02 01:47:43

标签: ios swift sprite-kit

我正在学习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!)


}

1 个答案:

答案 0 :(得分:0)

position的{​​{1}}默认为精灵的中点。因此,将SKSpriteNode移至node,会将精灵的中点移至screenHeightscreenHeight的下半部分仍然在屏幕内。

如果您想完全删除它,可以尝试通过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替换为positionNSTimerSKActions无法正常工作。例如。

NSTimers