Sprite.Draw()绘制的纹理太小了

时间:2011-01-07 14:30:32

标签: c# .net directx sprite

我在像这样的Windows.Form中声明了一个设备+精灵

PresentParameters presentParameters = new PresentParameters();
presentParameters.Windowed = true;
presentParameters.SwapEffect = SwapEffect.Copy;

var device = new Device(Manager.Adapters.Default.Adapter, DeviceType.Hardware, this, CreateFlags.HardwareVertexProcessing, presentParameters);

var sprite = new Sprite(device);

我通过TextureLoader.FromFile(device, "image.png");

加载了一个纹理

在我的Draw方法中,我启动了设备场景,然后是精灵场景,然后我写了 sprite.Draw2D(texture, PointF.Empty, 0, PointF.Empty, Color.White);

绘图本身有效,但它只绘制了大部分缩放到屏幕上的图像(如90%)

我尝试使用具有给定纹理大小的源矩形,但发生了同样的错误

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

我在C ++ DirectX方面经验丰富,但不是C#DirectX,所以请耐心等待。

根据我对Sprite界面的体验,您需要像3D对象一样进行缩放,旋转和平移。你可能忘记了扩展。这是我的更新功能的代码。

void Button::Update()
{
    Sprite->Begin(D3DXSPRITE_ALPHABLEND);
    D3DXMATRIX trans;
    D3DXMATRIX scale;
    D3DXMATRIX world;
    D3DXMatrixIdentity(&world);
    D3DXMatrixTranslation(&trans, pos.x, pos.y, 0.0f);
    D3DXMatrixScaling(&scale, scaleFactor, scaleFactor, 1.0f);
    world = scale * trans;
    Sprite->SetTransform(&world);
    Sprite->Draw(buttonTexture, NULL, NULL, &D3DXVECTOR3(-width2, -height2, 0.0), whitecol);
    Sprite->End();
}

不可否认,这不是一种非常面向对象的做事方式,但它符合我的需要。

答案 1 :(得分:1)

警告:我不是DirectX专家,但我遇到了同样的问题。

当您加载精灵时,它会扩展精灵以适合每个维度为2的幂的大小。例如,如果您的精灵是200 x 65,精灵的宽度将为256(并且图像将是扩展到256的宽度,略微增加128)(几乎加倍高度)。

绘制图像时,它几乎是预期高度的两倍。

我的解决方法是修改我的图像文件,使其高度和宽度为2,然后只绘制原始大小的部分。