0

Ich versuche ein Brettspiel zu bauen, bei dem das Brett aus Sprites besteht und man mit einem SKCamera-Knoten über den Vogelperspektiven-Stil schauen kann. Ich habe den Schwenk, Zoomen und Drehen nach unten, aber sie fühlen sich nicht natürlich an, da, wo immer ich meine Finger auf den Bildschirm lege, er sich um die Mitte des Kameraknotens dreht.Swift: Mittelpunkt der Finger in UIRotationGesture an falscher Stelle in SKView?

Um dies zu beheben, wollte ich einen SKNode erstellen und dies zwischen den Fingern als Anker für die Kamera drehen und zoomen.

Allerdings kann ich nicht die Position des Mittelpunkts der Finger, um mit den richtigen Koordinaten in der Gamescene ausrichten.

Ich habe einige rote Kästen zum Debuggen erstellt und mein Problem finden und sieht aus, als so: Gamescene screenshot

Wo auch immer ich meine Finger in der gesamten Spielszene platzieren Sie es zu drehen, in der Mitte, wo sie es denkt, sollte immer in diesem roten Fleck sein.

Die SKView auf dem Storyboard als SpriteKit Ansicht platziert und an die linken und rechten Rand des Bildschirms mit oberen und unteren padding gebunden ist:

Innerhalb von Viewcontroller: von

@IBOutlet weak var Gameview: SKView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let scene = GameScene(size:Gameview.frame.size) 
     Gameview.presentScene(scene) 
    } 

Innen GameScene.swift, let a = sender.location(in: self.view) scheint zu sein, wo das Problem liegt.

class GameScene: SKScene, UIGestureRecognizerDelegate { 

    var newCamera: SKCameraNode! 

    let rotateRec = UIRotationGestureRecognizer() 
    let zoomRec = UIPinchGestureRecognizer() 
    //let panRec = UIPanGestureRecognizer() 


    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, 
          shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) 
     -> Bool {return true} 



    override func didMove(to view: SKView) { 

     rotateRec.addTarget(self, action: #selector(GameScene.rotatedView (_:))) 
     rotateRec.delegate = self 
     self.view!.addGestureRecognizer(rotateRec) 

     zoomRec.addTarget(self, action: #selector(GameScene.zoomedView (_:))) 
     zoomRec.delegate = self 
     self.view!.addGestureRecognizer(zoomRec) 

     //panRec.addTarget(self, action: #selector(GameScene.pannedView (_:))) 
     //self.view!.addGestureRecognizer(panRec) 


     newCamera = SKCameraNode() 
     newCamera.position = CGPoint(x: self.size.width/2, y: self.size.height/2) 
     self.addChild(newCamera) 
     self.camera = newCamera 

     //drawBoard() 
     //I removed this function as it had nothing to do with the question 

    } 

    @objc func rotatedView(_ sender:UIRotationGestureRecognizer) { 
     print(sender.location(in: self.view)) 
     let square = SKSpriteNode(color: #colorLiteral(red: 0.7450980544, green: 0.1568627506, blue: 0.07450980693, alpha: 1), size: CGSize(width: 10, height: 10)) 
     let a = sender.location(in: self.view) 
     let b = -a.x 
     let c = -a.y 
     let d = CGPoint(x: b, y: c) 


     square.position = d 
     self.addChild(square) 


     newCamera.zRotation += sender.rotation 
     sender.rotation = 0 
     if sender.state == .ended { 
      let rotateAmount = abs(Double(newCamera.zRotation) * Double(180)/Double.pi) 
      let remainder = abs(rotateAmount.truncatingRemainder(dividingBy: 90)) 
      //print(rotateAmount) 
      //print(remainder) 
      if remainder < 10 { 
       newCamera.zRotation = CGFloat((rotateAmount-remainder)*Double.pi/180) 
      } else if remainder > 80 { 
       newCamera.zRotation = CGFloat((rotateAmount-remainder+90)*Double.pi/180) 
      } 

     } 

    } 



    @objc func zoomedView(_ sender:UIPinchGestureRecognizer) { 
     let pinch = SKAction.scale(by: 1/sender.scale, duration: 0.0) 
     newCamera.run(pinch) 
     sender.scale = 1.0 
    } 

    //@objc func pannedView(_ sender:UIPanGestureRecognizer) { 
    // sender.translation(in:) 
    //} 


    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
     for touch in touches { 
      let location = touch.location(in: self) 
      let previousLocation = touch.previousLocation(in: self) 
      let deltaY = location.y - previousLocation.y 
      let deltax = location.x - previousLocation.x 
      newCamera!.position.y -= deltaY 
      newCamera!.position.x -= deltax 
     } 
    } 
} 

Ich habe die Funktion drawboard() entfernt, da sie im Zusammenhang mit der Frage redundant war.

Antwort

0

Sie benötigten, um die Koordinaten von der sender.location zu den Koordinaten in der skview mit den Funktionen in der Seite angezeigt zu konvertieren:

https://developer.apple.com/documentation/spritekit/skscene

->https://developer.apple.com/documentation/spritekit/skscene/1520395-convertpoint

im rotatedview () Funktion, setzen des Codes:

let bluesquare = SKSpriteNode(color: #colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1), size: CGSize(width: 10, height: 10)) 

let a = sender.location(in: self.view) 
bluesquare.position = self.convertPoint(fromView: a) 

self.addChild(bluesquare) 

... wird blaue Sprites hinzufügen, wo die Mitte Ihrer beiden Finger ar e.

Verwandte Themen