C++ for循环工作不正常

C++ for循环工作不正常,c++,winapi,visual-c++,directx,for-loop,C++,Winapi,Visual C++,Directx,For Loop,我有一个检查两个对象的循环。它的问题是,它只检查第一个,但不检查其他。。。当我的循环检查要拾取的第一个对象时,它会显示是否已拾取,但当它再次循环检查第二个对象时,它会显示尚未拾取,即使在拾取时也是如此。我所做的就是切换了检查流程。像现在一样,第二个对象比第一个对象被检查。因此,在我这样做之后,我得到了这个结果,它表示第二个对象是否被拾取,它工作正常,但当它再次循环时,它开始检查第一个对象,它表示即使在拾取时它也没有被拾取。 这是我的循环 for(int i=0; 1>=i; i++)

我有一个检查两个对象的循环。它的问题是,它只检查第一个,但不检查其他。。。当我的循环检查要拾取的第一个对象时,它会显示是否已拾取,但当它再次循环检查第二个对象时,它会显示尚未拾取,即使在拾取时也是如此。我所做的就是切换了检查流程。像现在一样,第二个对象比第一个对象被检查。因此,在我这样做之后,我得到了这个结果,它表示第二个对象是否被拾取,它工作正常,但当它再次循环时,它开始检查第一个对象,它表示即使在拾取时它也没有被拾取。
这是我的循环

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:
好吧,我觉得你们没听懂我的意思。我不想让我的循环检查更多的
实体

好的,我会的。事情就是这样。
1.当它第一次循环时,检查是否拾取了
实体[0]
,此步骤工作正常。
2.当它第二次循环时,检查是否拾取了
实体[1]
,这就是问题所在。
我的循环在第一次循环时工作正常,但在第二次循环时不工作。
当我调试时,我试过这个。
1.当它第一次循环时,检查是否拾取了
实体[1]
,此步骤工作正常。
2.当它第二次循环时,检查是否拾取了
实体[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;
}
boold3ddevice::Picking(HWND-HWND,LPDIRECT3DDEVICE9-d3ddev,CXFileEntity*entity[4])
{
d3dx矩阵元;
点pt;
D3DVIEWPORT9 vp;
D3DXMATRIX*matWorld=NULL;
D3DX矩阵视图;
GetCursorPos(&pt);
屏幕客户端(硬件、硬件和pt);
d3ddev->GetTransform(D3DTS_投影和matProj);
d3ddev->GetViewport(&vp);
d3ddev->GetTransform(D3DTS_视图和matView);
D3DXVECTOR3光线位置((浮点)点x,(浮点)点y,0);//接近平面位置
D3DXVECTOR3光线方向((浮点)点x,(浮点)点y,1);//远平面位置
布尔·哈希特;
浮动距离集合;
对于(int i=0;is;
//利用矩阵的逆
D3DXVec3Unproject(&rayPos,&rayPos,&vp,&matProj,&matView,matWorld);
D3DXVEC3取消项目(&rayDir,&rayDir,&vp,&matProj,&matView,matWorld);
rayDir-=rayPos;//从两个位置生成一个方向
d3dxvec3规范化(&rayDir,&rayDir);
if(失败(D3DXIntersect(实体[i]->pDrawMesh,&rayPos,&rayDir,&hasHit,NULL,NULL,NULL,&distanceToCollision,NULL,NULL)))
{
PostQuitMessage(0);
};
if(hasHit!=0)
{
实体[i]->draw=false;
}
}
返回hasHit;
}

您应该将
for
语句修改为:

int size = ... // detect the size of entity
for(int i=0; i <= size; i++)
int size=…//检测实体的大小

对于(int i=0;i=i
,它意味着
i
小于或等于1。因此循环的工作方式与您对其进行编码的方式相同。

您应该将
for
语句修改为:

int size = ... // detect the size of entity
for(int i=0; i <= size; i++)
int size=…//检测实体的大小

对于(int i=0;i=i
,这意味着
i
小于或等于1。因此循环的工作方式与您对其进行编码的方式相同。

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

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

我认为您必须重置它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;
    }
}
for(int i=0;is;
//利用矩阵的逆
D3DXVECTOR3光线位置((浮点)点x,(浮点)点y,0);//接近平面位置
D3DXVECTOR3光线方向((浮点)点x,(浮点)点y,1);//远平面位置
D3DXVec3Unproject(&rayPos,&rayPos,&vp,&matProj,&matView,matWorld);
D3DXVEC3取消项目(&rayDir,&rayDir,&vp,&matProj,&matView,matWorld);
rayDir-=rayPos;//从两个位置生成一个方向
d3dxvec3规范化(&rayDir,&rayDir);
if(失败(D3DXIntersect(实体[i]->pDrawMesh,&rayPos,&rayDir,&hasHit,NULL,NULL,NULL,&distanceToCollision,NULL,NULL)))
{
PostQuitMessage(0);
};
if(hasHit!=0)
{
实体[i]->draw=false;
}
}

我认为您必须重置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;
    }
}
for(int i=0;is;
//利用矩阵的逆
D3DXVECTOR3光线位置((浮点)点x,(浮点)点y,0);//接近平面位置
D3DXVECTOR3光线方向((浮点)点x,(浮点)点y,1);//远平面位置
D3DXVec3Unproject(&rayPos,&rayPos,&vp,&matProj,&matView,matWorld);
D3DXVEC3取消项目(&rayDir,&rayDir,&vp,&matProj,&matView,matWorld);
rayDir-=rayPos;//从两个位置生成一个方向
d3dxvec3规范化(&rayDir,&rayDir);
if(失败(D3DXIntersect(实体[i]->pDrawMesh,&rayPos,&rayDir,&hasHit,NULL,NULL,NULL,&distanceToCollision,NULL,NULL)))
{
PostQuitMessage(0);
};
if(hasHit!=0)
{
实体[i]->draw=false;
}
}

这个标示很难读,没有标点符号。请使用标点符号。很难理解你的问题。请尝试改写。你只能是0和1。如果你想要更多,你需要改变条件,包括更多。尽管标点符号,一个13岁的孩子在C++开发游戏时的荣誉。(是的,他13岁!)这个描述是真实的