2013-06-16 1 views
0

C++/Windows 8/Win API/DirectX 9.0Окно изменения размера и масштабирования изображения/повторного объявления назад размер буфера/C++/DirectX 9.0

Я имею реальный большие проблемы с этим:

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

Проблема в том, что я определил некоторые корректирующие функции координат. Они предназначены для того, чтобы изменить размер окна, и мне нужно компенсировать все мои координаты, чтобы мои координаторы мыши выработали правильные коллизии, а также масштабировали и все же сохраняли коэффициент блокировки для изображений, которые я рисую на экране.

Например, если у меня был экран с разрешением 1920 x 1080, а затем был изменен до 1376 x 768, мне нужно убедиться, что ограничивающие рамки для моих объектов (когда моя мышка нависает над ними) настраивается на мышь координаты, которые я использую, чтобы проверить, находится ли мышь в ограничивающей рамке.

Я узнал, что изначально у меня были проблемы, потому что, когда я менял свое окно, directX автоматически масштабировал все, и кроме того, я тоже менял вещи, поэтому они были бы полностью ввернуты ... Мне сказали кто-то, что мне нужно, чтобы повторно объявить ширину и высоту экранного буфера, что я сделал, имея в виду, что у меня есть граница с моим окном, а также меню вверху.

Может ли кто-нибудь понять, почему ... независимо от того, что вы делаете все это, я все равно получаю неправильные результаты.

Если вам удастся запустить мое приложение: Нажатие кнопки 1 будет делать разрешение 1920 х 1080, нажав клавишу 2 сделает 1376 х 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); 

} 

EDIT ::::::::::: :::::

я заметил, что на MSDN написано:

Перед вызовом метода IDirect3DDevice9 :: Reset для устройства приложение должно освободить любые явные цели рендеринга, глубинные трассировки , дополнительные цепи подкачки, государственные блоки и D3DPOOL_DEFAULT ресурсы, связанные с устройством.

Я теперь выпустил vbuffer и восстановил его после того, как препараты и устройство сбрасываются.

EDIT ::::::::::::

Я разместил HRESULT на моем сбросе, в котором я теперь управлять, чтобы вызвать ошибку ... Но, хорошо .. это Безразлично» я действительно помогу! : http://i.stack.imgur.com/lqQ5K.jpg

enter image description here

+0

Есть ли что-нибудь, что я могу сделать для этого вопроса, чтобы помочь получить ответ? Не стесняйтесь загружать весь проект, если вас это беспокоит, чтобы проверить его. Я пробовал эту проблему уже более 3 недель (по вечерам), я довольно застрял :( – Jimmyt1988

ответ

0

В принципе, этот вопрос я был полным Derp. Я помещал в свой прямоугольник ширину окна, а затем корректировал этот размер на основе oldwidth/newwidth. Ну, новая ширина уже была размером экрана ... GRRRRRRR.

 Смежные вопросы

  • Нет связанных вопросов^_^