2013-04-28 114 views
1

由於在我正在處理的遊戲中添加一個精靈類,如果用戶調整它崩潰的窗口大小。當渲染到後臺緩衝區時,我遇到了類似的問題,通過使用OnLostDevice()OnResetDevice()方法解決了這個問題,但這似乎沒有奏效,此時我不知道該怎麼辦我覺得我很想念一些顯而易見的東西。遊戲崩潰窗口調整大小(Directx9)

Sprite.h

#pragma once 
#include <d3d9.h> 
#include <d3dx9tex.h> 
#include <string> 

class Sprite 
{ 
public: 
Sprite(void); 
virtual ~Sprite(void); 

bool loadSprite(LPDIRECT3DDEVICE9 device, std::string filename); 

void render(LPDIRECT3DDEVICE9 pDevice, int alpha); 
void setPosition(int x, int y); 
void setSize(int newWidth, int newHeight); 
void OnLostDevice(); 
void OnResetDevice(); 

int getHeight(); 
int getWidth(); 

    private: 
LPD3DXSPRITE sprite; 
LPDIRECT3DTEXTURE9 texture; 
D3DXVECTOR3 position; 
D3DXVECTOR3 scale; 

float width; 
float height; 

}; 

Sprite.cpp

#include "sprite.h" 
    #include "D3DManager.h" 

    Sprite::Sprite(void) 
    { 

    } 

Sprite::~Sprite(void) 
{ 
    if (sprite != nullptr) 
     delete sprite; 

    sprite = nullptr; 
} 

    bool Sprite::loadSprite(LPDIRECT3DDEVICE9 device, std::string filename) 
{ 
D3DXCreateSprite(device, &sprite); 
D3DXCreateTextureFromFileEx(device, filename.c_str(), D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, D3DX_FILTER_NONE, D3DX_FILTER_NONE, 0xFFFF00FF, NULL, NULL, &texture); 

D3DXIMAGE_INFO imageInfo; 
D3DXGetImageInfoFromFile(filename.c_str(), &imageInfo); 

height = (float)imageInfo.Height; 
width = (float)imageInfo.Width; 

return true; 
    } 


    void Sprite::render(LPDIRECT3DDEVICE9 pDevice, int alpha) 
    { 

alpha = (int)(255*((float)alpha/100)); 
D3DXMATRIX scaleMatrix; 
D3DXMATRIX transMatrix; 
D3DXMatrixScaling(&scaleMatrix, scale.x, scale.y, scale.z); 
D3DXMatrixTranslation(&transMatrix, position.x, position.y, position.z); 

D3DXMatrixMultiply(&transMatrix, &scaleMatrix, &transMatrix); 
sprite->SetTransform(&transMatrix); 

sprite->Begin(D3DXSPRITE_ALPHABLEND); 
sprite->Draw(texture, NULL, NULL, NULL, D3DCOLOR_RGBA(255,255,255,alpha)); 
sprite->End(); 

    } 


    void Sprite::setPosition(int x, int y){ 
    position.x = (float)x; 
    position.y = (float)y; 
    position.z = 0.0f; 
    } 


    void Sprite::setSize(int newWidth, int newHeight) 
     { 

     scale.x = (float)newWidth/width; 
     scale.y = (float)newHeight/height; 
     scale.z = 0; 
     } 


    int Sprite::getWidth(){ 
    return (int)width; 
    } 

    int Sprite::getHeight(){ 
    return (int)height; 
    } 

    void Sprite::OnLostDevice() 
    { 
    sprite->OnLostDevice(); 
    } 

    void Sprite::OnResetDevice() 
    { 
    sprite->OnResetDevice(); 
    } 

Game.cpp設備損失這裏處理:

void OnLostDevice(void *pContext) 
    { 
    gFont -> LostDevice(); 
    TitleScreen->OnLostDevice(); 
    D3DManager::Get()->ReleaseScene(); 

    } 

    void OnResetDevice(void *pContext) 
    { 
    TitleScreen->OnResetDevice(); 
    gFont -> ResetDevice(); 
    D3DManager::Get()->ResetScene(); 
    } 

當窗口大小時觸發的突破:

case WM_EXITSIZEMOVE: 
    GetClientRect(mhWnd, &clientRect); 
    md3dParams.BackBufferWidth = clientRect.right; 
    md3dParams.BackBufferHeight = clientRect.bottom; 
    mpOnLostDevice(mpResetAndLost); 
    **if(FAILED(mpd3dDevice->Reset(&md3dParams))) 
     MPOD_ASSERT(false);** 
    mpOnResetDevice(mpResetAndLost); 
    return 0; 

回答

1

我被釋放在TitleScreen-> OnLostDevice(精靈),但並不是說也是在子畫面類

測試與上述溶液合作社級紋理停止遊戲崩潰而弄亂每次調整資產的分辨率

1

您需要測試設備是否需要重新設置,我建議您使用TestCooperativeLevel。

E.G.

if(HRESULT(mpd3dDevice->TestCooperativeLevel())) 
    { 
    if(FAILED(mpd3dDevice->Reset(&md3dParams))) 
    MPOD_ASSERT(false); 
    }