2010-11-25 154 views
0

我有这个循环检查两个对象。它的问题在于,它只检查第一个,但它不检查其他...当我的循环检查第一个对象选择它说如果它已被选中或没有,但当它再次循环检查它说它没有被选中的第二个对象,即使它被选中。所以我做的是我切换了检查过程。像现在一样,第二个对象被检查,而第一个对象被检查。所以,当我这样做后,我得到了这个结果它说,第二个对象被选中或没有,它工作正常,但当它再次循环时,它开始检查第一个对象,说它不被挑选,即使当它被挑选..
这里是我的循环for循环不能正常工作

for(int i=0; 1>=i; i++) 
    { 
     matWorld=entity[i]->s; 
     // Use inverse of matrix 
     D3DXVec3Unproject(&rayPos,&rayPos,&vp,&matProj,&matView,matWorld); 
     D3DXVec3Unproject(&rayDir,&rayDir,&vp,&matProj,&matView,matWorld); 
     rayDir -= rayPos; // make a direction from the 2 positions 
     D3DXVec3Normalize(&rayDir,&rayDir); 

     if(FAILED(D3DXIntersect(entity[i]->pDrawMesh, &rayPos, &rayDir, &hasHit, NULL, NULL, NULL, &distanceToCollision, NULL, NULL))) 
     { 
      PostQuitMessage(0); 
     }; 

     if(hasHit!=0) 
     { 
      entity[i]->draw=false; 
     } 
    } 

任何想法?

编辑2:
好吧,我不认为你们明白我的权利。我不想让我的循环检查更多entity
好吧,我会这样发生。
1.当它第一次循环时,检查entity[0]是否被选中,这一步工作正常。
2.当它第二次循环时,检查entity[1]是否被选中,这是问题所在。
我的循环在第一次循环时工作正常,但它在第二次循环时不起作用。
当我调试我试过这个。
1.当它第一次循环时,检查entity[1]是否被选中,此步骤工作正常。
2.当它第二次循环时,检查是否挑选entity[2],这是问题所在。 似乎在第一次循环后出现了错误,但我看不到它是什么。顺便说一句,我没有得到任何错误。 编辑3: 整函数

BOOL D3dDevice::Picking(HWND hWnd, LPDIRECT3DDEVICE9 d3ddev, CXFileEntity *entity[4]) 
{ 
    D3DXMATRIX matProj; 
    POINT pt; 
    D3DVIEWPORT9 vp; 
    D3DXMATRIX *matWorld=NULL; 
    D3DXMATRIX matView; 

    GetCursorPos(&pt); 
    ScreenToClient(hWnd, &pt); 
    d3ddev->GetTransform(D3DTS_PROJECTION, &matProj); 
    d3ddev->GetViewport(&vp); 
    d3ddev->GetTransform(D3DTS_VIEW, &matView); 

    D3DXVECTOR3 rayPos((float)pt.x, (float)pt.y,0); // near-plane position 
    D3DXVECTOR3 rayDir((float)pt.x, (float)pt.y,1); // far-plane position 

    BOOL hasHit; 
    float distanceToCollision; 
    for(int i=0; i<=1; i++) 
    { 
     matWorld=entity[i]->s; 
     // Use inverse of matrix 
     D3DXVec3Unproject(&rayPos,&rayPos,&vp,&matProj,&matView,matWorld); 
     D3DXVec3Unproject(&rayDir,&rayDir,&vp,&matProj,&matView,matWorld); 
     rayDir -= rayPos; // make a direction from the 2 positions 
     D3DXVec3Normalize(&rayDir,&rayDir); 

     if(FAILED(D3DXIntersect(entity[i]->pDrawMesh, &rayPos, &rayDir, &hasHit, NULL, NULL, NULL, &distanceToCollision, NULL, NULL))) 
     { 
      PostQuitMessage(0); 
     }; 

     if(hasHit!=0) 
     { 
      entity[i]->draw=false; 
     } 
    } 

    return hasHit; 
} 
+3

这样的描述是真的很难,没有标点符号阅读。 – BBoy 2010-11-25 20:17:02

+0

确定即时添加他们现在对不起 – Ramilol 2010-11-25 20:18:31

+3

这是......一个句子? – jwueller 2010-11-25 20:18:46

回答

1

我认为你必须重置rayPos和rayDir结构的价值,因为你改变了初始值内循环:

for(int i=0; i<=1; i++) 
{ 
    matWorld=entity[i]->s; 
    // Use inverse of matrix 
    D3DXVECTOR3 rayPos((float)pt.x, (float)pt.y,0); // near-plane position 
    D3DXVECTOR3 rayDir((float)pt.x, (float)pt.y,1); // far-plane position 
    D3DXVec3Unproject(&rayPos,&rayPos,&vp,&matProj,&matView,matWorld); 
    D3DXVec3Unproject(&rayDir,&rayDir,&vp,&matProj,&matView,matWorld); 
    rayDir -= rayPos; // make a direction from the 2 positions 
    D3DXVec3Normalize(&rayDir,&rayDir); 

    if(FAILED(D3DXIntersect(entity[i]->pDrawMesh, &rayPos, &rayDir, &hasHit, NULL, NULL, NULL, &distanceToCollision, NULL, NULL))) 
    { 
     PostQuitMessage(0); 
    }; 

    if(hasHit!=0) 
    { 
     entity[i]->draw=false; 
    } 
} 
2

你应该解决您for声明:

int size = ... // detect the size of entity 
for(int i=0; i <= size; i++) 

现在你写1>=i,这意味着i小于或等于1所以循环按照您编码的方式工作。

1

如果hasHit是您检查对象是否被选中的变量,它看起来不像您当前正在检查特定于每个对象的变量。它似乎只是一个变量,永远不会在for循环中更新,并且始终保持相同的值。