2017-01-04 5 views
2

タップして画面上をドラッグすると、自分のSKSpritenodeをスケールアップ(拡大)します。ユーザがタッチ入力を取り除くと、最後の位置を縮小する必要があります。これは私がこの効果を達成するために、今使っているコードです:タップまたはドラッグが一貫して機能しないときにノードを縮やす

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     let location = touch.location(in: self) 
     let card = atPoint(location) as? Card 
     if card?.cardType == .main{ 
      card?.zPosition = 30 
      card?.run(SKAction.scale(to: 1.3, duration: 0.15)) 
     } 
    } 
} 

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     let location = touch.location(in: self) 
     let card = atPoint(location) as? Card 
     if card?.cardType == .main{ 
      card?.zPosition = 30 
      card?.removeFromParent() 
      addChild(card!) 
      card?.run(SKAction.scale(to: 1.0, duration: 0.15)) 
     } 
    } 
} 

カードがSKSpriteNodeから継承私が定義したクラスです。

問題は、スプライトノードに触れるとスケールアップしないことがありますが、それ以外のときはスケールが上がらないことがあります。私がそれらをドラッグすると、アニメーションが極端に遅いようです。また、ノードを落とす(タッチ入力を取り除く)と、スケールダウン効果が一貫して発生しません(時にはそうでない場合もあります)。何が起こっている?皆さんにもっとソースコードが必要な場合は、私に教えてください。

+0

スケーリングの問題については、SKActionsを積み重ねています。前のアクションを削除するか、キーを割り当てます。 – Knight0fDragon

+0

あなたのドラッグの問題については、私は 'touchesMoved'関数を見ませんが、ここを見てくださいhttp://stackoverflow.com/questions/41179326/moving-multiple-nodes-at-once-from-touch-with-spritekit/41185256 #41185256ドラッグを扱う方法について – Knight0fDragon

+0

あなたのletとifを組み合わせて、オプションの '?'を取り除くこともできます。 'もしlet card = atPoint(location)なら? Card.cardType == .main'、そしてあなたの触れた終わりのメソッドで、removeとaddをする代わりに 'card.moveToParent(self)'を実行してください – Knight0fDragon

答えて

2

この回答をコピーして貼り付けたり、自分で作業したり、この回答とコードを比較したりしないでください。スケーリングの問題を修正する方法

:実行アクションを呼び出すとき

、新しいアクションが前のアクションをキャンセルしていないので、何が起こっていることはあなたが競合することができ、同時に両方のアクションを実行していています。代わりに、キーを使用して以前の操作を削除します。ドラッグ問題解決する方法

あなたはタッチでドラッグされているものをノード保持する必要があるメソッドを開始しました。あなたがあなたのドラッグをするとき、あなたはどんな位置を設定するのかを知るでしょう。

また、コードを整理して行を減らし、 '?'あなたの変数呼び出しの多くで。行く前に?または!あなたの問題を解決するための変数で、コードの流れを処理するより良い方法があるかどうかを確認してください。つかいます !あなたが何も起こり得ないことを100%保証することができ、一時変数でラップするのは非効率的であるときだけです。つかいます ?変数がnilであってもコードを続行することを期待していて、一時変数をラップするのに非効率的な場合のみです。

作業する関数と同じスコープ内に変数が必要な場合は、guardを使用することを検討してください。ガードの仕組みは、特定の基準が満たされていない場合は現在のスコープを終了します。たとえば、このポイントを超えてカードが存在しなければならないコード内のポイントにヒットした場合は、guard let card = atPoint(location) as? Cardを実行します。ガードについて詳しくは、http://nshipster.com/guard-and-defer/を参照してください。

var movableCard : Card? 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     let location = touch.location(in: self) 

     if let card = atPoint(location) as? Card, card.cardType == .main{ 
      card.zPosition = 30 
      movableCard = card 
      //Not sure what node this card is suppose to move to 
      card.run(SKAction.scale(to: 1.3, duration: 0.15),withKey:"scaling") 
     } 
    } 
} 

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     let location = touch.location(in: self) 
     if let card = movableCard{ 

      card.position = location 
     } 
    } 
} 
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     let location = touch.location(in: self) 

     if let card = movableCard{ 
      card.zPosition = 30 
      card.moveToParent(self) 
      movableCard = nil 
      card.run(SKAction.scale(to: 1.0, duration: 0.15),withKey:"scaling") 
     } 
    } 
} 
+0

詳細な答えをありがとう! – Venkat

関連する問題