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