2016-07-14 7 views
0

ゲームを作りたいので、これはXcode SpriteKitサンプラーからストライプされていて、とても簡単です。私はこの重要な問題を途方に引くように進化させるでしょう。それにはプレイヤー、ウォールズ、ドアがあります。ノードが割り当てられ、プレーヤーは正常に動作します。ウォールズは自分自身の子供のためにしようとしましたが、コメントが削除されてクラッシュしました。私は同じ名前の複数のノードとして推測していますか?しかし、何らかの理由で何がゆっくりと落ちても、ノードが割り当てられたときにドアは重力が刻まれず、重力が符号化されない。1日目の衝突検出:swift 3

これはあまり関係しません。今日私の衝突がなぜ私の衝突の議論機能を活性化していないかもしれないのか、家に入るのを選ぶためにあなたに来ます。 はい私はそれが連絡先がイベントにマップされていることを認識しています。それは私の理論に合っている。私はかなり確信している。

// 
// 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

に役立ちますか? – Feldur

+0

再び、壁ノードの割り当ては気にしないでください。これは、私がオンラインで見た実験の結果であり、Xcodeはこれをビットにchchoしました。私はその部分の周りにアイデアを持っていますが、私の関心事は、私のenterHouse関数を取り巻く衝突処理イベントにあります。 –

答えて

0

私はあなたが力アンラップされる(!)wallNodeサイズは、しかし、あなたがそう

wallNode = self.childNode(withName: "wallNode") as? SKSpriteNode 
のようなものに割り当てることはありませんあなたのコードを見て、この行がクラッシュ

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

を引き起こしていると推定

またはforループ内。

forループでこのコードを試してください。クラッシュを避け、壁ノードを割り当てる必要があります。

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 

      } 
     } 
    } 

希望これは、コメントブロック内のクラッシュの原因となるライン