for循环不正常

时间:2010-11-25 20:13:47

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

我有这个循环检查两个对象。它的问题是,它只检查第一个,但它没有检查其他...当我的循环检查第一个对象进行选择时说是否已经被选中,但是当它再次循环检查时它说第二个物体即使被采摘也没有被采摘。所以我做的是我改变了检查过程。像现在一样检查第二个对象,而不是检查第一个对象。所以在我这样做之后,我得到了这个结果它说第二个对象被选中或者没有,它工作正常但是当它再次循环时它开始检查第一个对象它说它即使被挑选也没有被挑选..
这是我的循环

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 个答案:

答案 0 :(得分:2)

您应该将for声明修改为:

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

现在你写1>=i,这意味着i小于或等于1.所以循环就像编码一样。

答案 1 :(得分:1)

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

答案 2 :(得分: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;
    }
}