¿Cómo lanzar SKSpriteNode?

Entonces, básicamente, en mi juego, necesito lanzar o lanzar un object. Hasta ahora tengo un sprite, se puede arrastrar pero no se puede lanzar. la idea de los juegos es lanzar un sprite para colisionar con otro sprite. Quiero el sprite al que llamaremos testNode, para mover la forma en que el usuario lo arrojó

es decir, cuando suelto el sprite quiero que continúe en la dirección en que lo moví. He pasado años tratando de resolver esto, pero no puedo. Estoy usando SpriteKit para iOS 8+. Si alguien puede ayudar, por favor.

Hay un video que vi pero fue con GameSalad, que es otra historia. Puedes echar un vistazo

(Responder si puede necesitar más contacto)

import Foundation; import SpriteKit; class Level:SKScene { TestNode:Test? //Test is a class I made //Removed the update and touches began due to it being irrelevant to what I need help with. override func didMoveToView(view: SKView){ testNode = Fruit(imageNamed: "apple_idle") testNode?.position = CGPointMake(60, 294) testNode?.xScale = 0.5 testNode?.yScale = 0.5 self.addChild(testNode!) } override func touchesMoved(touches: NSSet, withEvent event: UIEvent) { var nodeTouched = SKNode() var currentNodeTouched = SKNode() for touch: AnyObject in touches { let location = touch.locationInNode(self) nodeTouched = self.nodeAtPoint(location) testNode?.position = location } } override func touchesEnded(touches: NSSet, withEvent event: UIEvent) { var touch: UITouch = touches.anyObject() as UITouch var location: CGPoint = touch.locationInNode(self) as CGPoint } 

Aquí hay un ejemplo rápido que escribí sobre mover un sprite con el toque simulando su velocidad en el ciclo del juego en lugar de establecer la position directamente. Esto hace que el sprite sea más dynamic (es decir, puedes "tirarlo" y dejar que interactúe con otros cuerpos físicos cuando arrastras al sprite). No se necesitan cálculos angulares, simplemente estoy calculando la velocidad necesaria para mover el sprite a la position táctil durante un intervalo de time. En este caso, configuré el time como 1/60 para que el movimiento se aplique instantáneamente, por lo que el object parece ser muy sensible.

 import SpriteKit class GameScene: SKScene { var sprite: SKSpriteNode! var touchPoint: CGPoint = CGPoint() var touching: Bool = false override func didMoveToView(view: SKView) { self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame) sprite = SKSpriteNode(color: UIColor.networkingColor(), size: CGSize(width: 50, height: 50)) sprite.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size) sprite.position = CGPoint(x: self.size.width/2.0, y: self.size.height/2.0) self.addChild(sprite) } override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { let touch = touches.first as! UITouch let location = touch.locationInNode(self) if sprite.frame.contains(location) { touchPoint = location touching = true } } override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) { let touch = touches.first as! UITouch let location = touch.locationInNode(self) touchPoint = location } override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) { touching = false } override func update(currentTime: CFTimeInterval) { if touching { let dt:CGFloat = 1.0/60.0 let distance = CGVector(dx: touchPoint.x-sprite.position.x, dy: touchPoint.y-sprite.position.y) let velocity = CGVector(dx: distance.dx/dt, dy: distance.dy/dt) sprite.physicsBody!.velocity=velocity } } } 

introduzca la descripción de la imagen aquí

Puede afinar los cálculos de los phyiscs para get el efecto deseado que está buscando. Pero este código debería ser suficiente para comenzar. Algunas mejoras que podría pensar posiblemente limiten la velocidad para que el object no pueda moverse demasiado rápido cuando se libere. Agregando un retraso al toque arrastre para que mover el sprite pero luego detenerse accidentalmente corto al final continúe lanzando el object.

Si estás arrastrando el sprite, entonces esto no debería ser muy difícil. Parece que necesitas agregar algo de física a tu juego.

agregue esto a testNode después de configurar yScale

 testNode.physicsBody = SKPhysicsBody(rectangleOfSize: testNode.size) 

ahora corre el juego debería ver el drop de testNode en la parte inferior de la pantalla. No quieres que eso ocurra, entonces haremos que el borde de la pantalla actúe como un cuerpo de física.

Agregue esto en la parte superior de didMoveToView

 self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame) 

Esto hará que los bordes de la pantalla contengan su testNode. deberías poder recogerlo y soltarlo ahora

es posible que tengas que ajustar un poco esta fórmula para tirar realmente el sprite.

probablemente tengas que comparar tu última position de toque con tu position de toque actual, obtén el ángulo entre ellos y aplica un impulso al sprite.