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
答案 0 :(得分:0)
基本上,问题是我是一个完整的derp。我将窗口宽度放入矩形,然后根据oldwidth / newwidth重新调整该大小..好的新宽度已经是屏幕尺寸...... GRRRRRRR。