2014-11-22 1 views
0

Я пытаюсь настроить Box2D в своей игре. В настоящее время у меня есть код, и я добавил класс DebugDraw в свою игру, который рисует многоугольники, созданные Box2D.отладка draw Box2D очень большая по сравнению с Testbed app

Теперь, если я сравню это с кодом из приложения Testbed (я скопировал какой-то код для воссоздания теста OneSidedPlatform), он показывает намного больше в моей игре, чем в исходном приложении.

Я предполагаю, что это что-то делать с самим так здесь OpenGL/SDL некоторый код:

Это создает OpenGL в моей игре:

// START SDL 
if (SDL_Init(SDL_INIT_VIDEO) != 0) 
{ 
    logSDLError(std::cout, "SDL_Init"); 
    return 1; 
} 

// SETUP OPENGL SETTINGS (THEY CAN BE SET WITHOUT ACTUALLY BEING USED) 
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); 

// CREATE A WINDOW 
m_pWindow = SDL_CreateWindow("SDL/OpenGL Game Client - With Networking Library", 100, 100, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_OPENGL); 
if (m_pWindow == nullptr) 
{ 
    logSDLError(std::cout, "CreateWindow"); 
    return 2; 
} 

m_GlContext = SDL_GL_CreateContext(m_pWindow); 
if(m_GlContext == NULL) 
{ 
    printf("OpenGL context could not be created! SDL Error: %s\n", SDL_GetError()); 
} 
else 
{ 
    //INITIALIZE GLEW 
    glewExperimental = GL_TRUE; 
    GLenum glewError = glewInit(); 
    if(glewError != GLEW_OK) 
    { 
     printf("Error initializing GLEW! %s\n", glewGetErrorString(glewError)); 
    } 

    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
} 

// CREATE A RENDERER TO DRAW THE WINDOW TO 
m_pRenderer = SDL_CreateRenderer(m_pWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); 
if (m_pRenderer == nullptr) 
{ 
    logSDLError(std::cout, "CreateRenderer"); 
    return 3; 
} 

Это является создание объектов Box2D (копия оригинального тестового приложения):

// Ground 
{ 
    b2BodyDef bd; 
    b2Body* ground = Engine::GetInstance()->GetPhysicsWorld()->CreateBody(&bd); 

    b2EdgeShape shape; 
    shape.Set(b2Vec2(-20.0f, 0.0f), b2Vec2(20.0f, 0.0f)); 
    ground->CreateFixture(&shape, 0.0f); 
} 

// Platform 
{ 
    b2BodyDef bd; 
    bd.position.Set(0.0f, 10.0f); 
    b2Body* body = Engine::GetInstance()->GetPhysicsWorld()->CreateBody(&bd); 

    b2PolygonShape shape; 
    shape.SetAsBox(3.0f, 0.5f); 
    m_platform = body->CreateFixture(&shape, 0.0f); 

    m_bottom = 10.0f - 0.5f; 
    m_top = 10.0f + 0.5f; 
} 

// Actor 
{ 
    b2BodyDef bd; 
    bd.type = b2_dynamicBody; 
    bd.position.Set(0.0f, 12.0f); 
    b2Body* body = Engine::GetInstance()->GetPhysicsWorld()->CreateBody(&bd); 

    m_radius = 0.5f; 
    b2CircleShape shape; 
    shape.m_radius = m_radius; 
    m_character = body->CreateFixture(&shape, 20.0f); 

    body->SetLinearVelocity(b2Vec2(0.0f, -50.0f)); 

    m_state = e_unknown; 
} 

// Set debug 
Engine::GetInstance()->GetPhysicsWorld()->SetDebugDraw(&m_debugDraw); 
m_debugDraw.SetFlags(b2Draw::e_shapeBit); 

Я понятия не имею, где я должен смотреть, чтобы изменить вид моей игры или масштаб Box2D. Я также сравнил свой код OpenGL с тем, который был из приложения Testbed, и я не могу найти никакой реальной разницы.

ответ

1

Посмотрите на этот метод в main.cpp из Testbed приложения:

static void Resize(int32 w, int32 h) 
{ 
    ... 
    // those are the lines you may consider incorporating into your code: 

    b2Vec2 lower = settings.viewCenter - extents; 
    b2Vec2 upper = settings.viewCenter + extents; 

    // L/R/B/T 
    gluOrtho2D(lower.x, upper.x, lower.y, upper.y); 
} 
+0

Спасибо :), что действительно решить эту проблему! Мне действительно нужно изучить, как использовать матрицы в играх ... – Dries

Смежные вопросы