Sprite.Draw () рисует мои текстуры слишком маленькие - PullRequest
1 голос
/ 07 января 2011

Я объявил устройство + спрайт в Windows. Форма как это

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 ]

1 голос
/ 12 сентября 2011

Предупреждение: я не эксперт по DirectX, но у меня была такая же проблема.

Когда вы загружаете спрайт, он расширяет спрайт до размера, в котором каждое измерение имеет степень 2. Например, если у вас был спрайт 200 х 65, спрайт будет иметь ширину 256 ( расширен до ширины 256, слегка увеличив ее) на 128 (почти удваивая высоту).

Когда вы рисуете изображение, оно будет почти в два раза больше ожидаемой вами высоты.

Мое решение состояло в том, чтобы изменить мой файл изображения так, чтобы он имел высоту и ширину с коэффициентом 2, а затем рисовать только ту часть, которая имела исходный размер.

1 голос
/ 19 июля 2011

У меня есть опыт работы с 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();
}

По общему признанию, это не очень объектно-ориентированный способ выполнения вещей, но он удовлетворяет моим потребностям.

...