2016-11-03 4 views
0

私の目標:プレイヤーが戻って、それは同じものをカウントしていない場合はレベルユニットは、一度、したがって、プレイヤーの背後にある場合にのみカウントスコアリングシステムを達成するために二回採点システムカウント複数回

私は現在、自分のゲームで前進するためにプレーヤーをタップするたびに、スコアラベルに1を加えたスコアリングシステムを持っています。これはプレーヤーが後方に行くことができ、前方にタップするとそのスコアがあります。プレーヤーは後方に進み、次に前方に向かった。

プレーヤの背後にあるプラットフォーム(LevelUnits)の数をカウントするというアイデアを思いついたので、前に戻ると同じプラットフォーム(LevelUnit)を2回カウントしないようにしました。これは私が思い付いたものです

override func update(_ currentTime: TimeInterval) {  

    let scoreLabel = childNode(withName: "scoreLabel") as! Score // links the scorelabel with Score class 

     worldNode.enumerateChildNodes(withName: "levelUnit") { 
       node, stop in 

     let nodeLocation:CGPoint = self.convert(node.position, from: self.worldNode) //converts cordinates of level units with the world node. 
     let player1Location:CGPoint = self.convert(self.thePlayer.position, from: self.worldNode) 

     if (nodeLocation.y < (player1Location.y) - self.levelUnitHeight) { // checks to see if the node is behind the player's position 

       self.countLevelUnits += 1 
     } 

     if (self.countLevelUnits > scoreLabel.number) { 

      while self.countLevelUnits > scoreLabel.number { 

       scoreLabel.addOneToScore() 

      } 

    } else if (self.countLevelUnits < scoreLabel.number) { 

     // Do Nothing 

    } 
    }  
} 

唯一の問題は、彼らが選手の後ろに常にしているため、コードがそれを複数回カウントし、私はゲームをオフにしない限り、そうし続けていることです。プレイヤーの背後にあるプレイヤーの背後にあるLevelUnitsを一度カウントする方法はありますか?

EDIT 1:LEVELのユニットクラス

class LevelUnit:SKNode { 

//General Level Unit and Object Variables 
var imageName:String = "" 
var levelUnitSprite:SKSpriteNode = SKSpriteNode() 
var levelUnitWidth:CGFloat = 0 
var levelUnitHeight:CGFloat = 0 
var theType:LevelType = LevelType.normal 
let thePlayer:Player = Player(imageNamed: "Frog") 
var levelUnitPicker = 0 
var levelUnitsSpawned = 0 

var levelUnitScored:Bool = false 

required init(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

override init() { 

    super.init() 
} 


func setUpLevel(){ 

imageName = “Wall” 

    let theSize:CGSize = CGSize(width: levelUnitWidth, height: levelUnitHeight)  //defines the size background sprite as defined by the height and width of level unit 
    let tex:SKTexture = SKTexture(imageNamed: imageName)     //defines the testue that the backgroundsprite will have. 

    levelUnitSprite = SKSpriteNode(texture: tex, color: SKColor.black, size: theSize) 
    scoredLevelUnit = false 

    self.addChild(levelUnitSprite) //adds the level unit to the scene 
    self.name = "levelUnit"   //names the whole backgroundsprite under the name level Unit 

    self.position = CGPoint(x: levelUnitSprite.size.width/2, y: 0) 


    //The Level Types Physics Body 
    if (theType == LevelType.blank) { 

     levelUnitSprite.physicsBody = SKPhysicsBody(rectangleOf: levelUnitSprite.size) 

     levelUnitSprite.physicsBody!.categoryBitMask = BodyType.normal.rawValue 
     levelUnitSprite.physicsBody!.contactTestBitMask = BodyType.normal.rawValue 
     levelUnitSprite.physicsBody!.isDynamic = false 


    } else if (theType == LevelType.normal) { 

     levelUnitSprite.physicsBody = SKPhysicsBody(rectangleOf: levelUnitSprite.size) 

     levelUnitSprite.physicsBody!.categoryBitMask = BodyType.normal.rawValue 
     levelUnitSprite.physicsBody!.contactTestBitMask = BodyType.normal.rawValue 
     levelUnitSprite.physicsBody!.isDynamic = false 


    } else if (theType == LevelType.floating) { 

     levelUnitSprite.physicsBody = SKPhysicsBody(rectangleOf: levelUnitSprite.size) 

     levelUnitSprite.physicsBody!.categoryBitMask = BodyType.floating.rawValue 
     levelUnitSprite.physicsBody!.contactTestBitMask = BodyType.floating.rawValue 
     levelUnitSprite.physicsBody!.isDynamic = false 
    } 


} 
+0

それを得点scored == trueかどうかを確認することができず、設定しました「得点する」。このオブジェクトを "得点する"ときには 'scored = true'をセットし、次回は' scored == true'をチェックして再びスコアリングしないでください。 – Paulw11

+0

@ Paulw11私はプロパティを追加しました。スコアリングコードで同じ名前を使用する方法個々のレベルユニットごとにスコアリングされたプロパティにアクセスするにはどうすればよいですか? levelUnitクラスに "self.levelUnitScored = false"のようなものを追加して、得点コードにlevelUnitクラスのインスタンスを作成する必要がありますか?私は元の投稿を自分のレベルのUnitクラスで更新しました。 – Astrum

答えて

1

あなたがあなたのレベルの単位のためのカスタムサブクラスを使用する場合は、あなたが簡単にBoolプロパティが得点を追加することができます。あなたは「スコア」と、このオブジェクトは、scored = trueは、次の時間は、あなたが、あなたは簡単に `Bool`プロパティを追加することができ、あなたのレベルの単位のためのカスタムサブクラスを使用している場合は、再び

override func update(_ currentTime: TimeInterval) {  

    let scoreLabel = childNode(withName: "scoreLabel") as! Score // links the scorelabel with Score class 

    worldNode.enumerateChildNodes(withName: "levelUnit") { 
     node, stop in 

     if let levelNode = node as? LevelUnit 
      let nodeLocation:CGPoint = self.convert(levelNode.position, from: self.worldNode) //converts cordinates of level units with the world node. 
      let player1Location:CGPoint = self.convert(self.thePlayer.position, from: self.worldNode) 

      if (nodeLocation.y < (player1Location.y) - self.levelUnitHeight) { // checks to see if the node is behind the player's position 
       if !levelNode.levelUnitScored { 
        scoreLabel.addOneToScore() 
        levelNode.levelUnitScored = true 
       } 
      } 
     } 
    } 
} 
+0

これは私にこの行のエラーを教えてくれます。levelNodeに「y」というメンバータイプがないというif(levelNode.y <(player1Location.y))がnodeLocationに変更されると思われますか? – Astrum

+0

はい、申し訳ありません。 – Paulw11