游戏崩溃窗口调整大小(Directx9)
问题描述:
由于在我正在处理的游戏中添加一个精灵类,如果用户调整它崩溃的窗口大小。当渲染到后台缓冲区时,我遇到了类似的问题,通过使用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;
答
我被释放在TitleScreen-> OnLostDevice(精灵),但并不是说也是在子画面类
测试与上述溶液合作社级纹理停止游戏崩溃而弄乱每次调整资产的分辨率
答
您需要测试设备是否需要重新设置,我建议您使用TestCooperativeLevel。
E.G.
if(HRESULT(mpd3dDevice->TestCooperativeLevel()))
{
if(FAILED(mpd3dDevice->Reset(&md3dParams)))
MPOD_ASSERT(false);
}