그럼 아마 비슷한 방식으로했을 것이고 SKAction.follow를 사용하는 것이 해결책이라고 생각합니다.
그러나 코드에서 수행 할 수있는 몇 가지 개선 사항이 있습니다. 첫 번째는 당신이 단지 하나의 동작으로 구성되어 있기 때문에 순서로 SKAction을 쓸 필요가 없다는 것입니다, 그래서 당신이 당신의 코드를 단순화 수 :
let squarePath = UIBezierPath(rect: CGRect(x: 0, y: 0, width: 200, height: 200))
let followAction = SKAction.follow(path: squarePath.cgPath, duration: 5.0)
dish?.run(followAction)
지금 중요한있는 다른 일이있다, 메모리 사용량을 절약하기 위해 매번 (20 번) 새 접시를 다시 만드는 대신 SKSpriteNode
에 copy()
을 사용하여 많은 복사본을 만들 수 있습니다. 달성해야 할 항목에 따라 물론 각 복사본을 사용자 지정하거나 색이나 위치를 변경하는 등의 작업을 수행 할 수 있습니다.
당신은 너무처럼 SKSpriteNode의 사본을 만들 수 있습니다
각 접시 복사본의 위치에 대한
import GameplayKit
if let dishCopy = dish?.copy() as? SKSpriteNode {
dishCopy.position = CGPoint(x: GKRandomDistribution(lowestValue: 0, highestValue: 200).nextInt(), y: GKRandomDistribution(lowestValue: 0, highestValue: 500).nextInt())
self.addChild(dishCopy)
}
, 당신은 물론 자신의 값을 조정할 수 있지만, 여기에 내가 GameplayKit과 매우 유용한 임의 사용 값 발생기.
업데이트 :
계속) (복사를 사용하여, 당신은 몇 가지 옵션이있는 동안 당신이 당신의 요리의 각각에 고유 한 이름을 설정하려면.
하나의 가능성은 증가 할 카운터를 사용하여 고유 한 이름을 생성하는 것일 수도 있고 다른 방법으로는 예를 들어 update 메소드에서 currentTime을 사용하는 것일 수도 있습니다.
그러나이 작업을 수행하는 또 다른보다 우아한 방법은 모든 복사본이 어디에 있는지 트랙을 유지하는 것입니다. 모든 것을 저장하는 배열을 만드는 것입니다. 장면 서브 클래스의 상단에
, 다음처럼 요리의 배열을 선언 :
var dishes = [SKSpriteNode]()
을 순간, 그것은 여전히 비어, 당신은 당신이 각을 만들 때 배열에 각 사본을 추가 할 필요가 있도록 그들 :이 같은 많은 복사본을 만들려면
// Create (safely) a dish copy:
if let dishCopy = dish?.copy() as? SKSpriteNode {
// Add the dish copy to the dishes array:
dishes.append(dishCopy)
// And add the dish copy to the world node:
worldNode?.addChild(dishCopy)
}
, 당신은 for loop
을 사용할 수 있습니다, 또는 당신은 당신이 새로운 초밥 접시를 예를 들어 5 초마다 생성 할 것을 지정하여 update(_ currentTime:)
방법으로 재생할 수 있습니다 :).
언제든지이 복사본에 액세스해야한다면 dishes
어레이에 액세스하면됩니다.
예를 들어, 이것은 당신이 (당신이 비록 현장에 추가하면 원래 요리를 처리해야 할 것입니다) 모든 사본을 제거 할 방법은 다음과 같습니다
이
// And just iterate through all of your dish copies:
for dish in dishes {
dish.removeFromParent()
// Do whatever you need here :)
}
그것은 꽤 간단합니다 그리고 당신을 수 있습니다 worldNode
에 추가 한 모든 객체 및/또는 사본을 완벽하게 제어 할 수 있습니다.
다른 질문이 있으면 알려주세요. 기꺼이 도와 드리겠습니다.
오늘 밤에 나는 당신이 당신의 질문에서 이야기하고있는 스시 식당에 갈 것입니다. 작은 기차가있는 식당입니다. 좋은 우연의 일치! : D
고마워. 매우 도움이됩니다. copy()를 사용하여 보았습니다. 그러나 각 요리 거리는 실제 초밥을 자식 노드로 사용할 필요가 있기 때문에 복사 된 인스턴스가 자식 노드를 가질 수 있는지 여부는 확실하지 않았습니다. 각 접시에는 플레이어가 그것을 선택하고 스시를 보충 할 수있는 고유 한 식별자가 있어야하므로 복사 된 인스턴스 인 경우 ID를 알 수있는 방법을 궁금해하고있었습니다. –
@SeongLeem을 매우 환영합니다. 앱에서 구현할 수있는 방법에 대한 자세한 정보를 제공하기 위해 답변을 업데이트했습니다. – Alex
이것은 훌륭합니다. 감사! 장면 대신에 월드 노드의 유스 케이스는 무엇입니까?각 요리법 복사 노드는 연어, 참치 등의 자식 노드가 필요합니다. 그래서 연어 자식 노드를 0을 사용하여 루프를 사용하여 처음 5 개 요리에 할당 할 수 있습니다. <5 {자식 노드 추가}. 그리고 모든 프로그래밍 언어에서 배열은 여러 수준 아래 또는 위로있을 수 있습니다. –