2017-05-11 1 views
2

나는 이것을 많이 검색 했으므로 도움이 될만한 것을 찾을 수 없었습니다. 내가SpriteNode 화면이 꺼질 때 Swift에서 점수 증가시키기

SpriteNodes 화면의 오른쪽에 산란 스위프트 (3)를 사용하여 SpriteKit에서 게임을 만들고 SKActions을 사용하고하는 것은이 반복 화면의 왼쪽에 그들의 방법을 확인하십시오.

SpriteNode가 내 플레이어 (장면 중간에 있음)를 통과 할 때 점수가 1 올라가는 방식이 필요합니다.

다음 블록은 적 캐릭터를 오른쪽에서 왼쪽으로 이동시킵니다.

func createEnemyBird() { 
    // Create Enemy Bird 1 
    enemyBird1 = EnemyBird(imageNamed: "enemy 1") 
    enemyBird1.position.x = self.frame.width + 100 
    enemyBird1.position.y = CGFloat.randomBetweenNumbers(firstNum: -(self.frame.size.height/2.8), secondNum: (self.frame.size.height/2.4)) 
    enemyBird1.name = "EnemyBird1" 
    enemyBird1.initialise() 

    print(enemyBird1.position.y) 

    // Add Physics Bodys 
    enemyBird1.physicsBody = SKPhysicsBody(circleOfRadius: self.size.height/10) 
    enemyBird1.physicsBody?.allowsRotation = false 
    enemyBird1.physicsBody?.affectedByGravity = false 
    enemyBird1.physicsBody?.isDynamic = false 
    // Add Collision Bitmasks 
    enemyBird1.physicsBody?.categoryBitMask = ColliderType.Pipes 

    // Animate Enemy Bird 
    var enemyBirdAnim = [SKTexture]() 
    for i in 1..<5 { 
     let enemyName = "enemy \(i)" 
     enemyBirdAnim.append(SKTexture(imageNamed: enemyName)) 
    } 
    let animateEnemyBird = SKAction.animate(with: enemyBirdAnim, timePerFrame: 0.08, resize: false, restore: true) 
    enemyBird1.run(SKAction.repeatForever(animateEnemyBird)) 

    // Make enemy Bird Move Left 
    let destination = self.frame.width * 2; 
    let move = SKAction.moveTo(x: -destination, duration: TimeInterval(6)); 
    let remove = SKAction.removeFromParent(); 


    // Run Enemy Bird Mobe 
    enemyBird1.run(SKAction.sequence([move, remove]), withKey: "Move") 



    // Add Children to scene 
    self.addChild(enemyBird1) 

} 

또한 기능을 가지고하지만 난 그것을 호출 할 때 모르는 나는 순서에 호출 SKAction 실행 블록을 추가하려고

// Score increase 
func incrementScore() { 
    if enemyBird1.position.x == -(self.frame.size.width/2) { 
     score += 1 
     scoreLabel.text = String(score) 
    } 
} 

그러나 그것은 아주 잘 작동하지 않았다 실제로 (이상입니다) 계산을 시작하기 전에 약 6 적 캐릭터는

+0

당신이 득점 방법과 선수 위치에 대해 시도한 모든 코드는 유용 할 것입니다. – sicvayne

답변

1

하나의 솔루션은 SKSceneupdate 방법 내부에 incrementScore 기능을 추가하는 것입니다 ... 전달 :

,
override func update(_ currentTime: TimeInterval) { 

    if !enemyBird1.isScored { 
     if enemyBird1.position.x > -self.frame.size.width/2 { 
      score += 1 
      scoreLabel.text = String(score) 
      enemyBird1.isScored = true 
     } 
    } 

} 

update 메서드는 모든 프레임을 실행하고 새가 화면 중앙을 통과했는지 확인합니다. 있다면, 득점 한 것으로 표시되어 다시 계산되지 않습니다.

EnemyBird 클래스에 isScored 속성을 추가해야합니다.

class EnemyBird: SKSpriteNode { 

    var isScored = false 

    // other properties, inits, functions, etc 

} 
+0

적을 빨리 주겠다. 적의 버드 클래스에 isScored 속성을 어떻게 추가 할까? – LukeTerzich

+0

@LukeTerzich 예를 들어 답을 업데이트했습니다. – nathan

+0

이 작품! 어떤 이유로 득점은 2로 시작하고 enemyBird1이 맨 왼쪽 가장자리가 아닌 화면의 정확한 입력에있을 때 점수가 변경됩니다. – LukeTerzich

1

당신은 함수를 호출하는 EnemyBird에 position을 무시 고려할 수 있습니다 때마다 새 변화의 위치 :

EnemyBird 그것은 다음과 같이 보일 것입니다, SKSpriteNode 당신을 가정하고.

override var position: CGPoint { 
    didSet { 
     if self.position.x == theParentSceneLeftEdge { 
     // call a function to update score 
     } 
    } 
} 

EnemyBird 다음 또한 init이 장면의 왼쪽 가장자리의 값을 동일하게 당신이 할당 할 수 theParentSceneLeftEdge의 값을 알고 있어야합니다 : 같은 예를 들어, EnemyBird 클래스 내에서, 당신이 뭔가를 추가 할 수 있습니다 EnemyBird.

희망이 도움이됩니다.

1

SKActions 만 있으면 모든 작업을 수행 할 수 있습니다. 이동을 두 부분으로 나누십시오. 먼저 점수선으로 이동 한 다음 나머지 부분을 이동하십시오. 그리고 그 사이에 점수를 업데이트하십시오. 당신이이 새 때까지 전화를받을 수 없습니다 알고 있기 때문에

// first action moves to the score line 
let scoreLineDestination = -self.frame.width/2 
let moveToScoreLine = SKAction.moveTo(x: scoreLineDestination, duration: TimeInterval(3)); 

// second action calls your incrementScore() method 
let increment = SKAction.run(self.incrementScore) 

// third action moves the rest of the way 
let finalDestination = -self.frame.width * 2; 
let moveToFinal = SKAction.moveTo(x: finalDestination, duration: TimeInterval(3)); 

// finally remove 
let remove = SKAction.removeFromParent(); 

enemyBird1.run(SKAction.sequence([moveToScoreLine, increment, moveToFinal, remove]), withKey: "Move") 

당신은 또한 incrementScore()에서 위치 확인을 삭제할 수 있습니다 :이 코드는이 createEnemyBird()과 "실행 적 새 Mobe"섹션 "적 조류가 왼쪽으로 이동 확인"대체

func incrementScore() { 
    score += 1 
    scoreLabel.text = String(score) 
} 

그런 식으로 어떤 새가 그것을 부르는 지 걱정할 필요가 없습니다.

+0

어떤 이유로 든 새가 1 점이 지나면 점수가 매우 빠르게 올라갑니다. – LukeTerzich

+0

@LukeTerzich 코드를 새 프로젝트에 넣으면 의도 한대로 작동합니다 : 점수는 새마다 정확히 한 번씩 증가합니다. 어쩌면 당신은 아마도'update()'나'position()'함수 같은 다른 곳에서'incrementScore()'를 호출하는 것처럼 들릴 것입니다. 'SKAction.run()'에 의해서만 호출되고 다른 곳에서는 호출되지 않도록하십시오. – Robert

+1

그건 정확히 무슨 일이 있었는지, 내 질문에 대한 두 답변을했습니다. + 로버트! – LukeTerzich

관련 문제