swift - Nodos que no se mueven
xcode sprite-kit (2)
El hecho de que funcione en un nuevo proyecto barebones y no en su proyecto más completo indica que el problema está en el proyecto más completo. Sin un atisbo de eso, es bastante difícil decir qué está yendo realmente mal.
Curiosamente, para mí, es el uso de SKAction para hacer el movimiento en touchesMoved()
. Si piensas en esto en términos de cómo funciona SKActions, continuamente estás agregando nuevas acciones de movimiento, al ritmo que la pantalla táctil capte los cambios en su posición. Esto es (casi siempre) mucho más rápido que 0.3 segundos. Más como 0.016 segundos. Entonces, esto debería estar causando todo tipo de problemas, por derecho propio.
Además, necesitas algo en TouchesMoved () de GameScene para determinar qué se está tocando, y luego, basándote en tocar el punto, moverlo, específicamente. Esto, supongo, es su "objeto".
Una forma más simple de hacer esto podría ser usar touchesMoved en una subclase de SKSpriteNode que representa y crea su instancia de punto.
(Swift 3)
import SpriteKit
import GameplayKit
class GameScene: SKScene {
var object = SKSpriteNode()
override func didMove(to view: SKView) {
object = self.childNode(withName: "dot") as! SKSpriteNode
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let location = touch.location(in: self)
object.run(SKAction.move(to: location, duration: 0.3))
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let location = touch.location(in: self)
object.run(SKAction.move(to: location, duration: 0.3))
}
}
override func update(_ currentTime: TimeInterval) {
}
}
Este código está diseñado para permitirme arrastrar un "punto" alrededor de la escena, sin embargo ... ¡No puedo! ¡No se moverá! Lo busqué en línea, pero no puedo encontrar nada. Traté de pegar este código en un nuevo proyecto, y funcionó allí, pero incluso eliminar y reemplazar mi nodo "punto" no parece ayudar en mi proyecto principal.
Entonces ... alguna idea?
Confused ya ha dicho todo lo que debes saber sobre tu problema. Intento agregar detalles que te ayuden con el código. En primer lugar, debe usar un enlace opcional cuando busque un nodo con self.childNode(withName
modo que si este nodo no existe, su proyecto no se cuelga. Entonces, como se explica en Confused, debe agregar controles antes de llamar a sus acciones para asegúrese de que su acción no se esté ejecutando. A continuación, hago un ejemplo:
import SpriteKit
class GameScene: SKScene {
var object = SKSpriteNode.init(color: .red, size: CGSize(width:100,height:100))
override func didMove(to view: SKView) {
if let sprite = self.childNode(withName: "//dot") as? SKSpriteNode {
object = sprite
} else { //dot not exist so I draw a red square..
addChild(object)
}
object.position = CGPoint(x:self.frame.midX,y:self.frame.midY)
}
func makeMoves(_ destination: CGPoint) {
if object.action(forKey: "objectMove") == nil {
object.run(SKAction.move(to: destination, duration: 0.3),withKey:"objectMove")
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let location = touch.location(in: self)
makeMoves(location)
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let location = touch.location(in: self)
makeMoves(location)
}
}
}
Salida :