노드

2017-01-15 1 views
3

를 이동하지 (스위프트 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) { 




    } 
} 

이 코드는하지만 ... 난 단지 캔트, 저 장면 주위에 "점"을 끌 수 있도록 설계되었습니다! 그것은 움직이지 않을 것이다! 온라인에서 보았지만 아무것도 찾을 수 없습니다. 이 코드를 새로운 프로젝트에 붙여 넣으려고했는데 거기에서 작업했지만 제 "점"노드를 삭제하고 바꾸는 것조차도 내 주 프로젝트에서 도움이되지 않는 것 같습니다.

그래서 ... 어떤 아이디어입니까?

+0

은 말 그대로 미친 –

답변

3

Confused은 이미 모든 것을 말했습니다. 당신의 문제에 대해 알아야합니다. 코드에 도움이되는 정보를 추가하려고합니다. 우선, self.childNode(withName으로 노드를 검색 할 때 선택적 바인딩을 사용해야하므로이 노드가 존재하지 않으면 프로젝트가 중단되지 않습니다. 그런 다음 Confused의 설명에 따라 작업을 호출하기 전에 컨트롤을 추가하여 작업이 아직 실행되고 있지 않은지 확인해야합니다.

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) 
     } 
    } 
} 

출력 : 는 여기 아래의 예를 확인

enter image description here

+0

감사 하겠어을! 문제 해결됨. if 문이 무엇인지 물어볼 수 있습니다 : "if object.action (forKey :"objectMove ") == nil {"does? –

+0

물론,이 조건 컨트롤은 객체가이 특정 키를 사용하여 동작하는 경우 또는 그렇지 않은 경우 (결과가 nil이므로), 해당 코드에서이 특정 키를 가진 동작이없는 경우 새 동작을 시작할 수 있습니다 .. –

+0

Ohhhh 좋아, 이해했다. 감사! –

3

새 프로젝트에서 베어 본 프로젝트에서 작동하고 풀러 프로젝트에서는 작동하지 않는다는 사실은 풀러 프로젝트에 문제가 있음을 나타냅니다. 그것을 흘끗 보지 않고서, 실제로 잘못되어 가고있는 것을 말하기는 꽤 어렵습니다.

내게 특이한 점은 SK33ction을 사용하여 touchesMoved()으로 이동하는 것입니다. SKActions의 작동 방식에 대해 생각하면 터치 스크린이 어떤 위치에서든 변화하는 속도로 새로운 이동 액션을 지속적으로 추가 할 것입니다. 이것은 (거의 항상) 0.3 초보다 훨씬 빠릅니다. 0.016 초와 비슷합니다. 그래서 이것은 모든면에서 문제를 일으킬 것입니다.

GameScene의 touchesMoved()에 무엇이 있는지 확인하기 위해 무언가가 필요합니다. 그리고 나서 점을 만져서 구체적으로 이동하십시오. 이것은 내가 당신의 "대상"이라고 생각합니다.

더 간단한 방법은 도트 인스턴스를 나타내고 생성하는 SKSpriteNode의 하위 클래스에서 touchesMoved를 사용하는 것일 수 있습니다.