2013-06-16 2 views
0

C++/Windows 8/Windows api/DirectX 9.0redimensionnement fenêtre et mise à l'échelle des images/redéclarant arrière taille du tampon/C++/DIRECTX 9.0

J'ai des problèmes vraiment grand avec ceci:

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

Le problème est que j'ai défini certaines fonctions de coordonnées d'ajustement. Ils sont pour quand une fenêtre est redimensionnée et j'ai besoin de décaler toutes mes coordonnées de sorte que mes cooridnates de souris travaillent sur les collisions correctes et aussi pour redimensionner et garder le rapport verrouillé pour les images que je dessine à l'écran. Par exemple, si j'avais un écran à 1920 x 1080 puis redimensionné à 1376 x 768, je dois m'assurer que les boîtes de délimitation de mes objets (lorsque ma souris les survole) est ajustée sur la souris les coordonnées que j'utilise pour vérifier si la souris était dans la boîte englobante.

J'ai découvert que j'avais des problèmes à l'origine parce que quand je redimensionnais ma fenêtre, directX mettait automatiquement à l'échelle tout et en plus, je rééchelonnais les choses, donc ils étaient complètement foutus ... On m'a dit par quelqu'un que j'ai besoin de re-déclarer ma largeur et la hauteur du tampon de l'écran, ce que j'ai fait en gardant à l'esprit qu'il y a une bordure à ma fenêtre et aussi un menu en haut. Est-ce que quelqu'un peut voir pourquoi ... indépendamment de faire tout cela, je reçois toujours les résultats incorrects.

Si vous parvenez à exécuter mon application: En appuyant sur la touche 1 fera la résolution 1920 x 1080, en appuyant sur la touche 2, il sera 1376 x 768. Le Resize est tout à fait tort: ​​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; 
} 

et Cependant, si vous placez le point de retour au-dessus de ce bloc de code et que vous ne faites rien, il s'équilibre parfaitement à cause de blooming directX indépendamment de ce qui est appelé correctement (les presparams sont déjà déclarées dans la construction D3DGraphics et une référence dans la classe elle-même:

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

C'est le problème à résoudre:

enter image description here

Voici le code qui rend cette abomination d'un rectangle:

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

} 

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

J'ai remarqué que sur MSDN il dit:

Avant d'appeler la méthode IDirect3DDevice9 :: Reset pour un périphérique, une application doit libérer toutes les cibles de rendu explicites, les gabarits de profondeur surfaces, les chaînes d'échange supplémentaires, les blocs d'état et les ressources D3DPOOL_DEFAULT associées au périphérique.

J'ai maintenant libéré le vbuffer et l'ai réactivé après la réinitialisation des presparams et du périphérique.

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

Je mis un HRESULT sur ma remise à zéro dans laquelle je parviens maintenant à déclencher une erreur ... Mais, bien .. il n » t vraiment m'aider! : http://i.stack.imgur.com/lqQ5K.jpg

enter image description here

+0

Y at-il quelque chose que je peux faire à cette question pour aider à obtenir une réponse? N'hésitez pas à télécharger l'ensemble du projet si vous pouvez être dérangé, pour le vérifier. J'ai jabbing à ce problème depuis plus de 3 semaines maintenant (le soir), je suis assez coincé :( – Jimmyt1988

Répondre

0

Au fond, la question était que j'étais un DERP complet. Je mettais dans mon rectangle la largeur de la fenêtre et réajustais ensuite cette taille en fonction de l'ancienne largeur/nouvelle largeur .. bien la nouvelle largeur était déjà la taille de l'écran ... GRRRRRRR.

Questions connexes