2017-04-15 4 views
0

사용자가 선택할 수 있습니다. Swift In App 사용자가 게임을하는 동안 사용할 수있는 다른 유형의 차량을 구입할 때 사용할 수있는 "동전"을 구입할 수있는 옵션이 사용자가 다시 값을 매길 수 있습니다.

동전의 응용 프로그램에서 구매에 대한 코드입니다 :이 구매 완벽하게 작동하고 구입이 완료되면 coinScore이 증가

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { 

    for transaction in transactions { 

     switch (transaction.transactionState) { 

     case .purchased: 
      SKPaymentQueue.default().finishTransaction(transaction) 
      print("Purchased") 

      let oldCoin = UserDefaults.standard.integer(forKey: "COINSCORE") 
      let newCoin = oldCoin + 500 

      UserDefaults.standard.set(newCoin, forKey: "COINSCORE") 
      UserDefaults.standard.synchronize() 
      coinLabel.removeFromParent()     
      createCoinScore() 

      // apply purchased here and store info in userDefaults 
     case .failed: 
      SKPaymentQueue.default().finishTransaction(transaction) 
      print("Failed") 
     default: 
      break 

     } 
    } 
} 

.

문제는 플레이어가 차량을 구매하기에 충분할 때 증가한 coinScore가 앱을 다시로드하거나 장면을 변경하고 돌아 오는 중로드 할 때까지 등록되지 않은 것입니다. coinScore 값에 도시되어 있지만, 구입 후

if(atPoint(location) == greyship2){ 

      if coinScore > 20 { 
       let oldValue = UserDefaults.standard.integer(forKey: "COINSCORE") 
       let newValue = oldValue - 20 

       UserDefaults.standard.set(newValue, forKey: "COINSCORE") 
       UserDefaults.standard.set(true, forKey: "ship2") 
       UserDefaults.standard.synchronize() 

       coinLabel.removeFromParent() 
       coinImage1.removeFromParent() 
       coinLabel1.removeFromParent() 

       createCoinScore() 



       greyship2.setScale(0) 
       greyship2.removeFromParent() 

       let ship2Texture = SKTexture(imageNamed: "ship2.png") 
       ship2 = SKSpriteNode(texture: ship2Texture) 
       ship2.position = CGPoint(x: self.frame.midX - 150, y: self.frame.midY) 
       ship2.setScale(1) 
       self.addChild(ship2) 
       break //finish the touchesbegan call 
      } 

이 플레이어가 차량을 구입할 수있는 코드가

var coinScore = UserDefaults().integer(forKey: "COINSCORE") 

:

coinScore가되도록 변수로 추가 보기가 즉시 업데이트되어 사용자가 greyShip2를 클릭하여 앱을 새로 고침 할 때까지 구입할 수 없습니다.

답변

1

당신이 해결책을 찾았 기 때문에 기쁘게 생각합니다. UserDefaults에 읽고 쓰는 더 좋은 방법을 제안하고 싶습니다.

var <anyVariableName>: String!{ 
get { 
    var value = "" 
    if NSUserDefaults.standardUserDefaults().valueForKey(UserDefaultsKey.USER_ID_STORED) != nil { 
     value = NSUserDefaults.standardUserDefaults().valueForKey(UserDefaultsKey.USER_ID_STORED) as! String 
    } 
    return value 
} 

set(value) { 
    NSUserDefaults.standardUserDefaults().setValue(value, forKey: UserDefaultsKey.USER_ID_STORED) 
} 

} 

이 읽고이 it.Hope을 작성하는 당신에게 지금 바로이 변수에 액세스 할 수 있습니다 읽고 it.You 쓸 때마다 UserDefaults의 인스턴스를 생성의 문제를 저장은

하는 데 도움이
0

문제를 해결할 수있었습니다.

coinScore 변수가 곧바로 업데이트되지 않는 것 같습니다.

if coinScore > 20 { 

if UserDefaults().integer(forKey: "COINSCORE") > 20 { 

에 희망이 사람이 내 대답에 확장 할 수 있습니다 : 내가 무슨 짓을했는지

은 변화이다.