2016-09-25 83 views
0

我正在为mac创建一个mario克隆,以帮助我学习快速编程。我碰到的一个问题是设置一个可玩的游戏区域。到目前为止,当按下左键或右键时,我有两个背景(“背景”和“水平”)会移动,但两侧的灰色区域将变为可见。我希望能够使背景移动,但设置一个区域,他们将停止移动。Swift 3.0中可玩的游戏区域

import SpriteKit 

class GameScene: SKScene { 

    let player = SKSpriteNode(imageNamed: "mario") 

    let background = SKSpriteNode(imageNamed: "background") 

    let level = SKSpriteNode(imageNamed: "level") 

    override func didMove(to view: SKView) { 
     /* Setup your scene here */ 

     //self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame) 

     level.size = self.size 
     level.position = CGPoint(x: self.size.width/2, y: self.size.height/2) 
     level.zPosition = 1 
     self.addChild(level) 

     background.size = self.size 
     background.position = CGPoint(x: level.size.width + 511, y: self.size.height/2) 
     background.zPosition = 0 
     self.addChild(background) 

     player.setScale(0.23) 
     player.position = CGPoint(x: self.size.width/8, y: 120) 
     player.zPosition = 2 
     self.addChild(player) 

    } 

    override func keyDown(with theEvent: NSEvent) { 
     let keyCode = theEvent.keyCode 

     //Moving Right 
     if keyCode == 124 { 
      level.run(SKAction.sequence([SKAction.moveBy(x: -20, y: 0, duration: 0.2)])) 

      background.run(SKAction.sequence([SKAction.moveBy(x: -20, y: 0, duration: 0.2)])) 

      player.xScale = 0.23 
     } 

     //Moving Left 
     if keyCode == 123 { 
      background.run(SKAction.sequence([SKAction.moveBy(x: 20, y: 0, duration: 0.2)])) 

      level.run(SKAction.sequence([SKAction.moveBy(x: 20, y: 0, duration: 0.2)])) 

      player.xScale = -0.23   
     } 

     //Jump 
     if keyCode == 126{    
      player.run(SKAction.sequence([SKAction.moveTo(y: 250, duration: 0.15),SKAction.moveTo(y: 120, duration: 0.2)])) 
     } 
    }  
} 

回答

0

我敢肯定有一个更好,更聪明的解决方案,但是从我的头顶,你可以添加:

let LEFTBOUND: Int = //Insert the left limit here. 
let RIGHTBOUND: Int = //Insert the right limit here. 

里面func keyDown(),在移动左/右如果 - 语句,这些窝:

if level.position.x < RIGHTBOUND: 
    //Move level so long as it is less than the RIGHTBOUND value. 
    //TODO: set the level.position to RIGHTBOUND so it doesn't keep updating with new values while keyDown is true. 

if level.position.x > LEFTBOUND: 
    //Move level so long as it is greater than the LEFTBOUND value. 
    //TODO: set the level.position to LEFTBOUND so it doesn't keep updating with new values while the keyDown is true. 

//Repeat theses steps for background.position.x 

你也应该限制球员的跑动让玩家不出来的水平上运行无法恢复。

+0

还有,使用相机,那么我们不必担心搬家的水平 – Knight0fDragon

+0

@ Knight0fDragon谢谢!方式更优雅。只需让相机跟随播放器,对吧? – NonCreature0714

+0

实际上我可能会把角色当作相机的小孩,当墙壁被击中时,角色位置会相对于相机移动 – Knight0fDragon