Проблемы с DirectX - PullRequest
       30

Проблемы с DirectX

1 голос
/ 06 апреля 2011

У меня есть пара вопросов, касающихся программирования в DirectX с использованием C ++.

Первая проблема, с которой я сталкиваюсь, заключается в том, что у меня есть текстура, которая не отображается на экране должным образом.Окно устанавливается на 800x600, когда оно создается, и текстура также на 800x600, но когда программа загружена, отображается только часть текстуры.Код показан ниже для загрузки и рисования текстур.

//This sets the image
helpFileTexture = new Texture(d3dDevice, L"../Resources/Help Guide.png");

//This is the draw function
helpFileTexture->Draw(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);

//Which calls this
void Texture::Draw(long xPos, long yPos, long width, long height)
{
    sprite->Begin(NULL);
    RECT imageRectangle;
    imageRectangle.left = xPos;
    imageRectangle.top = yPos;
    imageRectangle.right = imageRectangle.left + width;
    imageRectangle.bottom = imageRectangle.top + height;

    sprite->Draw(texture, &imageRectangle, &D3DXVECTOR3(1.0f, 1.0f, 0.0f), &D3DXVECTOR3((float)xPos, (float)yPos, 0.0f), D3DCOLOR_XRGB(255, 255, 255));
    sprite->End();
}

Как я уже сказал, SCREEN_WIDTH установлен на 800, а SCREEN_HEIGHT установлен на 600 (что также соответствует размерамобраз).Он рисует сверху слева, как и должно быть, но покажет только часть изображения.Размер окна был установлен около 1100x1100, когда все изображение было видно.Я сделал что-то не так в кодировке, чтобы установить размер изображения.

Следующее, что у меня возникла проблема с сокрытием курсора.Я хочу скрыть курсор, когда я нажимаю левую кнопку мыши, а затем снова появляется, когда я отпускаю.Но курсор не исчезает.Код для этого приведен ниже.

if(input->mouseButtons.rgbButtons[0])
{
    d3dDevice->ShowCursor(FALSE);
    GetCursorPos(&input->mousePosition);
    SetCursorPos(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2);
    input->mousePosition.x -= SCREEN_WIDTH / 2;
    mainCamera->UpdateYaw(input->mousePosition.x * rotationSpeed);
    indexYaw += mainCamera->GetYaw();
    D3DXMatrixRotationY(&viewMatrix, indexYaw);
    d3dDevice->SetTransform(D3DTS_VIEW, &viewMatrix);
}
else
{
    d3dDevice->ShowCursor(TRUE);
}

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

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

Я знаю, что это много, я спрашивал, нолюбая помощь будет отличной

1 Ответ

2 голосов
/ 06 апреля 2011

Исправление, которое вы внедрили, неверно (масштабируемое).Причина проблемы с размером заключается в том, что когда текстура загружается с использованием метода D3DXLoadTextureFromFile, DirectX изменяет размер изображения до ближайшего значения в 2, превышающего фактический размер.Следовательно, причина его появления больше, чем у экрана.

Итак, чтобы не допустить этого, вы должны использовать метод D3DXLoadTextureFromFileEx и указать D3DX_DEFAULT_NONPOW2 для параметров 3 и 4. Это остановит DirectX от масштабированиядо размера текстуры.Для получения дополнительной информации о методе см. Страницу MSDN: http://msdn.microsoft.com/en-us/library/bb172802(v=vs.85).aspx

Примечание. Обязательно используйте D3DPOOL_MANAGED в качестве опции D3DPOOL, в противном случае, если вы используете D3DPOOL_DEFAULT, ваши модели станут прозрачными!(как я узнал).

...