由于在我正在处理的游戏中添加一个精灵类,如果用户调整窗口大小,它就会崩溃。在渲染到后台缓冲区时我遇到了类似的问题,这是通过使用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;
答案 0 :(得分:1)
您需要测试设备是否需要重置,我建议您使用TestCooperativeLevel。
E.G。
if(HRESULT(mpd3dDevice->TestCooperativeLevel()))
{
if(FAILED(mpd3dDevice->Reset(&md3dParams)))
MPOD_ASSERT(false);
}
答案 1 :(得分:1)
我在TitleScreen-&gt; OnLostDevice()中发布精灵,但不是精灵类中的纹理
用上述解决方案测试合作水平使游戏崩溃,但每次调整大小的资产解决方案都搞乱了