1

画面上に 2 つの立方体を表示する単純なプログラムをコーディングしました。1 つはユーザーが移動でき、もう 1 つは静止しています。私は sfml を使い始めたばかりで、衝突について触れたことがないので、これは私にとってまったく新しいことでした。私のコードでは、ユーザーが立方体を固定立方体に向けたときに警告ウィンドウがポップアップすることを目指しています。ただし、問題は、プログラムを開始するとすぐに警告ウィンドウが表示されることです。これは、if ループ内にあります。これが私のコードです:

    #include <SFML/Graphics.hpp>
    #include <SFML/Window.hpp>
    #include <iostream>

    using namespace std;

    bool isCollision(int x, int y, int x2, int y2){ // borrowed function, all credits go to whom ever made it
        if (abs(x2 - x) > 20 || abs(y2 - y) > 20)
            return false;
        else
            return true;
    }

    int main()
    {
        sf::RenderWindow App(sf::VideoMode(800, 600, 32), "My SFML Window");
        sf::RenderWindow Warning(sf::VideoMode(400, 225, 32), "WARNING!");
        sf::Shape Rect = sf::Shape::Rectangle(0, 0, 20, 20, sf::Color::Red);
        sf::Shape Rect2 = sf::Shape::Rectangle(50, 0, 70, 20, sf::Color::Blue);


        while (App.IsOpened())
        {
            sf::Event event;
            while (App.GetEvent(event)) // I now know the shorter way to handle events, just haven't edited it yet. No functional difference
            {
                if (event.Type == sf::Event::Closed)
                    App.Close();
                if ((event.Type == sf::Event::KeyPressed) && (event.Key.Code == sf::Key::Escape))
                    App.Close();
                if ((event.Type == sf::Event::KeyPressed) && (event.Key.Code == sf::Key::Right))
                    Rect.Move(5.0, 0);
                if ((event.Type == sf::Event::KeyPressed) && (event.Key.Code == sf::Key::Left))
                    Rect.Move(-5.0, 0);
                if ((event.Type == sf::Event::KeyPressed) && (event.Key.Code == sf::Key::Down))
                    Rect.Move(0, 5.0);
                if ((event.Type == sf::Event::KeyPressed) && (event.Key.Code == sf::Key::Up))
                    Rect.Move(0, -5.0);

            }

            int x = Rect.GetPosition().x;
            int y = Rect.GetPosition().y;

            int x2 = Rect2.GetPosition().x;
            int y2 = Rect2.GetPosition().y;

            isCollision(x, y, x2, y2);

            if (isCollision(x, y, x2, y2) == true) // if loop that I am messing up somehow
            }
                Warning.Clear(sf::Color::White);

            }

            App.Clear();
            App.Draw(Rect);
            App.Draw(Rect2);
            App.Display();
        }

        return EXIT_SUCCESS;
    }

私が見ていたtutからbool isCollision関数を取得しましたが、tutはアレグロで行われたので、できる限り削りました。(彼の関数を使用する際の私の論理は、立方体がまったく同じサイズであり、それらのプロパティが同一であるというものでした [1 つは動くもの、もう 1 つは静止している]。問題は、関数を呼び出す方法にあるに違いないと思います。すべての助けが大いに役立ちます。感謝

4

5 に答える 5

1

関数が正しく返されていないと思います。このようにしてみてください。(FYI 2返品は本当に悪い習慣です)

bool isCollision(int x, int y, int x2, int y2){
     bool exitVal;   // maybe make it static if this is being called over and over
     if (abs(x2 - x) > 20 || abs(y2 - y) > 20)
         exitVal = false;
     else
         exitVal = true;

     return exitVal;
}

これが役立つことを願っています:D

于 2011-08-09T06:02:02.807 に答える
1

より簡単な方法を使用して、間違いがどこにあるかを正確に把握してみてください。molbdnilo は正しいかもしれないので、新しいウィンドウを使用して衝突コードが正しいかどうかを確認する代わりに、確実に機能する何かを行うことができます。私は通常、cout でメッセージを出力するだけです:

#include <iostream>

            if (isCollision(x, y, x2, y2) == true)
        {
            cout << "squares r colliding!!!";
            Warning.Clear(sf::Color::White);

        }

コンソールが見えることを確認してください (そのためにデバッグモードを使用する必要がある場合があります)。

また、ifループはありません;)

于 2014-05-03T10:24:36.920 に答える
1

RenderWindowコンストラクターがウィンドウを作成して表示していると思われます。
衝突が発生するまで、作成しないでください (または少なくとも表示を遅らせてください)。
それを達成する方法を理解するための演習として残しておきます。

于 2011-08-09T10:24:03.153 に答える
1

C++ では、戻り値を収集するのは呼び出し元次第です。

isCollision(x, y, x2, y2);

上記の関数を呼び出しても、何も役に立ちません。戻り値を収集し、if 条件のフラグとして提供する必要があります。または、関数呼び出しを if 条件自体に直接配置します。

if ( isCollision(x, y, x2, y2) ){

   // Code here
}
于 2011-08-09T05:19:08.597 に答える
1

あなたのコードサンプルで:

isCollision(x, y, x2, y2);

            if (isCollision(x, y, x2, y2) == true) // if loop that I am messing up somehow
            }
                Warning.Clear(sf::Color::White);

            }

isCollision関数を 2 回呼び出すのはなぜですか?

次のようにできます:

bool is_coll = isCollision(x, y, x2, y2);
if(is_coll) {
//....
}

また、brace }afterif文は一致していないように見えます....

さらに、 function の実装ではisCollision、何がabs(x2 - x)

おそらくマクロのような気abs()がするので、マクロが正しく定義されているかどうかを確認してください。ステートメント内の 2 つのマクロ呼び出しは、if()実際に混乱を招く可能性があります。

于 2011-08-09T07:12:35.980 に答える