2010-11-25 4 views
0

У меня есть этот цикл, который проверяет два объекта. Проблема с ним заключается в том, что он проверяет только первый, но не проверяет другие. Когда мой цикл проверяет первый объект для его выбора, он говорит, что он был выбран или нет, но когда он снова петлиет, чтобы проверить второй объект говорит, что он не был выбран, даже когда он был выбран. Так что я сделал то, что я переключил процесс проверки. Как и сейчас, второй объект проверяется, чем проверяется первый объект. Поэтому после того, как я сделал это, я получил этот результат, он говорит, что второй объект получил или нет, он отлично работает, но когда он снова петлиет, он начинает проверять первый объект, который говорит, что он не выбран, даже когда он был выбран.
вот моя петлядля цикла не работает правильно

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

любая идея?

EDIT 2:
нормально я не думаю, что вы, ребята поняли меня правильно. Я не пытаюсь проверить мой цикл еще entity.
Хорошо, я это сделаю.
1. Когда он впервые зацикливается на нем, проверяет, выбрано ли entity[0] или нет, этот шаг работает нормально.
2. Когда он петли во второй раз, проверяет, выбрано ли entity[1], ЗДЕСЬ ПРОБЛЕМА.
моя петля отлично работает, когда она петли в первый раз, но она не работает, когда она зацикливается во второй раз.
Когда я был отлажен, я попробовал это.
1. Когда он впервые зацикливается на нем, проверяет, выбрано ли entity[1] или нет, этот шаг работает нормально.
2. Когда он петли во второй раз, проверяет, выбрано ли entity[2], ЗДЕСЬ ПРОБЛЕМА. кажется, что после первого цикла есть что-то не так, но я не вижу, что это такое. Кстати, я не получаю никаких ошибок. EDIT 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

Это ... _one_ предложение? – 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 и всегда будет поддерживать одно и то же значение.

Смежные вопросы