2017-09-22 19 views
0

私はSprikeKitを使用してゲームを作成することを学んでおり、ゲームは寿司の列車と関係があります。寿司のシミュレーション - Swift SpriteKit

私は皿が動いているコンベアベルト上にあるという外観をシミュレートするために、矩形のパスに沿って20のディッシュのようなものを持っています。

シェイプエディタを使用してスプライトノードを2つ配置して、正方形のパス上を移動させました。現時点で

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

、その出発点が異なっているように、それらが2つの異なる長方形のパス上にあるようなので、それらが見える2皿は同じ正方形を使用しており、正方形位置は各皿に相対的なものです。

これは、後の外観をシミュレートするための合理的な方法ですか? 私はこれを求めている理由は、すべての料理を同じように動かすように見せるためには、各料理のx、yの位置を微調整する必要があり、それは20個の料理のようになります。

物理キットを使用することが可能かどうか疑問に思っていました。矩形ノード領域内にある限り、1つの矩形ノードですべての料理をパスに沿って移動させることができますか?

答えて

1

私はおそらく同様の方法でそれをやったでしょう。SKAction.followを使うのがここの解決策だと思います。

しかし、あなたのコードでできることがいくつかあります。最初は、それが1つのアクションだけで構成されているので、あなたがこのようにコードを簡素化することができるようにあなたは、シーケンスとしてご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) 

今重要である他の事をされ、あなたのメモリ使用量を節約するために、新しい料理を毎回作成する代わりに(012回)、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と非常に便利なランダムを使用しました値ジェネレータ。

更新:

まだ)(コピーを使用して、あなたはいくつかのオプションを持っていながら、あなたの料理のそれぞれに固有の名前を設定したい場合は

たとえば、増加するカウンタを使用して一意の名前を生成する可能性があります。たとえば、更新メソッドでcurrentTimeを使用する可能性もあります。

これを行うもっとエレガントなもう1つの方法は、すべてのコピーがどこにあるかをトラックに保存することです。すべてを保存する配列を作成することです。シーンサブクラスの上部に

、そのようなあなたの料理の配列を宣言:現時点で

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

これは素晴らしいことです。ありがとう!ここでシーンの代わりにワールドノードのユースケースは何ですか?各ディッシュコピーノードは、サーモン、マグロなどの子ノードを持つ必要があります。私は、最初の5つのディッシュにサーモンの子ノードを割り当てることができると思います。そして、私はどのプログラミング言語でも、配列は複数のレベルを上から下に持つことができると思います。 –

1

asOffsetは正しくありません。 the documentationによると、これはと全く逆の動作が必要です。

YESの場合、パス内のポイントはノードの開始位置に対する相対的なオフセットです。 NOの場合、ノード内のポイントは絶対座標値です。これを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に設定すると、パス座標は絶対座標であることを意味します。 –

関連する問題