2016-03-12 64 views
0

的对面奥凯,所以我有下面的代码,使得在x轴上我skspritenode举动看下面的代码:节点离开左侧屏幕输入屏幕

manager.startAccelerometerUpdates() 
    manager.accelerometerUpdateInterval = 0.1 
    manager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue()){ 
     (data, error) in 

     let currentX = self.Player.position.x 

     if data!.acceleration.x < 0 { 
      self.destX = currentX + CGFloat(data!.acceleration.x * 1000) 
     } 

     else if data!.acceleration.x > 0 { 
      self.destX = currentX + CGFloat(data!.acceleration.x * 1000) 
     } 

     print(currentX) 
    } 

override func update(currentTime: CFTimeInterval) { 
    /* Called before each frame is rendered */ 

    let action = SKAction.moveToX(destX, duration: 0.1) 
    self.Player.runAction(action) 
} 

现在当skspritenode从左侧或我希望屏幕右侧重新出现在屏幕的另一侧。我试图添加以下线代码:

else if currentX >= self.size.width-5 { 
      self.destX = 5 
     } 

但这可悲的没有工作。有人能解释我如何做到这一点?

奥凯所以这是更新的功能,现在的样子:

override func update(currentTime: CFTimeInterval) { 
    /* Called before each frame is rendered */ 


    let action = SKAction.moveToX(destX, duration: 0.1) 
    self.Player.runAction(action) 

    if self.Player.position.x < CGRectGetMinX(self.frame) - (Player.size.width/2) { 

     self.player.position.x = CGRectGetMaxX(self.frame) - (self.Player.size.width/2) 

    } 

    else if self.Player.position.x > CGRectGetMaxX(self.frame) + (Player.size.width/2) { 

     self.player.position.x = CGRectGetMinX(self.frame) + (self.Player.size.width/2) 
    } 
} 

回答

1

在问候了球员和屏幕你为什么不加入这样的事情到更新方法

if self.Player.position.x < CGRectGetMinX(self.frame) - (Player.size.width/2) { 

    self.player.position.x = CGRectGetMaxX(self.frame) - (self.Player.size.width/2) 

} 

else if self.Player.position.x > CGRectGetMaxX(self.frame) + (Player.size.width/2) { 

    self.player.position.x = CGRectGetMinX(self.frame) + (self.Player.size.width/2) 
} 

我试着让它与你的移动代码一起工作,但我不能,认为它是updateMethod中的SKAction。

试试这个。进口SpriteKit线

struct PhysicsCategory { 
    static let player: UInt32 = 0x1 << 0 
    static let enemy: UInt32 = 0x1 << 1 
} 

创建你的物理类别下的GameScene类以上

创建此。如果您对此不确定,请阅读关于SKPhysicsBodies的一些教程,网络上有很多。无论如何,你迟早都不得不这样做。

现在给你玩家一个物理机构。转到您创建播放器的位置,并在将其添加到场景之前添加此代码。

player.physicsBody = SKPhysicsBody(rectangleOfSize: player.size) 
    player.physicsBody?.categoryBitMask = PhysicsCategory.player 
    player.physicsBody?.collisionBitMask = 0 
    player.physicsBody?.dynamic = true 
    player.physicsBody?.affectedByGravity = false 

    addChild(player) 

,改变你的运动代码,这

manager.startAccelerometerUpdates() 
manager.accelerometerUpdateInterval = 0.1 
manager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue()){ 
    (data, error) in 

    /// use this to limit the max speed of player in both directions 
    guard player.physicsBody!.velocity.dx > -500 && node.physicsBody!.velocity.dx < 500 else { return } 

    /// if your game is in landscape 
    if UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeLeft { 
      self.player.physicsBody!.applyForce(CGVectorMake(-500 * CGFloat(data!.acceleration.y), 0)) 
     } else { 
      self.player.physicsBody!.applyForce(CGVectorMake(500 * CGFloat(data!.acceleration.y), 0)) 
     } 


    /// if your game is in portrait 
     self.player.physicsBody!.applyForce(CGVectorMake(500 * CGFloat(data!.acceleration.y), 0)) 
} 

注释掉你不需要根据您的方位的代码。 玩500的价值,以获得您想要的速度。

希望这有助于

+0

好,谢谢你的回答,但一个简单的问题。 (我对编码颇为陌生)。 accelerationData之前的let变量给出错误。该错误说明以下内容:条件绑定的初始化程序必须具有可选类型,而不是'CMAcceleration'。 – FutureCake

+0

嘿,对不起,试着换掉!在一个?的声明中。否则,也许只是摆脱它,是一个建议。屏幕的东西工作? – crashoverride777

+0

否:(我添加了你的代码,但它没有做任何不正确的事情更新我的问题,向你展示我是如何实现你的代码的,也许这是我身边的一个错误 – FutureCake

0

奥凯,所以我想通出来,所以它只是我想要的方式:

与crashoverride777我来到了以下解决方案的所有帮助: 所以我把一个if语句围绕着动作代码,所以它只会在屏幕边界触发,并且如果它不在屏幕的边界crashoverrides代码将开始运行。

override func update(currentTime: CFTimeInterval) { 
    /* Called before each frame is rendered */ 

    print(self.Player.position.x) 

    if (self.Player.position.x > CGRectGetMinX(self.frame)-5) && (self.Player.position.x < CGRectGetMaxX(self.frame)+5){ 

     let action = SKAction.moveToX(self.destX, duration: 1) 
     self.Player.runAction(action) 

    } 

所以我说crashoverrides代码更新功能见下图:

if self.Player.position.x < CGRectGetMinX(self.frame) - (Player.size.width/2) { 

     self.Player.position.x = CGRectGetMaxX(self.frame) 
    } 

    else if self.Player.position.x > CGRectGetMaxX(self.frame) + (Player.size.width/2) { 

     self.Player.position.x = CGRectGetMinX(self.frame)   } 
}