2011-01-07 8 views
1

ich ein Gerät + Sprite in einem Windows.Form wie diesesSprite.Draw() zeichnet meine Texturen zu klein

erklärt
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); 

ich eine Textur über TextureLoader.FromFile(device, "image.png");

In meinem Draw-Methode geladen i startet die Gerät Szene, dann ist die Sprite-Szene, dann schrieb ich sprite.Draw2D(texture, PointF.Empty, 0, PointF.Empty, Color.White);

die Zeichnung selbst funktioniert, aber es zieht nur einen großen Teil des Bildes auf dem Bildschirm skaliert (wie 90%)

Ich versuchte es mit einem Quellrechteck mit der gegebenen Texturgröße auch, aber der gleiche Fehler trat auf

irgendwelche Vorschläge?

Antwort

1

Ich habe Erfahrung in C++ DirectX, aber nicht in C# DirectX, also nehmen Sie das mit einem Körnchen Salz.

In meinen Erfahrungen mit der Sprite-Oberfläche müssen Sie skalieren, drehen und übersetzen, wie Sie es mit 3D-Objekten benötigen. Sie werden vielleicht vergessen zu skalieren. Hier ist der Code meiner Update-Funktion.

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

Zugegeben, dies ist keine sehr objektorientierte Art, Dinge zu tun, aber es passt zu meinen Bedürfnissen.

+0

Danke, dies wies mich in die richtige Richtung. Für andere, die SlimDX verwenden, werfen Sie einen Blick auf 'Sprite.Transform = Matrix.Scaling (0.1, 0.1, 0.1)' – Basic

1

Vorbehalt: Ich bin kein DirectX-Experte, aber ich hatte das gleiche Problem.

Wenn Sie das Sprite laden, wird das Sprite auf eine Größe erweitert, in der jede Dimension eine Zweierpotenz hat. Wenn Sie zum Beispiel 200 x 65 sprites hatten, hat das Sprite eine Breite von 256 (und das Bild wird auf eine Breite von 256 erweitert werden, erhöht es leicht) um 128 (fast die doppelte Höhe).

Wenn Sie das Bild zeichnen, ist es fast doppelt so groß wie erwartet.

Meine Lösung war, meine Bilddatei zu ändern, um eine Höhe und Breite von einem Faktor von 2 zu haben und dann nur den Teil zu zeichnen, der die ursprüngliche Größe war.

+0

OMFG DANKE. Ich hatte ein ähnliches Problem in einem Spiel, an dem ich arbeite, und ich konnte nicht herausfinden, warum meine 384x48-Tasten anscheinend vergrößert wurden und dann das 384x48-Rechteck die unteren und rechten Kanten abschnitt. Ich habe total vergessen, dass 384 und 48 keine Potenzen von 2 sind. – derpface