2013-04-28 2 views
1

С добавлением класса спрайтов в игру, над которой я работаю, если пользователь изменяет размер окна, он падает. У меня была аналогичная проблема при рендеринге в задний буфер, это было разрешено с помощью методов OnLostDevice() и OnResetDevice(), но это, похоже, не работает, и на данный момент я не уверен, что делать. Я чувствую, что мне не хватает что-то ужасно очевидно.Игра Crashing on Window Resize (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); 
    }