0

Box2D 物理演算を使用した単純なゲーム エンジンに取り組んでいます。エンジンは静的ライブラリであるため、すべての Box2D ソースはエンジン独自の静的ライブラリに組み込まれています。

リリース モードでビルドすると、構造体が「ここで宣言されました」というエラーが表示されます。

これは問題の行です

    // Initialize the separating axis.
    b2SeparationFunction fcn;
    fcn.Initialize(&cache, proxyA, sweepA, proxyB, sweepB, t1);

b2SeparationFunction は、上記の 2 行と同じファイルにある構造体です。

struct b2SeparationFunction
{


enum Type
    {
        e_points,
        e_faceA,
        e_faceB
    };



// TODO_ERIN might not need to return the separation

float32 Initialize(const b2SimplexCache* cache,
    const b2DistanceProxy* proxyA, const b2Sweep& sweepA,
    const b2DistanceProxy* proxyB, const b2Sweep& sweepB,
    float32 t1)
{
    m_proxyA = proxyA;
    m_proxyB = proxyB;
    int32 count = cache->count;
    b2Assert(0 < count && count < 3);

    m_sweepA = sweepA;
    m_sweepB = sweepB;

    b2Transform xfA, xfB;
    m_sweepA.GetTransform(&xfA, t1);
    m_sweepB.GetTransform(&xfB, t1);

    if (count == 1)
    {
        m_type = e_points;
        b2Vec2 localPointA = m_proxyA->GetVertex(cache->indexA[0]);
        b2Vec2 localPointB = m_proxyB->GetVertex(cache->indexB[0]);
        b2Vec2 pointA = b2Mul(xfA, localPointA);
        b2Vec2 pointB = b2Mul(xfB, localPointB);
        m_axis = pointB - pointA;
        float32 s = m_axis.Normalize();
        return s;
    }
    else if (cache->indexA[0] == cache->indexA[1])
    {
        // Two points on B and one on A.
        m_type = e_faceB;
        b2Vec2 localPointB1 = proxyB->GetVertex(cache->indexB[0]);
        b2Vec2 localPointB2 = proxyB->GetVertex(cache->indexB[1]);

        m_axis = b2Cross(localPointB2 - localPointB1, 1.0f);
        m_axis.Normalize();
        b2Vec2 normal = b2Mul(xfB.q, m_axis);

        m_localPoint = 0.5f * (localPointB1 + localPointB2);
        b2Vec2 pointB = b2Mul(xfB, m_localPoint);

        b2Vec2 localPointA = proxyA->GetVertex(cache->indexA[0]);
        b2Vec2 pointA = b2Mul(xfA, localPointA);

        float32 s = b2Dot(pointA - pointB, normal);
        if (s < 0.0f)
        {
            m_axis = -m_axis;
            s = -s;
        }
        return s;
    }
    else
    {
        // Two points on A and one or two points on B.
        m_type = e_faceA;
        b2Vec2 localPointA1 = m_proxyA->GetVertex(cache->indexA[0]);
        b2Vec2 localPointA2 = m_proxyA->GetVertex(cache->indexA[1]);

        m_axis = b2Cross(localPointA2 - localPointA1, 1.0f);
        m_axis.Normalize();
        b2Vec2 normal = b2Mul(xfA.q, m_axis);

        m_localPoint = 0.5f * (localPointA1 + localPointA2);
        b2Vec2 pointA = b2Mul(xfA, m_localPoint);

        b2Vec2 localPointB = m_proxyB->GetVertex(cache->indexB[0]);
        b2Vec2 pointB = b2Mul(xfB, localPointB);

        float32 s = b2Dot(pointB - pointA, normal);
        if (s < 0.0f)
        {
            m_axis = -m_axis;
            s = -s;
        }
        return s;
    }
}

float32 FindMinSeparation(int32* indexA, int32* indexB, float32 t) const
{
    b2Transform xfA, xfB;
    m_sweepA.GetTransform(&xfA, t);
    m_sweepB.GetTransform(&xfB, t);

    switch (m_type)
    {
    case e_points:
        {
            b2Vec2 axisA = b2MulT(xfA.q,  m_axis);
            b2Vec2 axisB = b2MulT(xfB.q, -m_axis);

            *indexA = m_proxyA->GetSupport(axisA);
            *indexB = m_proxyB->GetSupport(axisB);

            b2Vec2 localPointA = m_proxyA->GetVertex(*indexA);
            b2Vec2 localPointB = m_proxyB->GetVertex(*indexB);

            b2Vec2 pointA = b2Mul(xfA, localPointA);
            b2Vec2 pointB = b2Mul(xfB, localPointB);

            float32 separation = b2Dot(pointB - pointA, m_axis);
            return separation;
        }

    case e_faceA:
        {
            b2Vec2 normal = b2Mul(xfA.q, m_axis);
            b2Vec2 pointA = b2Mul(xfA, m_localPoint);

            b2Vec2 axisB = b2MulT(xfB.q, -normal);

            *indexA = -1;
            *indexB = m_proxyB->GetSupport(axisB);

            b2Vec2 localPointB = m_proxyB->GetVertex(*indexB);
            b2Vec2 pointB = b2Mul(xfB, localPointB);

            float32 separation = b2Dot(pointB - pointA, normal);
            return separation;
        }

    case e_faceB:
        {
            b2Vec2 normal = b2Mul(xfB.q, m_axis);
            b2Vec2 pointB = b2Mul(xfB, m_localPoint);

            b2Vec2 axisA = b2MulT(xfA.q, -normal);

            *indexB = -1;
            *indexA = m_proxyA->GetSupport(axisA);

            b2Vec2 localPointA = m_proxyA->GetVertex(*indexA);
            b2Vec2 pointA = b2Mul(xfA, localPointA);

            float32 separation = b2Dot(pointA - pointB, normal);
            return separation;
        }

    default:
        b2Assert(false);
        *indexA = -1;
        *indexB = -1;
        return 0.0f;
    }
}

float32 Evaluate(int32 indexA, int32 indexB, float32 t) const
{
    b2Transform xfA, xfB;
    m_sweepA.GetTransform(&xfA, t);
    m_sweepB.GetTransform(&xfB, t);

    switch (m_type)
    {
    case e_points:
        {
            b2Vec2 axisA = b2MulT(xfA.q,  m_axis);
            b2Vec2 axisB = b2MulT(xfB.q, -m_axis);

            b2Vec2 localPointA = m_proxyA->GetVertex(indexA);
            b2Vec2 localPointB = m_proxyB->GetVertex(indexB);

            b2Vec2 pointA = b2Mul(xfA, localPointA);
            b2Vec2 pointB = b2Mul(xfB, localPointB);
            float32 separation = b2Dot(pointB - pointA, m_axis);

            return separation;
        }

    case e_faceA:
        {
            b2Vec2 normal = b2Mul(xfA.q, m_axis);
            b2Vec2 pointA = b2Mul(xfA, m_localPoint);

            b2Vec2 axisB = b2MulT(xfB.q, -normal);

            b2Vec2 localPointB = m_proxyB->GetVertex(indexB);
            b2Vec2 pointB = b2Mul(xfB, localPointB);

            float32 separation = b2Dot(pointB - pointA, normal);
            return separation;
        }

    case e_faceB:
        {
            b2Vec2 normal = b2Mul(xfB.q, m_axis);
            b2Vec2 pointB = b2Mul(xfB, m_localPoint);

            b2Vec2 axisA = b2MulT(xfA.q, -normal);

            b2Vec2 localPointA = m_proxyA->GetVertex(indexA);
            b2Vec2 pointA = b2Mul(xfA, localPointA);

            float32 separation = b2Dot(pointA - pointB, normal);
            return separation;
        }

    default:
        b2Assert(false);
        return 0.0f;
    }
}

const b2DistanceProxy* m_proxyA;
const b2DistanceProxy* m_proxyB;
b2Sweep m_sweepA, m_sweepB;
Type m_type;
b2Vec2 m_localPoint;
b2Vec2 m_axis;
}

私が得ているエラーは次のとおりです。C:\Users\david\Documents\Scales\ScalesEngine\src\Box2D\Collision\b2TimeOfImpact.cpp|327|note: '*((void*)(& fcn)+84).b2Vec2::x' was declared here|

このエラーの前は次のとおりです。include\Box2D\Common\b2Math.h|590|warning: '*((void*)(& fcn)+84).b2Vec2::x' may be used uninitialized in this function [-Wuninitialized]|

私は、ストラストがこの関数を使用していることを発見しました:

inline b2Vec2 b2Mul(const b2Transform& T, const b2Vec2& v)
{
    float32 x = (T.q.c * v.x - T.q.s * v.y) + T.p.x;
    float32 y = (T.q.s * v.x + T.q.c * v.y) + T.p.y;

    return b2Vec2(x, y);
}

だから私は問題がここにあると思いますが、私はそれを見ることができません!

gccでmingwを使用していますが、

ご協力いただきありがとうございます。

4

1 に答える 1

0

まず、xの名前を「my_field_named_x」などの一意の名前に変更して、見つけやすくします。次に、-save-temps、http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.htmlを使用して、正確な数を投稿します。 「my_field_named_x」が発生する時間と行。そこから進みます。

于 2012-08-18T08:13:28.147 に答える