私は2Dパズルゲームに取り組んでいます。その1つは、クレートをプッシュして上に乗って目的地に行くことができる機能の1つです。私はこれを動作させるために多くのことを試しましたが、どれも成功することはありません。私の主な問題は、コードをどこに置くべきかわからないことです。例えば、私はプレイヤークラスのクレートの動きを処理したくないのです。なぜなら、それは、「チェスをしているならば、ポーンとナイトは女王のルールにあってはいけません "。誰かが答えを持っているか、または擬似コードの説明を提供できればそれは認められるでしょう。人々はどのようにしてオブジェクトに物理を適用して押し込むことができますか(例:木箱)?
答えて
私のゲームでは、個人的にはBox2Dを使って衝突を処理していましたが、多くの事柄を抽象化しているので、必要に応じて調べることができます。あなたのゲームが純粋なSFMLを使用して多くの物理を使用しない場合、おそらくより多くの時間を節約します。
純粋なSFMLの点では、2つのボックスのエッジが当たったときを検出し、そのときに「プレーヤー」と「ボックス」を同じ速度で移動する必要があります。
これでSFG getGlobalBounds()と "intersect"を使用してこのタスクを実行できますが、個人的には私の意見では "お互いの中に"あまりにも多くの "最良の結果"を表示しません。
この例では、プレーヤーがボックスを左側から押しているので、ボックスがプレーヤーの右に移動しています。この例は、SFMLで衝突チェックを行う方法のコードです。
//variables outside of gameloop initialize what you want.
sf::RectangleShape player, dynamicBody; //used rectangles to test
... //go inside game loop...
//collide from left side
if (player.getPosition().x == (dynamicBody.getPosition().x - dynamicBody.getSize().x) && (player.getPosition().y == dynamicBody.getPosition().y))
{
dynamicBody.move(1, 0);
//release push
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
player.setPosition(player.getPosition().x - 1.0, player.getPosition().y);
}
}
注意ライン player.setPosition(player.getPosition()X - 1.0、player.getPosition()Y。)。
プッシュを解放するには、小さいデルタ値(1.0はうまくいくが、下げることができます)を指定する必要があります。そうしないと、ボックスが固まります。デルタ値は、あなたがぎこちない動きに気づかないほど十分に小さいです。
ボックスを左に押すと、上記と同様のコードになります(反対の値のみ)。
ボックスの上をジャンプするには、これを複数の方法で処理できます。簡単な例として、「地面の値」をボックスの上端に「リセット」することができます。プレイヤーがオフの場合は地面の値を通常の状態に戻します。あなたがしたい場合
は、いくつかのより多くの情報私はこのコンセプトの迅速な証明をした:私が最初にあなたのボックスはクラスによって表現されることを前提としていますオブジェクト指向のプログラムでコードを置く場所の面ではhttps://github.com/BenTarman/SFML-DynamicCollision/tree/master/sfmlDynamicCollision
。おそらく彼らは "エンティティ"クラスから継承しますが、それは問題ではありません。このクラスがプレーヤスプライトにアクセスできる場合は、そこにメソッドのロジックを置くことができます。
また、より一般的なものにしたい場合は、このロジックをコリジョンクラスで処理できます。このクラスには、衝突が発生したかどうかを判断するために2つのスプライトを取り込み、ブール値を返す可能性の高いメソッドがあります。あなたのゲームに本当にボックスしかないのなら、私はこれが必要ではないと思うでしょうが、まだまだ良い運動です。質問がある場合は、自由に新しい質問をしてください。
- 1. cpppoを使用して、どのようにしてcompactlogix plcに書き込むことができますか?
- 2. エラーと例外をどのようにしてログファイルに書き込むことができますか?
- 3. どのようにして物理オブジェクトを解決できますか?
- 4. 物理アドレスlinuxに書き込むことができます
- 5. リモコンをリモコンに押し込むことはできますか?
- 6. log4perlはどのようにしてSTDERRとファイルに同時に書き込むことができますか?
- 7. C#では、無人サーバーでstdoutをどのように書き込むことができますか?
- 8. どのように私はsenchaを使用してYouTubeビデオを埋め込むことができます
- 9. この作業コピーをチェックアウトした人はどのようにして知ることができますか?
- 10. このシナリオではどのように代理人を使用しますか?
- 11. Facebookのブックマークに登録した人はどのようにして知ることができますか?
- 12. どのようなリレーショナルモデルがこの例に適していますか?
- 13. このコードにどのようにしてキーを押すことができますか?
- 14. RelayCommandと代理人、代理人を理解しようとしています
- 15. ループを使用して、Pythonを使用して別々の行に10個の数字を入力し、ファイルに書き込むことができます。
- 16. Javaでは、Stack.pop()をパラメータとしてどのように適用しますか?
- 17. どのようにしてHTMLファイルを読み込むことができますか?
- 18. どのように文字をテキストエリアに押し込むのですか
- 19. 物理ファイルの代わりにDrawing.Bitmapオブジェクトに書き込む
- 20. どのようにして、ゴミ箱のTNonblockingServerをJavaで起動しますか?
- 21. この例ではdupをどのように使用していますか?
- 22. 「Numeral Signs-#」は列見出しの一部としてどのように読むことができますか?
- 23. どのようにしてオブジェクトができますか?
- 24. どのようにUITabBarItemを2回連続してクリックして処理することができますか?
- 25. Task.Run()を使用してコンソールに書き込むことができません
- 26. オブジェクトをPHPのどこでも利用できるようにするには、どのような方法が適していますか?
- 27. Extのローダーを使用して非extスクリプト/オブジェクトを動的に読み込むことはできますか?
- 28. どのように適用して、環境のパスを確認することができますか?
- 29. トーチは、私がこのマニュアルに従ってファイルにテキストを書き込むしようとしている
- 30. catchブロック内にスローされた例外をどのように呑み込むことができますか?
あなたはそれを一から書くことができますが、私は最も単純な解決策は物理エンジンを使うことだと思います。私は過去にbox2dと組み合わせてsfmlを使ってきました。本当にうまく動作します。 – user3881815