【问题标题】:for loop is not working rightfor 循环无法正常工作
【发布时间】:2010-11-25 20:13:47
【问题描述】:

我有一个检查两个对象的循环。它的问题在于,它只检查第一个,但不检查其他...当我的循环检查第一个对象以进行拾取时,它说它是否已被拾取,但是当它再次循环检查时它说它没有被拾取的第二个对象,即使它被拾取。所以我所做的是我切换了检查过程。就像现在检查第二个对象而不是检查第一个对象。所以在我这样做之后,我得到了这个结果,它说第二个对象是否被拾取,它工作正常,但是当它再次循环时,它开始检查第一个对象,它说即使它被拾取也没有被拾取..
这是我的循环

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;
}

【问题讨论】:

  • 没有标点符号的描述真的很难阅读。
  • 请使用标点符号。很难理解你的问题。
  • 请尝试改写。
  • 你的 i 只能是 0 和 1。如果你想要更多,你需要更改条件以包含更多。
  • 尽管有标点符号,但还是要感谢一位 13 岁从事 C++ 游戏开发的年轻人(是的,他 13 岁!)。

标签: c++ winapi visual-c++ directx for-loop


【解决方案1】:

您应该将您的 for 语句修改为:

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

现在你写1&gt;=i,这意味着i小于或等于1。所以循环就像你编写的那样工作。

【讨论】:

    【解决方案2】:

    我认为您必须重置 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;
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我认为这不是问题,因为当我调试我的代码时,我可以看到 hasHit 何时更改
      猜你喜欢
      • 2017-11-11
      • 1970-01-01
      • 1970-01-01
      • 2020-01-30
      • 2013-06-26
      • 2016-01-01
      • 2021-09-26
      • 2020-10-27
      • 2012-01-02
      相关资源
      最近更新 更多