2017-06-10 4 views
1

Code:Wie drehe ich ein Farbsprite, indem ich den Finger entlang der Y-Achse in der UNTEREN HÄLFTE des Bildschirms bewege?

for touch in touches{ 
     let location = touch.location(in: self) 
     let maxTouchHeight = self.frame.midY 

     if currentGameType == .wobble{ 
      main.zRotation = (location.y)/512 
      if location.y > maxTouchHeight { return } 
      } 
     } 
    } 

So versuche ich, ein Paddel zu drehen, je nachdem, wo Sie mit dem Finger auf der y-Achse in einer Art von Pong-Spiel. Ich konnte es jedoch nicht so machen, dass es nur in der unteren Hälfte des Bildschirms funktioniert, dh die beiden Extremitäten der Rotation sind ganz oben und ganz unten auf dem Bildschirm, aber ich möchte, dass das obere Ende ganz oben ist die untere Hälfte des Bildschirms. (Haupt ist ein Pong Paddel).

Jede Hilfe ist willkommen :)

+0

Lesen Sie die Xcode-Dokumentation und finden Sie heraus, was die zRotation-Eigenschaft ist. Niemand weiß, was "Main" ist, aber wenn Sie einen Knoten drehen möchten, verwenden Sie SKAction. –

Antwort

1

Nach der Diskussion von Kommentaren und wiederholte Antwort Updates habe ich eine Lösung für Sie. Bitte lassen Sie mich wissen, wenn Fragen:

class GameScene: SKScene { 

    let paddle = SKSpriteNode() 
    let maximumRotation = CGFloat(45) 

    override func didMove(to view: SKView) { 
    paddle.color = .blue 
    paddle.size = CGSize(width: 200, height: 15) 

    let deg45 = CGFloat(0.785398) 
    let degNeg45 = -deg45 

    let constraint = [SKConstraint.zRotation(SKRange(lowerLimit: degNeg45, upperLimit: deg45))] 
    paddle.constraints = constraint 

    addChild(paddle) 
    } 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    guard let location  = touches.first?.location(in: self)   else { return } 
    guard let lastLocation = touches.first?.previousLocation(in: self) else { return } 
    guard location.y < self.frame.midY         else { return } 

    // Our vertical plots: 
    let yVal = location.y 
    let lastY = lastLocation.y 

    // How much we moved in a certain direction this frame: 
    let deltaY = yVal - lastY 

    // This value represents 100% of a 45deg angle: 
    let oneHundredPercent = self.frame.height/2 
    assert(oneHundredPercent != 0) 

    // The % of 100%Val (45degrees) that we moved (in radians): 
    let absY = abs(deltaY) 
    let radToDegFactor = CGFloat(0.01745329252) 
    let multiplier = (absY/oneHundredPercent) * radToDegFactor 

    // I suggest a sensitivity of 2-4: 
    let sensitivity = CGFloat(3) 
    let amountToRotate = maximumRotation * (multiplier * sensitivity) 

    // Rotate the correct amount in the correct direction: 
    if deltaY > 0 { 
     // Rotate counter-clockwise: 
     paddle.run(.rotate(byAngle: amountToRotate, duration: 0)) 
    } else { 
     // Rotate clockwise: 
     paddle.run(.rotate(byAngle: -amountToRotate, duration: 0)) 
    } 
    } 
} 

Öffnen Sie einfach ein neues Projekt und probieren Sie es aus!

Es mag einen einfacheren Weg geben, aber das ist mir in den Sinn gekommen. Es ist auch ein wenig wortreich, also hoffentlich können Sie jeden Prozess Schritt für Schritt sehen.

+0

Danke Kumpel, aber ich denke, das sieht ein wenig zu kompliziert aus, um heute Abend zu tun, da ich mich auf einen deutschen Vortrag vorbereiten muss, eine Präsentation erstellen, die den Code dieses Projekts vorträgt und 2 Design-Papiere heute Abend haha. Aber vielleicht, wenn ich es im Urlaub mache :) Vielen Dank für all die Hilfe, die du mir gegeben hast, gibt es irgendetwas, was ich tun kann, wie dein Profil zu verbessern oder so etwas? – James

+0

@James mailen Sie mir Ihr Projekt: [email protected] Ich werde sehen, ob ich es für Sie implementieren kann Ich habe nichts zu tun, so heute :) – Fluidity

+0

Ich denke nicht, Sie können alles bis 15 Ruf upvote, so Du kannst zurückkommen und das später tun XD Du kannst auf das Häkchen klicken, um "Antwort als Lösung zu akzeptieren" oder was auch immer es sagt @james – Fluidity

0

setzen diese innerhalb Ihrer Berührungen Funktionen:

for touch in touches{ 
    let location = touch.location(in: self) 
    let maxTouchHeight = self.frame.midY 
    if location.y > maxTouchHeight { return } 

    if currentGameType == .wobble{ 
    main.zRotation = (location.y)/512 
    } 
} 
+0

Vielen Dank für die Antwort so bald, ich habe den Code eingegeben, aber ich erhalte einen Fehler seitens des Codes, der sagt: if touch.location.y> maxTouchHeight {return}. Der Fehler sagt "Mehrdeutige Referenz zum Mitglied '(in :)' Irgendwelche Hilfe? – James

+0

@James Entschuldigung, ich habe es behoben. Ich habe vergessen, eine Zeile hinzuzufügen :) – Fluidity

+0

danke, aber das scheint nicht zu sein Problem, wie ich bereits das in meinem Code hatte:/Irgendwelche anderen Vorschläge? – James

1

Soweit nur etwas mit der unteren Hälfte tun, Sie so etwas wie dieses

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 


    if let touch = touches.first { 
     let fingerPosition = touch.location(in: self) 
     //this is the bottom 
     if fingerPosition.y < self.size.height/2 { 
      //just replace print with your own code 
      print("bottom half") 
     } 
     //this is the top half 
     if fingerPosition.y > self.size.width/2 { 
      //you can just leave this as it is or if ever you want to do something with the top part, just add your own code! 
      print("not bottom half") 
     } 

    } 

} 
tun können

Hoffentlich hilft das.

Verwandte Themen