我有几个关于使用C++在DirectX中编程的问题。
我遇到的第一个问题是,我有一个纹理不能在屏幕上正确显示。窗口在创建时设置为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);
}正如你所看到的,当鼠标左键点击相机控件时,光标应该消失了,但它仍然显示。
最后几件事是什么是实现物体和地形之间碰撞检测的最好方法,或者你能链接到哪里可以找到它们的好地方。
我知道这是我要求的很多,但任何帮助都是最好的
发布于 2011-04-07 01:23:01
您实现的修复是不正确的(伸缩修复)。出现大小调整问题的原因是,当使用D3DXLoadTextureFromFile方法加载纹理时,DirectX会将图像的大小更改为比实际大小大2的最接近幂。因此,它看起来比屏幕大的原因。
因此,为了防止它这样做,你应该使用D3DXLoadTextureFromFileEx方法,并为参数3和4指定D3DX_DEFAULT_NONPOW2。这将阻止DirectX放大纹理的大小。有关该方法的更多信息,请参阅MSDN页面:http://msdn.microsoft.com/en-us/library/bb172802(v=vs.85).aspx
注意:确保使用D3DPOOL_MANAGED作为D3DPOOL选项,否则如果您使用D3DPOOL_DEFAULT,您的模型将变为透明!(正如我所发现的)。
https://stackoverflow.com/questions/5566040
复制相似问题