2017-09-22 9 views
0

나는 SprikeKit을 사용하여 게임을 만드는 법을 배우고 있으며 게임은 스시 기차와 관련이 있습니다.스시 기차 시뮬레이트 - Swift SpriteKit

저는 모든 접시가 움직이는 컨베이어 벨트 위에있는 모양을 시뮬레이션하기 위해 직사각형 경로를 따르는 20 가지의 접시가 있습니다.

몇 가지 스프라이트 노드를 배치하기 위해 장면 편집기를 사용해 보았습니다. 그런 다음 사각형 패스로 이동했습니다. 순간

let dish_1 = self.childNode(withName: "dish_1"); 
let dish_2 = self.childNode(withName: "dish_2"); 

let square = UIBezierPath(rect: CGRect(x: 0, y: 0, width: 200, height: 200)); 
let followSquare = SKAction.follow(square.cgPath, asOffset: true, orientToPath: false, duration: 5.0); 

dish_1?.run(SKAction.sequence([followSquare])) 
dish_2?.run(SKAction.sequence([followSquare])) 

는이 요리 같은 사각형 사용하고 자신의 출발점이 다른 그들이 두 개의 서로 다른 직사각형의 경로에있는 것처럼 그들이 볼 수 있도록 사각형의 위치는 각각의 접시에 상대적입니다.

내가 생각하는 모양을 시뮬레이트하는 합리적인 방법입니까? 내가 묻는 이유는 모든 요리가 같은 길로 움직이는 것처럼 보이게하기 위해서 각 접시의 x, y 위치를 조정해야하며 20 가지 요리와 같을 것입니다.

물리 키트를 사용할 수 있는지 궁금해서 하나의 직사각형 노드가 직사각형 노드 영역 내에있는 한 모든 요리가 경로를 따라 이동하도록합니다.

답변

1

그럼 아마 비슷한 방식으로했을 것이고 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 번) 새 접시를 다시 만드는 대신 SKSpriteNodecopy()을 사용하여 많은 복사본을 만들 수 있습니다. 달성해야 할 항목에 따라 물론 각 복사본을 사용자 지정하거나 색이나 위치를 변경하는 등의 작업을 수행 할 수 있습니다.

당신은 너무처럼 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

+0

고마워. 매우 도움이됩니다. copy()를 사용하여 보았습니다. 그러나 각 요리 거리는 실제 초밥을 자식 노드로 사용할 필요가 있기 때문에 복사 된 인스턴스가 자식 노드를 가질 수 있는지 여부는 확실하지 않았습니다. 각 접시에는 플레이어가 그것을 선택하고 스시를 보충 할 수있는 고유 한 식별자가 있어야하므로 복사 된 인스턴스 인 경우 ID를 알 수있는 방법을 궁금해하고있었습니다. –

+1

@SeongLeem을 매우 환영합니다. 앱에서 구현할 수있는 방법에 대한 자세한 정보를 제공하기 위해 답변을 업데이트했습니다. – Alex

+1

이것은 훌륭합니다. 감사! 장면 대신에 월드 노드의 유스 케이스는 무엇입니까?각 요리법 복사 노드는 연어, 참치 등의 자식 노드가 필요합니다. 그래서 연어 자식 노드를 0을 사용하여 루프를 사용하여 처음 5 개 요리에 할당 할 수 있습니다. <5 {자식 노드 추가}. 그리고 모든 프로그래밍 언어에서 배열은 여러 수준 아래 또는 위로있을 수 있습니다. –

1

asOffset이 맞지 않습니다. the documentation에 따르면 이것은 정확히 이고 반대 동작은입니다.

예인 경우 경로의 점은 노드의 시작 위치에 대한 상대 오프셋입니다. 아니오 인 경우 노드의 점은 절대 좌표 값입니다.

당신이 질문 한 바와 같이, 각 접시에게 자신의 시작 위치를 기준으로 좌표를 따르지 자신의 사각형 경로를 줄 것이다 true로 설정 대신

 
    v First dish 
     v Second dish 
    O--O-----.---. 
    | |  | | 
    | |  | | 
    '--'-----'---' 
       ^^ Second dish's path 
    ^^ First dish's path 

, 나는 당신이 필요 상상 다시 절대 좌표 - - 절대 좌표의 컨베이어 벨트를 설정 한 다음 다른 것으로 각 요리의 시작 지점을 초기화하고 마지막으로 각 요리의 추적은 말했다 경로 :

 
    v First dish (starting point x=0; y=0) 
     v Second dish (starting point x=20; y=0) 
    O--O-----. 
    |  | 
    |  | 
    '--------' 

    ^^ Single, absolute path 

(초밥 컨베이어 벨트를 시뮬레이션하는 경우 시계 방향으로 이동하고 위의 "첫 번째"및 "두 번째"라는 용어는 기술적으로 거꾸로됩니다. 이것을 교환하는 것은 독자에게 운동으로 남아 있습니다. :-P)

+0

귀하의 통찰력있는 답변에 감사드립니다. 이것은 분명히 갈 길입니다. 죄송합니다. 게임 개발을 처음 접해 보았습니다. 사각형 패스를 절대 좌표로 설정하려면 어떻게해야합니까? 그것은 기본적으로 상대적입니까? –

+1

'follow'호출에서 'asOffset' 매개 변수에 모두 있다고 생각합니다. 이 값을 false로 설정하면 경로 좌표가 절대적임을 나타냅니다. –