0

だから私は小さな脱出ゲームを開発しています、そして私はあなたが壁を通り抜けることができないことを確認したいと思います。また、壁を越えてスライドできるようにしたいと思います。つまり、左側に壁があり、左と上を押すと、上にスライドしますが、壁を通り抜けることはありません。最初に、うまく機能しないバグのあるコードを作成しました。インターネットで検索した後、私はこれを見つけました:

http://xboxforums.create.msdn.com/forums/t/59723.aspx

それは本当に論理的で簡単に聞こえたので、私はそれを私のプログラムに実装しました。問題は、それがまだ機能せず、非常に不規則であるということです。スライドできる場合もあれば(予想よりも遅い/速い場合もあります)、速くしかスライドできない場合もあれば、まったくスライドできない場合もあります。私のコードは次のようになります:

bool cLevel::slideCol(SDL_Rect* pos, SDL_Rect* oldPos) {
    bool col = false;

    for (int i = 0; i < walls.size(); ++i) {
        if (rectCol(*pos, walls[i])) {
            pos->x = oldPos->x;
            col = true;
        }

        if (rectCol(*pos, walls[i])) {
            pos->y = oldPos->y;
            col = true;
        }
    }

    return col;
}

現在の位置に対してすべての壁をチェックします。最初にx位置を調整し、それでも衝突がある場合はy位置を調整します。私の問題の実際を確認したい場合は、https ://dl.dropbox.com/u/65227065/Operation%20Get%20Out.zipでデモを入手できます。rectCol関数が機能すると確信しています。徹底的にテストしました。しかし、念のために言っておきますが、とにかくここにあります。

bool rectCol(SDL_Rect f, SDL_Rect s) {
    bool ret = false;

    int t1, r1, b1, l1;
    int t2, r2, b2, l2;

    t1 = f.y;
    r1 = f.x + f.w;
    b1 = f.y + f.h;
    l1 = f.x;

    t2 = s.y;
    r2 = s.x + s.w;
    b2 = s.y + s.h;
    l2 = s.x;

    // Er zijn vier situaties mogelijk: - rechtsonder1 overlapt linksboven2
    //                                  - linksonder1 overlapt rechtsboven2
    //                                  - linksboven1 overlapt rechtsonder2
    //                                  - rechtsboven1 overlapt linksonder2
    // Die worden hier elk individueel gechecked

    if (r1 > l2 && r1 < r2) { // rechts
        if (b1 > t2 && b1 < b2) { // onder1 overlapt linksboven2
            ret = true;
        } else if (t1 > t2 && t1 < b2) { // boven overlapt overlapt linksonder2
            ret = true;
        }
    } else if (l1 > l2 && l1 < r2) { // links
        if (b1 > t2 && b1 <= b2) { // onder1 overlapt rechtsboven2
            ret = true;
        } else if (t1 > t2 && t1 < b2) { // boven1 overlapt met rechtsonder2
            ret = true;
        }
    }

    return ret;
}

私はここで私の知恵の終わりにいます。たぶん私は非常に単純なものを見逃しているだけかもしれませんが(私はおそらくいつものように)、これを理解できないようです。うまくいけば、皆さんが私を助けてくれるか、「送信」の問題が私に光を見せてくれるでしょう。

前もって感謝します!

[編集]わかりました。それで、私は予感があったので、元のアプローチをもう一度試しました。ある関数で浮動小数点座標と整数座標の間を行ったり来たりしていたため、元のシステムが機能しなかったことが判明しました。したがって、このスレッドが将来同様の問題を抱えている人によって発見された場合は、整数または浮動小数点のいずれかの1つのタイプに固執するようにしてください。それはあなたに多くの頭痛を救うでしょう。

4

1 に答える 1

0

rectCol関数は衝突があったかどうかを示しますが、X の衝突と Y の衝突を区別しません。

衝突があった場合、衝突が完全に Y 方向にあったとしても、slideCol関数は X 位置を調整します。したがって、床や天井に沿ってスライドすることはできません。

スライドが「予想よりも」遅くなったり速くなったりすることがある理由はわかりません。コードにはその理由が見当たりません (そして、あなたの dll で実験するつもりはありません) ので、あなたの期待は非現実的かもしれません。

于 2013-02-16T13:59:17.540 に答える