1

由于将精灵类添加到我正在开发的游戏中,如果用户调整窗口大小,它会崩溃。我在渲染到后台缓冲区时遇到了类似的问题,这是通过使用OnLostDevice()andOnResetDevice()方法解决的,但这似乎不起作用,此时我不知道该怎么做我觉得我错过了一些可怕的东西明显的。

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;
4

2 回答 2

1

您需要测试设备是否需要重置,我建议您使用TestCooperativeLevel。

例如

if(HRESULT(mpd3dDevice->TestCooperativeLevel()))
  {
     if(FAILED(mpd3dDevice->Reset(&md3dParams)))
     MPOD_ASSERT(false);
  }
于 2013-04-28T15:47:40.783 回答
1

我在 TitleScreen->OnLostDevice() 中发布了精灵,但不是精灵类中的纹理

使用上述解决方案测试合作级别会阻止游戏崩溃,但会在每次调整大小时弄乱资产分辨率

于 2013-05-03T10:17:33.203 回答