मैं पीपीएम साथ Box2D वस्तुओं कैसे पैमाने पर करते हैं?

वोट
0

मैं हाल ही में, जहां मेरे खिलाड़ी एक धीमी गति से आगे बढ़ रहा था Box2D के साथ एक समस्या हुई थी। मैं LinearImpulse का उपयोग स्थानांतरित करने के लिए शरीर लेकिन (100, 100) सबसे तेजी से यह जाना जा सकता था।

यह थोड़ा शोध करने के बाद, मुझे पता है कि Box2D शरीर के लिए बहुत बड़ी है क्योंकि Box2D मीटर का उपयोग करता है और मैं पिक्सेल में यह टाइप कर रहा हूँ है। मुझे लगता है मैं एक पीपीएम निरंतर का उपयोग कर शरीर पैमाने पर करने के लिए है पता है, लेकिन यह काफी मेरे लिए अर्थ निकालने नहीं है।

मैं एक पीपीएम लगातार बनाया है और 32.0f के लिए यह निर्धारित किया है।

const float PPM = 32.0f;

यहाँ कैसे मैं गतिशील खिलाड़ी शरीर बनाने के लिए:

void Physics::playerDynamic(float x, float y, float width, float height)
{
    b2BodyDef bodyDef;
    bodyDef.type = b2_dynamicBody;
    bodyDef.position.Set(x / PPM, y / PPM);

    body = world.CreateBody(&bodyDef);

    b2PolygonShape dynamicBox;
    dynamicBox.SetAsBox((64.0f) / PPM, (64.0f) / PPM);

    b2FixtureDef fixtureDef;
    fixtureDef.shape = &dynamicBox;
    fixtureDef.filter.categoryBits = CATEGORY_PLAYER;
    fixtureDef.filter.maskBits = CATEGORY_PLAYER;
    fixtureDef.filter.groupIndex = -1;

    body->CreateFixture(&fixtureDef);

    world.Step(timeStep, velocityIterations, positionIterations);

    posX = x;
    posY = y;

    bodyType = player;
}

मैं समझता हूँ कि मैं शरीर है, जो मैं पीपीएम से विभाजित करके किया नीचे पैमाने पर करने की जरूरत है। लेकिन अब शरीर वास्तव में छोटा है और टकराने नहीं होगा मैं इसे कैसे करना चाहते हैं।

यहाँ समारोह जहाँ मैं खिलाड़ी शरीर के लिए आवेग लागू है:

void Physics::moveBodies()
{

    myCollisionDetection myListener;
    world.SetContactListener(&myListener);

    if (bodyType != player)
    {


    }
    else if (bodyType == player)
    {

        body->SetAwake(true);

        float forceX = 0;
        float forceY = 0;

        switch (moveState)
        {
        case MS_UP:
            forceY = -50;
            break;
        case MS_DOWN:
            forceY = 50;
            break;
        case MS_LEFT:
            forceX = -50;
            break;
        case MS_RIGHT:
            forceX = 50;
            break;
        case MS_UPRIGHT:
            forceY = -50;
            forceX = 50;
            break;
        case MS_UPLEFT:
            forceY = -50;
            forceX = -50;
            break;
        case MS_DOWNRIGHT:
            forceY = 50;
            forceX = 50;
            break;
        case MS_DOWNLEFT:
            forceY = 50;
            forceX = -50;
            break;
        case MS_STOP:
            body->SetLinearVelocity(b2Vec2(0, 0));
        }

        body->ApplyLinearImpulse(b2Vec2(forceX, forceY ), body->GetWorldCenter(), true);
        pos = body->GetPosition();
        posX = body->GetPosition().x;
        posY = body->GetPosition().y;
    }

    world.Step(timeStep, velocityIterations, positionIterations);

}

मैं काफी कुछ समय के लिए इस पर शोध किया गया है और यह आसान लगता है, लेकिन मैं एक मुश्किल समय मेरे कोड को लागू करने से हो रही है।

तो मैं यहाँ से क्या करते हैं? मैं वापस ऊपर शरीर पैमाने पर है?

मैं भी ग्राफिक्स के लिए SDL2 उपयोग कर रहा हूँ। मैं प्रतिपादन के साथ कुछ भी बदलने की जरूरत है?

19/09/2018 को 02:48
उपयोगकर्ता
अन्य भाषाओं में...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more