2016-07-22 5 views
2

Я пытаюсь создать небольшую игру, а там есть труба, и я хочу переместить эту трубу вместе с осью y, я хочу делать thins для пальца салфетки, я пытался сделать это с помощью прикосновений началось, но его не выглядит гладким, поэтому я попытался использовать uipangesture, но не знакомы с интеграцией спрайтов,Пытается переместить/перетащить SKSpriteNode по оси y

может кто-то помочь мне для того чтобы достигнуть этого

class GameScene: SKScene,SKPhysicsContactDelegate { 


var pipeTextureUp:SKTexture! 
var pipeTextureDown:SKTexture! 

var pipeUp:SKSpriteNode! 
var pipeDown:SKSpriteNode! 

var circleTouch: UITouch? 

var verticalPipeGap:Double = 60.0 


var moveStatus: Bool! 

override func didMoveToView(view: SKView) { 
    /* Setup your scene here */ 

    backgroundColor = SKColor.whiteColor() 

    //set the gravity 
    self.physicsWorld.gravity = CGVector(dx: 0.0, dy: 0.0) 
    self.physicsWorld.contactDelegate = self 

    //first create the pipe in a random location 
    pipeTextureUp = SKTexture(imageNamed: "PipeUp") 
    pipeTextureUp.filteringMode = .Nearest 

    pipeTextureDown = SKTexture(imageNamed: "PipeDown") 
    pipeTextureDown.filteringMode = .Nearest 

    pipeUp = SKSpriteNode(texture: pipeTextureUp) 
    pipeUp.setScale(2.0) 
    pipeUp.name = "pipeUp" 
    pipeUp.position = CGPoint(x: size.width * 0.9, y: 0.0) 

    pipeDown = SKSpriteNode(texture: pipeTextureDown) 
    pipeDown.setScale(2.0) 
    pipeDown.name = "pipeDown" 
    pipeDown.position = CGPoint(x: Double(size.width) * 0.9 , y: Double(pipeDown.size.height) + verticalPipeGap) 

    //addChild(pipeDown) 
    addChild(pipeUp) 


} 




func didBeginContact(contact: SKPhysicsContact) { 


} 


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


    let touch:UITouch = touches.first! 
    let positionInScene = touch.locationInNode(self) 
    let touchedNode = self.nodeAtPoint(positionInScene) 

    if let name = touchedNode.name 
    { 
     if (name == "pipeUp" || name == "pipeDown") 
     { 


      print("touches started") 
      moveStatus = true 
      circleTouch = touch 
     } 
    } 

} 

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    let touch:UITouch = touches.first! 
    let positionInScene = touch.locationInNode(self) 
    let touchedNode = self.nodeAtPoint(positionInScene) 



    print(positionInScene) 

    if let name = touchedNode.name 
    { 
     if (name == "pipeUp" || name == "pipeDown") 
     { 
      //let fingerPoint = CGPoint(x: size.width * 0.9, y: 0.3) 

       let actionUpMove:SKAction = SKAction.moveToY(positionInScene.y, duration: 1.0) 
       pipeUp.runAction(actionUpMove) 
       pipeUp.position.y = positionInScene.y 

     } 
    } 

} 


override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    let touch:UITouch = touches.first! 
    let positionInScene = touch.locationInNode(self) 
    let touchedNode = self.nodeAtPoint(positionInScene) 

    if let name = touchedNode.name 
    { 
     if (name == "pipeUp" || name == "pipeDown") 
     { 
      //let fingerPoint = CGPoint(x: size.width * 0.9, y: 0.3) 



      circleTouch = nil 
     } 
    } 



} 

}

ответ

0

UPDATE:, по-видимому, это то, что я должен был сделать,

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    let touch:UITouch = touches.first! 
    let positionInScene = touch.locationInNode(self) 
    let touchedNode = self.nodeAtPoint(positionInScene) 

    if let name = touchedNode.name 
    { 
     if (name == "pipeUp" || name == "pipeDown") 
     { 
      handleTouch(touches.first!, name: name) 
     } 
    } 
} 

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    let touch:UITouch = touches.first! 
    let positionInScene = touch.locationInNode(self) 
    let touchedNode = self.nodeAtPoint(positionInScene) 

    if let name = touchedNode.name 
    { 
     if (name == "pipeUp" || name == "pipeDown") 
     { 
      handleTouch(touches.first!, name: name) 
     } 
    } 

} 

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    let touch:UITouch = touches.first! 
    let positionInScene = touch.locationInNode(self) 
    let touchedNode = self.nodeAtPoint(positionInScene) 

    if let name = touchedNode.name 
    { 
     if (name == "pipeUp" || name == "pipeDown" ) 
     { 
      handleTouch(touches.first!, name: name) 
     } 
    } 

} 

func handleTouch(touch: UITouch , name : String) { 

    let location = touch.locationInNode(self) // get the current point 
    let node = self.nodeAtPoint(location) //get the current node based on the touched location 
    let previousLocation = touch.previousLocationInNode(self) //get the previous location in node 

    let diff = location.y - previousLocation.y; //get the different of location 
    let newPosition = CGPointMake(node.position.x, node.position.y + diff); 

    var newPipeDownPosition :CGPoint; 

    if (name == "pipeDown" ) 
    { 
     newPipeDownPosition = CGPointMake(self.pipeUp.position.x, self.pipeUp.position.y + diff); 

     pipeDown.position.y = newPosition.y 
     pipeUp.position.y = newPipeDownPosition.y 

    }else{ 
     newPipeDownPosition = CGPointMake(self.pipeDown.position.x, self.pipeDown.position.y + diff); 

     pipeUp.position.y = newPosition.y 
     pipeDown.position.y = newPipeDownPosition.y 

    } 

} 

теперь движется труба в соответствии с верхним и нижним направлением

1

Если вы хотите перехватить вашу прокрутку по координате Y, d поместить этот код в didMoveToView:

 let swipeUp:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(GameScene.swipedUp(_:))) 
     swipeUp.direction = .Up 
     swipeUp.cancelsTouchesInView = true 
     swipeUp.delaysTouchesBegan = true 
     view.addGestureRecognizer(swipeUp) 


     let swipeDown:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(GameScene.swipedDown(_:))) 
     swipeDown.direction = .Down 
     swipeDown.cancelsTouchesInView = true 
     swipeDown.delaysTouchesBegan = true 
     view.addGestureRecognizer(swipeDown) 

Тогда ваши методы:

func swipedUp(sender:UISwipeGestureRecognizer){ 
     print("swiped up") 
} 
func swipedDown(sender:UISwipeGestureRecognizer){ 
     print("swiped down") 
} 
+0

но как я могу перемещать трубку? ct в swipedUp funtion, ?? –

+0

Зависит от вашей игры, если вы используете физику, лучше перемещать свой объект с помощью addImpulse или корректировать скорость, иначе, если у вас есть статический объект, вы можете использовать moveTo с точкой назначения. –

+0

мой объект os static, но moveTo не дает мне плавного перехода, который я уже пробовал с ним, представляю себе его трубу, и я могу перемещать трубу по оси y в горизонтальном режиме, могу ли я легко использовать addImpulse для этого? –

Смежные вопросы