cómo lanzar SKSpriteNode?

Así que básicamente en mi juego necesito lanzar o lanzar un objeto. 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 que llamaremos testNode, para mover cómo lo había lanzado el usuario

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

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

(Responda si necesita 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í de mover un sprite con tacto simulando su velocidad en el bucle del juego en lugar de establecer la posición directamente. Esto hace que el sprite sea más dynamic (es decir, puedes “lanzarlo”, y dejarlo interactuar con otros cuerpos físicos mientras arrastras el sprite). No se necesitan cálculos de angularjs, solo estoy calculando la velocidad necesaria para mover el sprite a la posición táctil durante algún intervalo de tiempo. En este caso, establezco el tiempo como 1/60 para que el movimiento se aplique instantáneamente para que el objeto parezca muy receptivo.

 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.redColor(), 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, 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, withEvent event: UIEvent) { let touch = touches.first as! UITouch let location = touch.locationInNode(self) touchPoint = location } override func touchesEnded(touches: Set, 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 } } } 

enter image description here

Puede ajustar los cálculos de los phyiscs usted mismo para obtener el efecto deseado que está buscando. Pero este código debería ser suficiente para comenzar. Algunas mejoras que podría pensar están limitando la velocidad, por lo que el objeto no puede moverse demasiado rápido cuando se libera. Agregar un retraso al toque y arrastre para que el movimiento del objeto, pero luego detenerse brevemente al final continúe tirando el objeto.

Si está arrastrando el sprite, entonces esto no debería ser demasiado 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 ejecuta el juego. debería ver drop test caer en la parte inferior de la pantalla. No quiere que eso suceda, por lo que 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 esta fórmula un poco para realmente arrojar al sprite.

es probable que tengas que comparar tu última posición táctil con tu posición táctil actual, obtener el ángulo entre esas y aplicar un impulso al sprite.

Aquí está la versión Swift 3.0 / 4.0 de la respuesta

 class GameScene: SKScene { var sprite: SKSpriteNode! var touchPoint: CGPoint = CGPoint() var touching: Bool = false override func didMove(to view: SKView) { let physicsFrame = CGRect(x: 0, y: 50, width: self.frame.size.width, height: self.frame.size.height - 100) self.physicsBody = SKPhysicsBody.init(edgeLoopFrom: physicsFrame) sprite = SKSpriteNode(color: UIColor.red, size: CGSize(width: 50, height: 50)) sprite.physicsBody = SKPhysicsBody.init(rectangleOf: 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, with event: UIEvent?) { let touch = touches.first! let location = touch.location(in:self) if sprite.frame.contains(location) { touchPoint = location touching = true } } override func touchesMoved(_ touches: Set, with event: UIEvent?) { let touch = touches.first! let location = touch.location(in: self) touchPoint = location } override func touchesEnded(_ touches: Set, with event: UIEvent?) { touching = false } override func update(_ currentTime: TimeInterval) { 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 } }}