1

私が取り組んでいるゲームにスプライト クラスを追加して以来、ユーザーがウィンドウのサイズを変更するとクラッシュします。バック バッファへのレンダリング時に同様の問題が発生しました。これはメソッドOnLostDevice()OnResetDevice()メソッドを使用して解決されましたが、機能していないようで、この時点で何をすべきかわかりません。明らか。

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 に答える