0

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

这是手头的问题:

在此处输入图像描述

这是使矩形令人厌恶的代码:

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

在此处输入图像描述

4

1 回答 1

0

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

于 2013-06-17T20:22:39.807 回答