c++ - 调试绘制 Box2D 与 Testbed 应用程序相比非常大

标签 c++ opengl sdl box2d

我正在尝试在我自己的游戏中设置 Box2D。我目前有一些代码在工作,我在我的游戏中添加了一个 DebugDraw 类,它绘制由 Box2D 创建的多边形。

现在,如果我将它与 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);

我不知道我必须在哪里查看才能更改我的游戏 View 或 Box2D 的比例。我还将我的 OpenGL 代码与 Testbed 应用程序中的代码进行了比较,我找不到任何真正的区别。

最佳答案

在 TestBed 应用程序的 Main.cpp 中查看此方法:

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);
}

关于c++ - 调试绘制 Box2D 与 Testbed 应用程序相比非常大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27082256/

相关文章:

java - 将多继承 C++ 代码移植到 Java

c++ - 如何检测进程是否正在调试

c++ - 使用 OpenGL 在视频中显示跟踪的对象

c++ - GLFW - 在不使用循环的情况下保持窗口

c# - 移动 SDL 视频表面

c++ - 如何创建自定义 C++ 类以与蓝图一起使用

macos - 使用 Core Graphics 绘制雾

c++ - 纹理值被限制在 0-1 范围内?

c++ - 无法将 'bool solid' 设置为仅某些图 block

opengl - LibGDX 移动旋转相机