2011-01-07 36 views
1

我聲明的裝置+精靈在這樣Sprite.Draw()繪製我的紋理太小

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

一個Windows.Form予加載經由TextureLoader.FromFile(device, "image.png");

紋理以我Draw方法我startet的裝置現場,那麼精靈的場景,然後我寫 sprite.Draw2D(texture, PointF.Empty, 0, PointF.Empty, Color.White);

圖紙本身的工作原理,但它吸引放大到屏幕上的圖像的只是一個大的一部分(如90%)

我試過它與給定的紋理尺寸太矩形源,但同樣的錯誤發生

有什麼建議嗎?

回答

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(); 
} 

不可否認,這不是一個非常面向對象的做事方式,但它適合我的需求。

+0

謝謝,這指出我在正確的方向。對於其他使用SlimDX的人,請查看`Sprite.Transform = Matrix.Scaling(0.1,0.1,0.1)` – Basic 2013-10-06 21:32:05

1

警告:我不是DirectX專家,但我遇到了同樣的問題。

加載精靈時,它將展開精靈以適合每個維度爲2的冪的大小。例如,如果精靈是200 x 65,則精靈將具有256的寬度(並且圖像將會擴展到256的寬度,稍微增加128)(高度幾乎翻倍)。

當您繪製圖像時,它將幾乎是您預期的高度的兩倍。

我的解決方案是修改我的圖像文件的高度和寬度因子爲2,然後只繪製原始大小的部分。

+0

OMFG謝謝。在我正在進行的遊戲中,我遇到了類似的問題,我無法弄清楚爲什麼我的按鈕(384x48)看起來正在放大,然後384x48矩形切掉了底部和右邊緣。我完全忘記了384和48不是2的權力。 – derpface 2012-09-19 10:43:22