2016-09-25 2 views
0

Ich erstelle einen Mario-Klon für Mac, um mir zu helfen, schnelle Programmierung zu lernen. Ein Problem, auf das ich gestoßen bin, ist das Setzen eines spielbaren Spielbereichs. Ab sofort werden sich die beiden Hintergründe ("background" und "level") bewegen, wenn die linke oder rechte Taste gedrückt wird, aber graue Bereiche an den Seiten werden sichtbar. Ich möchte in der Lage sein, die Hintergründe zu bewegen, aber einen Bereich festlegen, in dem sie sich nicht mehr bewegen.Spielbare Spielfläche in 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)])) 
     } 
    }  
} 

Antwort

0

Ich bin sicher, es gibt eine viel bessere, clevere Lösung, aber aus der Spitze von meinem Kopf könnte man hinzufügen:

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

Innen func keyDown(), in dem sich bewegenden rechts/links, wenn- Anweisungen, verschachteln Sie diese:

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 

Sie sollten auch die Spielerbewegung beschränken, so dass der Spieler nicht aus dem Level nicht mehr ausläuft.

+0

gibt es, verwenden Sie eine Kamera, dann müssen wir uns keine Sorgen über das Verschieben der Ebene machen – Knight0fDragon

+0

@ Knight0fDragon danke! Weise eleganter. Einfach die Kamera dem Spieler folgen lassen, richtig? – NonCreature0714

+0

eigentlich hätte ich wahrscheinlich den Charakter als Kind der Kamera, und wenn eine Wand getroffen wird, würde sich die Zeichenposition gegen die Kamera bewegen – Knight0fDragon