2016-03-28 4 views
0

Ich habe versucht, einen quadratischen Tropfen von der Oberseite des Bildschirms zu machen. Aber wenn es auf halbem Weg ist, springt es vom Bildschirm ab. Ich habe kein Objekt in der Mitte des Bildschirms erstellt. Ich kann nicht verstehen, warum es in der Mitte des Bildschirms springt.SKSpriteNode Prellen von etwas, das ich nicht in Swift erstellt habe

Hier ist der Link zu einem Video von mir den Code ausgeführt wird: http://sendvid.com/enm9l1np

Hier ist der Code:

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

Bitte beginnen Sie nicht Variablennamen mit einem Großbuchstaben. Variablennamen (und Methodennamen) sind 'camelCase', Klassennamen sind 'CamelCase'. Sie können sehen, dass der Formatierer Ihre Variablennamen blau schreibt, weil er glaubt, dass sie ein Klassenname sind. – Hamish

Antwort

2

Ihr Code ist ein bisschen chaotisch, lässt so durchlaufen sie

1) Zunächst sollten Sie in Ihrem GameViewController.swift diese Eigenschaft vor dem Aufruf der ersten Szene setzen.

skView.showsPhysics = true 

, damit Sie Ihren Physikkörper beim Testen visuell sehen können.

2) Verwenden Sie NSTimers nicht für SpriteKit-Spiele, verwenden Sie stattdessen SKActions.waitForDuration.

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

Wenn Sie den Timer an einem gewissen Punkt während des Spiels zu entkräften, als nur die runAction geben einen Schlüssel

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

und als es zu entfernen, wie so

removeActionForKey("SpawnTimer") 

Auf den ersten Blick könnte mehr Code scheinen, aber vertrauen Sie mir, es ist eine bessere Möglichkeit für SpriteKit Spiele. NSTimers pausieren nicht, wenn Sie Ihre Szene pausieren, oder sie können Probleme bei Szenenübergängen verursachen. Es ist immer besser, SpriteKit-APIs so oft wie möglich zu verwenden.

3) Auf einigen Sprites Sie Kraft sind Abwickeln der Physik Körper

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

Verwendung ein? stattdessen.

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

Im Allgemeinen in Swift, wenn Sie mit Extras zu tun hat, wie die physicsBody in diesem Fall immer eine verwenden? wann immer der Compiler das auch zulässt.

4) Auf einige Ihrer Körper Sie Physik Eigenschaften setzen, bevor Sie tatsächlich das Objekt ein Physik Körper geben

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

es so

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

Nun zum eigentlichen Problem aussehen sollte Ich glaube, dein Problem ist mit deiner Szenengröße. Wenn du deine Szene nicht so skalierst, dass sie auf das Gerät passt, wird der physikalische Rand, den du der Szene gegeben hast, nicht so groß sein, wie du es erwartest. Die Standard-Szenengröße (GameScene.sks) ist 1024x768 (iPad-Porträtauflösung). Ihr Spiel befindet sich im Querformat und auf einem iPhone, so dass Ihre Szene beschnitten/gestreckt wird. mehr zu lesen über Szene Skalierungsmodi diese Artikel überprüfen

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

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

antwortete ich eine ähnliche Frage vor kurzem in Bezug auf die Szene Größe, es könnten Sie auch

How to change SKscene size

helfen

Als einen weiteren Seitentipp, wenn Sie schnell lernen, ist es eine gute Übung, der Dokumentation zu folgen, so zum Beispiel Ihre Eigenschaften wie BlueSquare sollten nicht mit einem Großbuchstaben beginnen. Nur Klassen, Strukturen und Protokolle sollten mit Großbuchstaben beginnen.

Hoffe, das hilft

Verwandte Themen