2016-07-14 8 views
0

Also ich möchte ein Spiel gemacht, das wurde aus dem Xcode SpriteKit Sampler gestreift, ziemlich einfach. Es wird sich sehr weiterentwickeln, wenn ich dieses Schlüsselproblem aus dem Weg räume. Es hat einen Spieler, Wall's, und eine Tür. Knoten sind zugewiesen, Spieler funktioniert gut. Wall versucht für Kinder in sich selbst, stürzt aber mit meinen Kommentaren ab. Ich habe eine Vermutung als mehrere Knoten mit demselben Namen? Aber die Tür, wenn Knoten zugewiesen, aus irgendeinem Grund, egal was langsam fällt, ohne Schwerkraft und keine Schwerkraft codiert.Tag 1 Kollisionserkennung: swift 3

Das sind weniger Sorgen. Ich komme heute zu dir, um herauszufinden, warum meine Kollisionen meine Kollisionsargumentfunktionen möglicherweise nicht aktivieren, um das Haus zu betreten. Ja, mir ist bekannt, dass der Kontakt dem Ereignis zugeordnet ist. Es ist meiner Theorie ziemlich sicher.

// 
// GameScene.swift 
// Sandbox 
// 
// Created by M on 7/1/16. 
// Copyright © 2016 M. All rights reserved. 
// 

import SpriteKit 
import GameplayKit 



class GameScene: SKScene, SKPhysicsContactDelegate { 

    var entities = [GKEntity]() 
    var graphs = [GKGraph]() 

    private var lastUpdateTime : TimeInterval = 0 
    private var label : SKLabelNode? 
    var playerNode : SKSpriteNode? 
    var wallNode : SKSpriteNode? 
    var doorNode : SKSpriteNode? 
    private var spinnyNode : SKShapeNode? 
    var furnishing : SKSpriteNode? 
    var playerCategory = 0x1 << 0 
    var wallCategory = 0x1 << 1 
    var doorCategory = 0x1 << 2 
    var pathCategory = 0x1 << 3 


    func nextRoom() { 

     let sceneNode = SKScene(fileNamed: "MyScene") 
     sceneNode?.scaleMode = .aspectFill 

     // Present the scene 
     if let view = self.view { 
      view.presentScene(sceneNode) 
      view.ignoresSiblingOrder = true 
      view.showsFPS = true 
      view.showsNodeCount = true 
     } 
    } 

    func loadRoom() { 
     let furnishing = SKSpriteNode(color: #colorLiteral(red: 0.2464724183, green: 0.05352632701, blue: 0.03394328058, alpha: 1), size:CGSize(width:25, height:25)) 
     doorNode?.addChild(furnishing) 
    } 

    func enterHouse() { 
     let newWindow = CGSize(width: 500, height: 500) 
     doorNode?.scale(to: newWindow) 
     loadRoom() 
    } 

    func exitHouse(){ 
     let oldWindow = CGSize(width: 100, height: 100) 
     doorNode?.scale(to: oldWindow) 
    } 


    override func sceneDidLoad() { 
     self.lastUpdateTime = 0 
     physicsWorld.contactDelegate = self 

     // Get nodes from scene and store for use later 
     self.playerNode = self.childNode(withName: "//player") as? SKSpriteNode 
     playerNode?.physicsBody = SKPhysicsBody(rectangleOf: (playerNode?.frame.size)!) 
     playerNode?.physicsBody?.isDynamic = true 
     playerNode?.physicsBody?.affectedByGravity = false 
     playerNode?.physicsBody?.categoryBitMask = UInt32(playerCategory) 
     playerNode?.physicsBody?.collisionBitMask = UInt32(wallCategory) 
     playerNode?.physicsBody?.contactTestBitMask = UInt32(doorCategory) 

     for child in self.children { 
      /*if child.name == "wall" { 
       if let child = child as? SKSpriteNode { 
        wallNode?.physicsBody = SKPhysicsBody(rectangleOf: (wallNode?.frame.size)!) 
        wallNode?.physicsBody?.isDynamic = false 
     wallNode?.physicsBody?.categoryBitMask = UInt32(wallCategory) 
     wallNode?.physicsBody?.collisionBitMask = UInt32(playerCategory) 
        self.addChild(child) 
       } 
      }*/ 
     } 

     self.doorNode = self.childNode(withName: "door") as? SKSpriteNode 
     doorNode?.physicsBody?.affectedByGravity = false 
     doorNode?.physicsBody?.isDynamic = false 
     doorNode?.physicsBody = SKPhysicsBody(rectangleOf: (doorNode?.frame.size)!) 
     doorNode?.physicsBody?.categoryBitMask = UInt32(doorCategory) 
     doorNode?.physicsBody?.contactTestBitMask = UInt32(playerCategory) 
    } 

    func touchDown(atPoint pos : CGPoint) { 
      let fromX = playerNode?.position.x 
      let fromY = playerNode?.position.y 
      let toX = pos.x 
      let toY = pos.y 
      let resultX = toX - (fromX)! 
      let resultY = toY - (fromY)! 
      let newX = (playerNode?.position.x)! + resultX/10 
      let newY = (playerNode?.position.y)! + resultY/10 
      playerNode?.position.x = newX 
      playerNode?.position.y = newY 
    } 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
     for t in touches { self.touchDown(atPoint: t.location(in: self)) } 
    } 

    func didBeginContact(contact: SKPhysicsContact) { 

     //this gets called automatically when two objects begin contact with each other 
     // 1. Create local variables for two physics bodies 
     var firstBody: SKPhysicsBody 
     var secondBody: SKPhysicsBody 

     // 2. Assign the two physics bodies so that the one with the lower category is always stored in firstBody 
     if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 
      firstBody = contact.bodyA 
      secondBody = contact.bodyB 
     } else { 
      firstBody = contact.bodyB 
      secondBody = contact.bodyA 
     } 
     if secondBody.categoryBitMask == UInt32(doorCategory){ 
      enterHouse() 
     } 
    } 

    override func update(_ currentTime: TimeInterval) { 
     // Called before each frame is rendered 

     // Initialize _lastUpdateTime if it has not already been 
     if (self.lastUpdateTime == 0) { 
      self.lastUpdateTime = currentTime 
     } 

     // Calculate time since last update 
     let dt = currentTime - self.lastUpdateTime 

     // Update entities 
     for entity in self.entities { 
      entity.update(withDeltaTime: dt) 
     } 

     self.lastUpdateTime = currentTime 
    } 
} 
+0

Welche Linie im kommentierten Block den Absturz verursacht? – Feldur

+0

Auch hier ist die Zuordnung der Wandknoten nicht wichtig. Das war von einem Experiment, das ich online gesehen habe und Xcode hat es in Stücke gechoppt. Ich habe Ideen um dieses Stück herum, aber mein Anliegen ist das Kollisionshandling-Ereignis, das meine enterHouse-Funktion umgibt. –

Antwort

0

Ich nehme diese Linie den Absturz

wallNode?.physicsBody = SKPhysicsBody(rectangleOf: (wallNode?.frame.size)!) 

verursacht, wie Sie Kraft sind auszupacken (!) Die wallNode Größe jedoch in Ihrem Code suchen Sie es nie, wie so

wallNode = self.childNode(withName: "wallNode") as? SKSpriteNode 
zu etwas zuweisen

oder in der for-Schleife.

Probieren Sie diesen Code in Ihrer For-In-Schleife aus, der Abstürze vermeiden und Ihren Wandknoten zuweisen soll.

for child in self.children where child.name == "wall" { 
     if let child = child as? SKSpriteNode { 

      wallNode = child // Try this 

      if let wallNode = wallNode { // safely unwrap wall node to avoid crashes    

       wallNode.physicsBody = SKPhysicsBody(rectangleOf: (wallNode.frame.size)) 
       wallNode.physicsBody?.isDynamic = false 
       wallNode.physicsBody?.categoryBitMask = UInt32(wallCategory) 
       wallNode.physicsBody?.collisionBitMask = UInt32(playerCategory) 
       self.addChild(wallNode) // add wall node here instead if you are using your wallNode property 

      } 
     } 
    } 

hoffe, das hilft