問題タブ [gameplay-kit]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
313 参照

swift - Swift で GKAgentDelegate のプロトコル メソッドが正しくありませんか?

GameplayKit では、プロトコル GKAgentDelegate に準拠したいので、デリゲート メソッドを使用しますfunc agentDidUpdate(agent: GKAgent)

問題は、このメソッドでは、パラメーター エージェントが GKAgent2D ではなく GKAgent として宣言されているagent.positionため、位置プロパティが GKAgent ではなく GKAgent2D にあるため、にアクセスできないことです...

ただし、Objective-C API では、エージェントは GKAgent2D として宣言されます。

助けてください。

0 投票する
0 に答える
1155 参照

sprite-kit - 障害物とエージェントを使用した GameplayKit パスファインディング

私はこの新しいフレームワークについて何日も検索し、その機能のいくつかを利用しようとしましたが... 私には合わないものがいくつかあり、デモボットのソースコードはいくつかの点で役に立ちません、ある種の簡単なチュートリアルが欠けていますが、主な疑問は次のとおりです。

それで、このグラフを描いて接続を確認しようとすると、次のようになります 。 -画面のコーナー部分には常により多くの接続があります(半径はそれに影響しません)

私は自分のゲームで GKComponents を使用していませんが、次のように GKAgents2D を実行してプレイヤーを探してみました。

ここで updateWithDeltaTime メソッドを呼び出すと、彼のデリゲート メソッド: func agentWillUpdate(agent: GKAgent){} func agentDidUpdate(agent: GKAgent){} がエージェントの予期しない値を返します。その位置は意味をなさず、膨大な数です戦場の外へと導く

しかし、彼の速度ベクトルが理にかなっていることがわかったので、それを自分のモンスターに合わせて、エージェントをモンスターの位置に更新しました

今、私はいくつかの結果を得ていましたが、それは私が望むものとはかけ離れています: モンスターはキャラクターを画面の端や右上部分まで追いかけていません.フォローします(画像にはこのポイントはありませんが、存在します)。どうやらそこに通じる道がなかったので、イメージを覚えていますか?

問題は、このエージェント システムを機能させるにはどうすればよいかということです。

たぶん、エージェント、ゴール、さらにはグラフの使い方が完全に間違っています! ドキュメンテーションを読みましたが、まだ正しく作成できません。さらに... 最初は、「voidObstacles」のような GKGoals を使用しても、モンスターは同じ PolygonObstacles を通過して障害物を回避していませんでしたが、変更すると、

出来た!oO

私は本当に助けが必要です、みんなありがとう:D!

0 投票する
1 に答える
420 参照

ios - `-costToNode:` GameplayKit の GKGraphNode2D サブクラスに送信されない

Apple の新しい GameplayKit について、おそらくばかげた質問があります。

ゲーム用に 2D グリッドベースのノード レイアウトを作成しています。私は主に の機能が気に入っていますがGKGraphNode2D、1 つの方法で微調整したいと考えています。特定の種類のノード ペアをトラバースするときに、条件付きでペナルティを追加したいと考えています。言い換えれば、いくつかのノードを単純な方法で接続し、いくつかのノードを接続して、それらの通過距離がアプリによって変更されるようにしたいと考えています。

GKGraphNode2Dサブクラス化とオーバーライドは完璧に機能する-costToNode:と思いました! -estimatedCostToNode:によって提供された値を返すsuperこともあれば、ゲームに合わせて微調整することもあります。これら 2 つのメソッドはGKGraphNode、 のスーパークラスである のメソッドですGKGraphdNode2D

残念ながら、これを実行しようとすると、サブクラスで呼び出されないように-costToNode:見えます-estimatedCostToNode:。これらのメソッドは、一連のサブクラス オブジェクトを含むオブジェクトを呼び出したGKGraphNode2Dときに呼び出されることを期待しています。-findPathFromNode:toNode:GKGraphGKGraphNode2D

私は何を間違っていますか?

編集:

以下は私のコードです。

次のように、のサブクラスであるCheapNodeとの2 つのクラスを作成します。ExpensiveNodeGKGraphNode2D

次に、テストで、いくつかのノードを作成して接続し、グラフに追加して、findPathFromNode:toNode:メッセージをグラフに送信しました。次に、グラフが見つけたパスを確認しましたが、期待したものは見つかりませんでした。

このテスト ケースは失敗します。estimatedCostToNode:また、 andがサブクラスcostToNode:に送信されないことにも気付きましたGKGraphNode2D(ログ ステートメントとブレークポイントで確認)。

この問題を示すサンプル プロジェクトを次に示します。Xcode の最新の開発者ベータ版 (2015 年 8 月 31 日現在、Xcode ベータ 6) でビルドおよび実行する必要があります。

編集2:

誰かが複製に興味がある場合は、この StackOverflow の質問のサンプル コードと説明をバグ ( http://www.openradar.me/22524760 ) として提出しました。iOS 9 がリリースされた後もバグが続く場合は、開発者サポート チケットを使用してこの問題の解決を試みます。

編集3:

Apple は、Developer Support Ticket で私に返事をくれました。彼らはこれがバグであることを認めており、(私が知る限り) iOS 9.2 ベータ 2 (7C46t) で修正されているようです。

編集4:

このフレームワークの別のバグを説明するために、サンプル プロジェクトを更新しました。

0 投票する
3 に答える
18545 参照

swift - Swift 2 で NSCopying に準拠して copyWithZone を実装する方法は?

Swift 2で簡単に実装したいと思いますGKGameModel。Apple の例は Objective-C で表現されており、次のメソッド宣言が含まれています (継承元のプロトコルNSCopyingで必要とされる):GKGameModel

これはどのように Swift 2 に変換されますか? 以下は、効率とゾーンを無視するという点で適切ですか?

0 投票する
2 に答える
2151 参照

swift - map() を使用した Swift 辞書の「ディープコピー」?

GKGameModel内部状態を s の配列にa格納する と、 s からs の配列にマップCardする辞書があります。GameplayKit では、この内部状態を にコピーする必要があります。bIntCardsetGameModel:

次のコードは、配列を単にコピーし、ディクショナリを「ディープ コピー」するためのものです。FWIK Cards 自体は変更されないため、これで十分です。

ただし、これにより、「ディープ コピー」を試行する行で次の構文エラーが発生します。

タイプ '[(Int, [Card])]' の値をタイプ '[Int, [Card]]' の値に割り当てることはできません。

私は何を間違っていますか?

0 投票する
0 に答える
113 参照

ios - エンティティとコンポーネントの通信の正確性

エンティティ コンポーネント スタイルのデザイン パターンに従ってゲームを作成していて、解決できた問題に遭遇しましたが、それがベスト プラクティスであるかどうか (またはそのようなものがあるかどうか) はわかりません。

ゲームの主要な状態 (メニュー、レベル内、一時停止、バックグラウンド) を処理するステート マシンと、より断片的なゲーム状態 (新しいレベル、レベル オーバー、次へ) を処理するゲームプレイ コンポーネントの 1 つの内部ステート マシンがあります。レベル、ゲーム オーバー、概要)。内側のコンポーネントからゲームが終了したことを外側のステート マシンに知らせたいのですが、メイン コントローラー クラスへの参照がありません。通常、私はプロトコルを使用して情報をチェーンに委任しますが、ECS の経験が限られている私には、これはパラダイムを壊すように思えます。私がやっていることは、ウィンドウのルート ビュー コントローラーのアプリ デリゲートにクエリを実行し、内部状態に応じて便利なメソッドを呼び出すことです...これは MVC を行うには恐ろしい方法ですが、ECS では問題ないようです。

これが私が思っているほどひどいものではないことを誰かが確認できますか、またはそうである場合は、新しいパラダイムを推奨できますか? それは大歓迎です。

基本的には次のように動作します (全体を投稿するにはコードが多すぎると思います):

MainMenuViewController には、ステート マシンを含む ApplicationLifecycleComponent を持つ ApplicationEntity があります。「ゲーム開始」ボタンを押すと、ステート マシンは ApplicationGameState に渡されます。

ApplicationGameState は、MainMenu VC (ルート) への弱い参照を使用して、SpriteKit シーンをロードする GameViewController を提示します。ゲーム ロジックは、最終的に「ゲーム オーバー」を報告する一連の内部コンポーネントとステート マシンを通じて発生します。

ゲーム オーバーで、ApplicationLifecycle のステート マシンは ApplicationGameState を終了し、MainMenuState (または必要に応じて他の状態) に入る必要がありますが、シーンからルート VC に到達できないため、AppDelegate にルート VC を要求し、キャストします。 MainMenuViewController として、そのエンティティを取得し、ライフサイクル コンポーネントに状態を変更するように指示します。

質問を言い換えると、ルート ビュー コントローラーの弱い参照をアプリケーションの開始からチェーンにプッシュして、この状態にする必要がありますか? 何かが起こったことをより高いレベルのエンティティに通知するためのベスト プラクティスはありますか?

参考までに、これは ECS への初めての進出です。