Search code examples
c++directx-9

Game Crashing on Window Resize (Directx9)


Since adding a sprite class into a game I am working on, if the user resizes the window it crashes. I had a similar issue when rendering to the back buffer, this was resolved by using the OnLostDevice() and OnResetDevice() methods but that doesn't seem to be working and at this point I'm not sure what to do I feel like I'm missing something hideously obvious.

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();
   }

Within the Game.cpp Device loss is handled here:

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

   }

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

The break that is triggered when the window is resized:

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;

Solution

  • I was releasing the sprite in TitleScreen->OnLostDevice() but not the texture that was also in the sprite class

    testing the co-operative level with the above solution stopped the game crashing but messed with the resolution of assets on each resize