窗口大小调整和缩放图像/重新调整后台缓冲区大小/ C ++ / DIRECTX 9.0

时间:2013-06-16 23:03:05

标签: c++ winapi directx-9

C ++ / Windows 8 / Win api / DirectX 9.0

我遇到了很大的问题:

https://github.com/jimmyt1988/TheGame/tree/master/TheGame

问题是我已经定义了一些调整坐标函数。它们适用于调整窗口大小的时候我需要偏移所有坐标,这样我的鼠标就可以计算出正确的碰撞,并且还可以缩放并保持比例锁定我绘制到屏幕上的图像。

例如,如果我的屏幕为1920 x 1080,然后调整为1376 x 768,我需要确保在鼠标坐标上调整我的对象的边界框(当我的鼠标悬停在它们上面时)我用来检查鼠标是否在边界框中。

我发现我原本有问题,因为当我调整窗口大小时,directX会自动缩放所有内容..而且最重要的是,我也重新调整了一些东西,所以他们会完全搞砸了......我被告知我需要重新声明我的屏幕缓冲区宽度和高度的人,我记得我的窗口有一个边框,顶部还有一个菜单。

任何人都能明白为什么......不管做了这些事情,我仍然得到不正确的结果。

如果您设法运行我的应用程序:按1键将使分辨率为1920 x 1080,按2键将使其为1376 x 768.调整大小完全错误:https://github.com/jimmyt1988/TheGame/blob/master/TheGame/D3DGraphics.cpp

float D3DGraphics::ResizeByPercentageChangeX( float point )
{
    float lastScreenWidth = screen.GetOldWindowWidth();
    float currentScreenWidth = screen.GetWindowWidth();


    if( lastScreenWidth > currentScreenWidth + screen.GetWidthOffsetOfBorder() )
    {
        float percentageMoved = currentScreenWidth / lastScreenWidth;
        point = point * percentageMoved;        
    }


    return point;
}


float D3DGraphics::ResizeByPercentageChangeY( float point )
{
    float lastScreenHeight = screen.GetOldWindowHeight();
    float currentScreenHeight = screen.GetWindowHeight();


    if( lastScreenHeight > currentScreenHeight + screen.GetHeightOffsetOfBorderAndMenu() )
    {
        float percentageMoved = currentScreenHeight / lastScreenHeight;
        point = point * percentageMoved;
    }


    return point;
}

然而如果你把返回点放在这个代码块之上并且什么都不做,那么它会完全扩展,因为晕染了directX而不管它是否被正确调用(presparams先前在D3DGraphics构造中声明并且是参考在课堂上举行自我:

void D3DGraphics::ResizeSequence()
{
    presParams.BackBufferWidth = screen.GetWindowWidth() - screen.GetWidthOffsetOfBorder();
    presParams.BackBufferHeight = screen.GetWindowHeight() - screen.GetHeightOffsetOfBorderAndMenu();
    d3dDevice->Reset( &presParams );
}

这是手头的问题:

enter image description here

这是使这个可憎的矩形的代码:

void Game::ComposeFrame()
{
    gfx.DrawRectangle( 50, 50, screen.GetWindowWidth() - screen.GetWidthOffsetOfBorder() - 100, screen.GetWindowHeight() - screen.GetHeightOffsetOfBorderAndMenu() - 100, 255, 0, 0 );

}

修改::::::::::::::::

我注意到在MSDN上它说:

  

在为设备调用IDirect3DDevice9 :: Reset方法之前,   应用程序应该释放任何显式的渲染目标,深度模板   曲面,附加交换链,状态块和D3DPOOL_DEFAULT   与设备相关的资源。

我现在已经发布了vbuffer并在重置presparams和设备后重新实例化。

修改::::::::::::

我在我的重置中放置了一个HRESULT,我现在设法触发错误......但是,好吧......它对我没有帮助! :http://i.stack.imgur.com/lqQ5K.jpg

enter image description here

1 个答案:

答案 0 :(得分:0)

基本上,问题是我是一个完整的derp。我将窗口宽度放入矩形,然后根据oldwidth / newwidth重新调整该大小..好的新宽度已经是屏幕尺寸...... GRRRRRRR。