2016-03-28 6 views
0

私は画面の上部から四角いドロップをしようとしていました。しかし、それが半分になると画面からはね返ります。私は画面の中央にオブジェクトを作成しませんでした。なぜスクリーンの中央でバウンスしているのか分かりません。ここでSKSpriteNodeはSwiftで作成しなかったもののバウンス

は、コードを実行している私のビデオへのリンクです:http://sendvid.com/enm9l1np

ここでは、コードです:

import SpriteKit 

class GameScene: SKScene, SKPhysicsContactDelegate { 

    var animator : UIDynamicAnimator? 
    let BlueSquare = SKSpriteNode() 
    let RedSquare = SKSpriteNode() 
    var scorenumber = 0 
    var Ground = SKSpriteNode() 

    override func didMoveToView(view: SKView) { 
     /* Setup your scene here */ 
     physicsWorld.gravity = CGVector(dx: 1.0, dy: -9.0) 

     let borderBody = SKPhysicsBody(edgeLoopFromRect: self.frame) 
     // 2. Set the friction of that physicsBody to 0 
     borderBody.friction = 0 
     // 3. Set physicsBody of scene to borderBody 
     self.physicsBody = borderBody 





     let width = UInt32(self.frame.size.width) 

     let X = arc4random() % width 


     Ground = SKSpriteNode(imageNamed: "Ground") 
     Ground.setScale(1.0) 
     Ground.position = CGPoint(x: self.frame.width/2, y: 5) 
     Ground.physicsBody = SKPhysicsBody(rectangleOfSize: Ground.size) 
     Ground.physicsBody!.affectedByGravity = false 
     Ground.physicsBody!.dynamic = false 

     Ground.zPosition = 3 

     self.addChild(Ground) 


     //INizialize 
     animator = UIDynamicAnimator(referenceView: self.view!) 

     //Add Gravity 

     //animator?.addBehavior(gravity, sprite) 




     BlueSquare.size = CGSize(width: 100, height: 100) 
     BlueSquare.position = CGPoint(x: CGFloat(X), y: 1000) 
     BlueSquare.physicsBody?.affectedByGravity = true 
     BlueSquare.physicsBody?.dynamic = false 
     BlueSquare.name = "bluecube" 
     BlueSquare.physicsBody = SKPhysicsBody(circleOfRadius: 20) 
     BlueSquare.color = SKColor.blueColor() 
     // BlueSquare.physicsBody?.velocity = CGVectorMake(0, 0) 

     //BlueSquare.physicsBody?.applyImpulse(CGVectorMake(0, -90)) 
     self.addChild(BlueSquare) 

     let X2 = arc4random() % width 
     RedSquare.size = CGSize(width: 100, height: 100) 
     RedSquare.position = CGPoint(x: CGFloat(X2), y: 1000) 
     RedSquare.physicsBody?.affectedByGravity = true 
     RedSquare.physicsBody?.dynamic = true 
     RedSquare.name = "redcube" 
     RedSquare.physicsBody = SKPhysicsBody(circleOfRadius: 20) 
     RedSquare.hidden = false 

     RedSquare.color = SKColor.redColor() 

     self.addChild(RedSquare) 




     var gameTimer = NSTimer!() 
     gameTimer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "spawning1", userInfo: nil, repeats: true) 

    } 



    func spawning1() { 


    } 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     /* Called when a touch begins */ 

     for touch in touches { 
      // let location = touch.locationInNode(self) 
      let currentPoint = touch.locationInNode(self) 
      let currentNode = nodeAtPoint(currentPoint) 
      let nodeName: String? = currentNode.name 


      if nodeName == "bluecube" { 
       BlueSquare.hidden = true 

       score() 
      } 

      if nodeName == "redcube" { 
       RedSquare.hidden = true 

       score() 
      } 

     } 
    } 

    func score() { 
     scorenumber++ 
     print(scorenumber) 
    } 

    override func update(currentTime: CFTimeInterval) { 
     /* Called before each frame is rendered */ 
     if CGRectIntersectsRect(RedSquare.frame, Ground.frame) { 
     RedSquare.position = CGPoint(x: RedSquare.position.x, y: RedSquare.position.y + 10) 
     } 
    } 
} 
+0

大文字で始まる変数名は使用しないでください。変数名(およびメソッド名)は 'camelCase'、クラス名は 'CamelCase'です。変数名はクラス名であると考えているため、フォーマッタは変数名を青で書いていることがわかります。 – Hamish

答えて

2

あなたのコードは少し厄介なので)それを介して

1を行くことができますまず、GameViewController.swiftで、最初のシーンを呼び出す前にこのプロパティを設定する必要があります。

skView.showsPhysics = true 

を使用すると、テスト時に視覚的に身体を確認できます。

2)SpriteKitゲームにはNSTimersを使用しないでください。代わりにSKActions.waitForDurationを使用してください。

let timerAction1 = SKAction.waitForDuration(0.5) 
let timerAction2 = SKAction.runBlock(spawning1) 
let timerSequence = SKAction.sequence([timerAction1, timerAction2]) 
runAction(SKAction.repeatActionForever(timerSequence)) 

あなたは、単にrunAction関数にキー

runAction(SKAction.repeatActionForever(timerSequence), withKey: "SpawnTimer") 

と、これは一見するとそう

removeActionForKey("SpawnTimer") 

のようにそれを削除するよりもを与えるよりも、ゲームプレイ中のある時点でタイマーを無効にする必要がある場合より多くのコードに見えるかもしれませんが、私を信じて、そのスプライトキットゲームのためのより良い方法です。 NSTimersは、シーンを一時停止するときに一時停止しないでください。そうしないと、シーンの切り替えに問題が発生する可能性があります。 SpriteKit APIを可能な限り使用する方が常に優れています。あなたは物理体

....physicsBody!.affectedByGravity.... 

使用アンラップ力あるいくつかのスプライトで

3)?代わりに。

....physicsBody?.affectedByGravity.... 

通常、この場合のphysicsBodyのようなオプションを扱うときは、Swiftでは常に?コンパイラがあなたを許すときはいつでも。あなたの体の一部に

4)あなたが実際にそれが実際の問題に今、この

BlueSquare.physicsBody = SKPhysicsBody(circleOfRadius: 20) 
    BlueSquare.physicsBody?.affectedByGravity = true 
    BlueSquare.physicsBody?.dynamic = false 

ようになっているはずのオブジェクトに物理ボディ

BlueSquare.physicsBody?.affectedByGravity = true 
    BlueSquare.physicsBody?.dynamic = false 
    BlueSquare.physicsBody = SKPhysicsBody(circleOfRadius: 20) // WRONG SPOT 

を与えている前に、物理プロパティを設定しています私はあなたの問題があなたのシーンのサイズであると信じています。あなたがシーンに与えた物理的な境界線よりも、デバイスにフィットするようにシーンを拡大していない場合、あなたが期待している大きさにならないでしょう。デフォルトのシーンサイズ(GameScene.sks)は1024x768(iPadのポートレート解像度)です。あなたのゲームは風景モードとiPhone上にあるので、あなたのシーンはトリミングされるでしょう。シーンのスケールモードは、これらの記事

http://blog.infinitecortex.com/2014/01/spritekit-understanding-skscene-scalemode/

https://www.raywenderlich.com/49695/sprite-kit-tutorial-making-a-universal-app-part-1

私はシーンのサイズに関しては、最近、同様の質問に答えをチェックについて 続きを読むには、それはまた、あなた

How to change SKscene size

を助けるかもしれません

あなたが素早く学んでいるのであれば、ドキュメントに従うことをお勧めします。 BlueSquareのようなプロパティは大文字で始めるべきではありません。クラス、構造体、プロトコルだけが大文字で始まる必要があります。

希望します。

関連する問題