2011-12-12 100 views
0

我正在处理一个DX11项目,并使用静态函数得到一个奇怪的行为。我对静态函数有点没有教育,所以我可能在某个地方犯了错误。静态函数的意外行为

我的功能很简单:

namespace Rendering 
{ 
    static bool PlaceObjectInMatrix(EntityBase* obj, D3DXMATRIX world) 
    { 

     D3DXMatrixTranslation(&world, obj->GetPosition()->x, obj->GetPosition()->y, obj->GetPosition()->z); 
     return true; 
    } 
} 

,它被称为在循环中呈现的所有对象:

for(unsigned int i = 0; i < listSize; i++) 
    { 

     if(entities[i].taken == false) 
      continue; 
     entities[i].entry->Render(deviceContext, shader); 

     PlaceObjectInMatrix(entities[i].entry, worldMatrix); 

     if(entities[i].entry->GetIndexCount() != 0) 
     { 
      shader->Render(deviceContext, entities[i].entry->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, entities[i].entry->GetTexture(), m_debugLight->GetDirection(), m_debugLight->GetDiffuseColor()); 
      objectsRendered++; 
     } 

     d3d->GetWorldMatrix(worldMatrix); //reset world matrix 
    } 

但是,这是行不通的。然而,当我用功能本身中的函数调用替换该行时,它确实起作用。这就像是在函数调用中迷失方向。

EntityBase类是抽象的,而我实际呈现的类称为EntityModelStatic,它是从EntityModel派生的。

+2

因为我对Direct3D的了解不多,所以这只是一个建议:将'world'参数引用为'D3DXMATRIX& world'。 – Xeo

回答

2

PlaceObjectInMatrix()函数在worldMatrix副本上运行。要改变原有的矩阵必须声明函数是这样的:

static bool PlaceObjectInMatrix(EntityBase* obj, D3DXMATRIX& world); 

更传统的方式是使用指针,就像这样:

static bool PlaceObjectInMatrix(const EntityBase& obj, D3DXMATRIX* world); 

这样任何人读取调用代码类似PlaceObjectInMatrix(*实体[i] .entry,& worldMatrix)会意识到,该函数将改变世界矩阵对象

+0

哇,谢谢。我猜想一个愚蠢的错误;) – smoth190

2
static bool PlaceObjectInMatrix(EntityBase* obj, D3DXMATRIX world) 

world参数是按值传递,因此函数都有自己的副本,并在调用者的变量不发生改变。这可能是你的问题。

使用指针(如D3DXMatrixTranslation)或引用,您的问题可能会消失。