2017-02-15 8 views
0

Ich erstelle ein Spiel, wo es eine quadratische Form gibt und jedes Mal, wenn der Spieler auf das Quadrat klopft, geht es in die GameOver-Szene. Alles, was ich tun möchte, ist, wenn die quadratische Form angetippt wird, wird es unterschiedliche Position des Bildschirms zugeteilt, um auf den Quadraten angezapft zu werden.Wie macht man die Form, um nicht zu GameOver zu gehen? -SpriteKit

Here is my code:

let touch:UITouch = touches.first! 
    let positionInScene = touch.location(in: self) 
    let touchedNode = self.atPoint(positionInScene) 




    if let name = touchedNode.name 
    { 
     //The first ball that shows up 
     if name == "startball" 
     { 
      print("Touched", terminator: "") 
      addBall(ballSize) 




      self.addChild(score) 
     } 
     else if name == "shape"{ 

      scoreCount += 1 

      addBall(ballSize) 




      audioPlayer.play() 

     } 





    } 



    else { 

     let scene = GameOver(size: self.size) 
     scene.setMyScore(0) 
     let skView = self.view! as SKView 
     skView.ignoresSiblingOrder = true 
     scene.scaleMode = .resizeFill 
     scene.size = skView.bounds.size 
     scene.setMessage("You Lost!") 

     scene.setEndGameMode(va) 
     gameTimer.invalidate() 
     shownTimer.invalidate() 
     print(" timers invalidated ", terminator: "") 
     ran = true 
     skView.presentScene(scene, transition: SKTransition.crossFade(withDuration: 0.25)) 
    } 








    if firstTouch { 
     shownTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(GameScene.decTimer), userInfo: nil, repeats: true) 
     gameTimer = Timer.scheduledTimer(timeInterval: TIME_INCREMENT, target:self, selector: Selector("endGame"), userInfo: nil, repeats: false) 
     firstTouch = false 



    } 

    if touchCount > 5 { 

     for touch: AnyObject in touches { 
      let skView = self.view! as SKView 
      skView.ignoresSiblingOrder = true 
      var scene: Congratz! 
      scene = Congratz(size: skView.bounds.size) 
      scene.scaleMode = .aspectFill 
      skView.presentScene(scene, transition: SKTransition.doorsOpenHorizontal(withDuration: 1.0)) 



     } 




    } 
    touchCount += 1 



} 




    override func update(_ currentTime: TimeInterval) { 
    super.update(currentTime) 




} 

func endGame(){ 
    shownTimer.invalidate() 
    gameTimer.invalidate() 
    let scene = GameOver(size: self.size) 
    scene.setMyScore(scoreCount) 
    if let skView = self.view { 
     skView.ignoresSiblingOrder = false 
     scene.scaleMode = .resizeFill 
     scene.size = skView.bounds.size 
     scene.setMessage("Times up") 

     skView.presentScene(scene, transition: SKTransition.crossFade(withDuration: 0.25)) 
    } 

} 







     override func addBall(_ size: Int) { 
     // Add the ball 
     let currentBall = SKShapeNode(circleOfRadius: CGFloat(size)) 

    let viewMidX = view!.bounds.midX 
    let viewMidY = view!.bounds.midY 

    currentBall.fillColor = pickColor() 



    currentBall.position = randomBallPosition() 




    if scoreCount != 0{ 
     if scoreCount == 1{ 
      self.addChild(score) 
      self.addChild(timeLeftLabel) 
      self.childNode(withName: "welcome")?.removeFromParent() 
     } 
     self.childNode(withName: "ball")?.run(getSmaller) 
     self.childNode(withName: "ball")?.removeFromParent() 

    } 
    currentBall.name = "ball" 


    self.addChild(currentBall) 
} 

    func addSquare(_ size: Int) { 
    // Add the square 
    let shape = SKShapeNode(rectOf: CGSize(width:CGFloat(size), height:CGFloat(size))) 

    shape.path = UIBezierPath(roundedRect: CGRect(x: 64, y: 64, width: 160, height: 160), cornerRadius: 50).cgPath 

    shape.fillColor = pickColor() 

    shape.position = randomBallPosition() 

    shape.name = "shape" 

    self.addChild(shape) 

} 


    func randomBallPosition() -> CGPoint { 
    let xPosition = CGFloat(arc4random_uniform(UInt32((view?.bounds.maxX)! + 1))) 
    let yPosition = CGFloat(arc4random_uniform(UInt32((view?.bounds.maxY)! + 1))) 


    return CGPoint(x: xPosition, y: yPosition) 

} 

Antwort

1

Was würde ich vorschlagen, wäre so etwas wie ein enum für die verschiedenen Formen zu machen, so dass Sie die Spur halten können, welche Form Sie verwenden.

enum GameShape: Int { 

    case circle = 0 
    case square = 1 

} 

Dann eine GameShape Eigentum an der Spitze Ihrer GameScene erstellen:

var currentShape: GameShape = .circle 

Dann könnte man eine Art updateShape Methode erstellen, die Sie addBall

statt nur in Ihrem touchesBegan Methode nennen könnte
func updateShape(shapeSize: CGSize) { 

    switch currentShape { 
     case .circle: 
      addCircle(shapeSize) 
     case .square: 
      addSquare(shapeSize) 
     default: 
      break 
    } 

    // However you want to setup the condition for changing shape 
    if (condition) { 
     currentShape = .square 
    } 

} 

func addBall(_ size: CGSize) { 
    // Add the ball 
} 

func addSquare(_ size: CGSize) { 
    // Add the square 
} 

Jetzt in Ihrer touchesBegan Methode, anstatt 01 zu rufen, könnten Sie updateShape nennen:

override func touchesBegan(_ touches: Set<UITouch>!, with event: UIEvent?) { 

    // Setup your code for detecting position for shape origin 
    updateShape(shapeSize) 

} 

EDIT - Der Code ist ein Chaos. Sie sollten sich wirklich die Zeit nehmen, um sicherzustellen, dass es richtig formatiert ist, wenn Sie es einreichen, sonst ist es wirklich schwer, Ihnen zu helfen. Einrückung hilft zu sehen, wo eine Schließung beginnt und endet. Von dem, was ich sagen kann, sieht es so aus, als ob Sie zwei oder mehr Funktionen innerhalb Ihrer addBall-Methode verschachtelt haben. Das ist nicht gut. Ich habe mein Bestes getan, um es für dich aufzuräumen. Sie müssen immer noch um den Code zu schreiben, um die Form ein Quadrat zu machen, aber ich habe führen Sie in der richtigen Richtung zu beginnen, um dies zuzulassen:

func addBall(_ size: CGSize) { 
    // Add the ball 
    let currentBall = SKShapeNode(circleOfRadius: CGFloat(size)) 

    let viewMidX = view!.bounds.midX 
    let viewMidY = view!.bounds.midY 

    currentBall.fillColor = pickColor() 

    shape.path = UIBezierPath(roundedRect: CGRect(x: 64, y: 64, width: 160, height: 160), cornerRadius: 50).cgPath 

    shape.fillColor = pickColor() 

    currentBall.position = randomBallPosition() 
    shape.position = randomBallPosition() 

    self.addChild(shape) 

    if scoreCount != 0{ 
     if scoreCount == 1{ 
      self.addChild(score) 
      self.addChild(timeLeftLabel) 
      self.childNode(withName: "welcome")?.removeFromParent() 
     } 
     self.childNode(withName: "ball")?.run(getSmaller) 
     self.childNode(withName: "ball")?.removeFromParent() 

    } 
    currentBall.name = "ball" 
    shape.name = "ball" 

    self.addChild(currentBall) 
} 

func addSquare(_ size: CGSize) { 
    // Add the square 
} 

func randomBallPosition() -> CGPoint { 
    let xPosition = CGFloat(arc4random_uniform(UInt32((view?.bounds.maxX)! + 1))) 
    let yPosition = CGFloat(arc4random_uniform(UInt32((view?.bounds.maxY)! + 1))) 


    return CGPoint(x: xPosition, y: yPosition) 

} 

nun der obige Code vorausgesetzt, dass Sie eine Eigenschaft mit dem Namen shape weil von dem, was ich Ihnen sagen konnte, nie explizit instanziiert, aber Sie beginnen, es zu manipulieren.

+0

das addSquare, es bringt mir einen Fehler: "Verwendung von lokalen Variablen addSquare vor seiner Deklaration." –

+0

@ D.W - Vielleicht könnten Sie den Code zeigen, den Sie verwendet haben, um es zu implementieren? Weil 'addSquare' eine Funktion ist, keine Variable - also denke ich, dass deine Syntax falsch ist – Pierce

+0

Kannst du meine aktualisierte Frage überprüfen? Ich habe es aktualisiert. –

Verwandte Themen