2017-06-24 6 views
0

私は2Dパズルゲームに取り組んでいます。その1つは、クレートをプッシュして上に乗って目的地に行くことができる機能の1つです。私はこれを動作させるために多くのことを試しましたが、どれも成功することはありません。私の主な問題は、コードをどこに置くべきかわからないことです。例えば、私はプレイヤークラスのクレートの動きを処理したくないのです。なぜなら、それは、「チェスをしているならば、ポーンとナイトは女王のルールにあってはいけません "。誰かが答えを持っているか、または擬似コードの説明を提供できればそれは認められるでしょう。人々はどのようにしてオブジェクトに物理を適用して押し込むことができますか(例:木箱)?

+0

あなたはそれを一から書くことができますが、私は最も単純な解決策は物理エンジンを使うことだと思います。私は過去にbox2dと組み合わせてsfmlを使ってきました。本当にうまく動作します。 – user3881815

答えて

0

私のゲームでは、個人的には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つのスプライトを取り込み、ブール値を返す可能性の高いメソッドがあります。あなたのゲームに本当にボックスしかないのなら、私はこれが必要ではないと思うでしょうが、まだまだ良い運動です。質問がある場合は、自由に新しい質問をしてください。

関連する問題