2010-11-25 8 views
0

J'ai cette boucle qui vérifie deux objets. Le problème avec ça, c'est que ça vérifie seulement le premier mais ça ne vérifie pas les autres ... Quand ma boucle vérifie le premier objet à cueillir il dit s'il a été choisi ou non, mais quand il boucle à nouveau pour vérifier le deuxième objet dit qu'il n'a pas été choisi, même quand il a été choisi. Donc ce que j'ai fait est que j'ai changé le processus de vérification. Comme maintenant le deuxième objet est vérifié que le premier objet est vérifié. Donc après avoir fait cela, j'ai obtenu ce résultat, il dit que le deuxième objet a été choisi ou non, il fonctionne bien mais quand il boucle à nouveau il commence à vérifier le premier objet qu'il dit qu'il n'est pas cueilli même quand il a été cueilli. voici ma bouclepour la boucle ne fonctionne pas correctement

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

une idée?

EDIT 2:
ok je ne pense pas que les gars me compris à droite. Je n'essaie pas de faire vérifier ma boucle plus entity.
Ok, je vais c'est ce qui se passe.
1. Lorsqu'il boucle pour la première fois, il vérifie si entity[0] est sélectionné ou non. Cette étape fonctionne correctement.
2. Quand il boucle pour la deuxième fois, vérifie pour voir si entity[1] est choisi ou pas, VOICI LE PROBLÈME.
ma boucle fonctionne correctement quand elle boucle pour la première fois, mais elle ne fonctionne pas quand elle boucle pour la deuxième fois.
Quand je déboguais j'ai essayé ceci.
1. Quand il boucle pour la première fois, il vérifie si entity[1] est sélectionné ou non. Cette étape fonctionne correctement.
2. Quand il boucle pour la deuxième fois, vérifie pour voir si entity[2] est choisi ou pas, VOICI LE PROBLÈME. il semble que, après la première boucle, il y a quelque chose qui ne va pas, mais je ne vois pas ce que c'est. Au fait, je n'ai pas d'erreurs. EDIT 3: La fonction entière

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

Cette description est vraiment difficile à lire sans ponctuation. – BBoy

+0

ok im les ajoutant maintenant désolé – Ramilol

+3

Est-ce que ... une phrase? – jwueller

Répondre

1

Je pense que vous devez réinitialiser la valeur des rayPos et des structures rayDir, parce que vous modifiez les valeurs initiales dans la boucle:

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

l'homme que je devrais remarquer cela. ... – Ramilol

2

vous devez corriger votre déclaration for à:

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

maintenant que vous écrivez 1>=i, cela signifie i est inférieur ou égal 1. Ainsi, la boucle fonctionne comme vous l'avez codé.

+0

ne fonctionne toujours pas – Ramilol

+2

@Ramilol: Que diriez-vous des erreurs de publication? Je ne peux pas sembler trouver ma boule de cristal ... – jwueller

+0

il n'y a pas d'erreurs – Ramilol

1

Si hasHit est la variable que vous vérifiez si l'objet a été sélectionné, il ne semble pas que vous soyez en train de vérifier une variable spécifique à chaque objet. Il semble juste être une variable qui ne sera jamais mise à jour dans la boucle for et gardera toujours la même valeur.

+0

je ne pense pas que c'est le problème parce que quand je débogue mon code je peux voir quand 'hasHit' s'est changé – Ramilol

Questions connexes