在屏幕上保留一个精灵,但让其他精灵离开

时间:2016-03-05 22:34:52

标签: ios swift sprite-kit

我正在制作一个游戏,用户可以移动宇宙飞船并发射子弹。我想这样做是为了让用户无法将太空飞船从屏幕上移开,但是当子弹被射击时,它们可以离开屏幕。我怎样才能做到这一点?我在屏幕截图中包含了截图。

 override func didMoveToView(view: SKView) {



    let borderBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
    self.physicsBody = borderBody
    borderBody.friction = 0
    borderBody.restitution = 0

    Bullet.hidden = true


    buttonDirUp.position = CGPoint(x: -200, y: -50)
    buttonDirUp.setScale(2.0)
    self.addChild(buttonDirUp)

    ship.setScale(0.33)
    shootButton.setScale(0.7)

    buttonDirLeft.position = CGPoint(x: -250, y: -100)
    buttonDirLeft.setScale(2.0)
    self.addChild(buttonDirLeft)

    buttonDirDown.position = CGPoint(x: -200, y: -150)
    buttonDirDown.setScale(2.0)
    self.addChild(buttonDirDown)

    buttonDirRight.position = CGPoint(x: -150, y: -100)
    buttonDirRight.setScale(2.0)
    self.addChild(buttonDirRight)

    self.view?.multipleTouchEnabled = true

    self.backgroundColor = SKColor.blackColor()

    self.anchorPoint = CGPointMake(0.5, 0.5)

    self.addChild(base)
    base.position = CGPointMake(200, -100)

    self.addChild(ball)
    ball.position = base.position

    self.addChild(ship)
    ship.position = CGPoint(x: self.frame.midX, y: self.frame.midY)

    self.addChild(shootButton)
    shootButton.position = CGPoint(x: self.frame.midX, y: -100)

    ball.zPosition = 1
    base.zPosition = 0

    ball.alpha = 0.4
    shootButton.alpha = 0.4
    base.alpha = 0.4
    buttonDirRight.alpha = 0.4
    buttonDirLeft.alpha = 0.4
    buttonDirUp.alpha = 0.4
    buttonDirDown.alpha = 0.4

}

Screenshot

3 个答案:

答案 0 :(得分:0)

您可以围绕视图的周边设置节点,并使用您的太空飞船的collisionBitMask,并将其设置为等于您为周边建立的所有节点。

spaceShip.physicsBody?.collisionBitMask = PhysicsCategory.firstNode | PhysicsCategory.secondNode | PhysicsCategory.thirdNode | PhysicsCategory.fourthNode

答案 1 :(得分:0)

你可以做的是创建一个函数来检查sprite是否大于self.frame.width或self.frame.height,如果是,那么将sprite放回到底部,反之亦然。他们如何在Pacman游戏中做到这一点。

func updateSpritePosition() {
    if ship.position.x > self.frame.width {
        ship.position.x = 0
    }
    else if ship.position.x < 0 {
        ship.position.x = self.frame.width
    }
    else if ship.position.y > self.frame.height {
        ship.position.y = 0
    }
    else if ship.position.y < 0 {
        ship.position.y = self.frame.height
    }
}

您可能需要使用数字才能顺利过渡。但我希望这会有所帮助。

答案 2 :(得分:0)

由于您使用的是Sprite Kit物理,并且游戏边框已经有一个边循环体,因此每种对象类型只需要define the collision/contact categories

船,子弹和边缘循环都需要各自的类别。然后,根据您想要的关系设置collisionBitMaskcontactTestBitMask

例如,您希望船只无法通过边循环,因此其碰撞和接触掩模都应包含边循环的类别:

ship.physicsBody.categoryBitMask = kShipCategory
ship.physicsBody.contactTestBitMask = kBorderCategory
ship.collisionBitMask = kBorderCategory

另一方面,环路不会受到与船舶碰撞的影响,并且由于船舶已经在检查接触,因此环路的面罩不需要包括检查船舶。 / p>

子弹的面具同样应根据您想要的相互作用进行设置:不与边缘接触或碰撞,但可能会与船碰撞。