2010-11-25 8 views
0

Ich habe diese Schleife, die zwei Objekte überprüft. Das Problem damit ist, dass es nur die erste prüft, aber die anderen nicht überprüft ... Wenn meine Schleife das erste Objekt zum Auswählen überprüft, sagt es, ob es ausgewählt wurde oder nicht, aber wenn es erneut zur Überprüfung durchläuft das zweite Objekt sagt, es wurde nicht gepflückt, auch wenn es gepflückt wurde. Also was ich getan habe, ist, dass ich den Überprüfungsprozess umgestellt habe. Wie jetzt wird das zweite Objekt überprüft, als das erste Objekt geprüft wird. Also, nachdem ich das getan habe, habe ich dieses Ergebnis, dass es sagt, dass das zweite Objekt ausgewählt wurde oder nicht, es funktioniert gut, aber wenn es erneut Schleife beginnt es das erste Objekt zu überprüfen, es sagt, dass es nicht ausgewählt wird, auch wenn es ausgewählt wurde ..
Hier ist meine Schleifefor Schleife funktioniert nicht richtig

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

eine Idee?

EDIT 2:
ok ich Sie nicht Leute denken verstanden Recht, mich. Ich versuche nicht, meinen Loop-Check mehr entity zu machen.
Ok ich werde das ist was passiert.
1. Wenn es zum ersten Mal es Schleifen, überprüft, ob entity[0] ausgewählt ist oder nicht, Dieser Schritt funktioniert gut.
2. Wenn es zum zweiten Mal eine Schleife macht, überprüft, ob entity[1] ausgewählt ist oder nicht, HIER IST DAS PROBLEM.
meine Schleife funktioniert gut, wenn es zum ersten Mal eine Schleife, aber es funktioniert nicht, wenn es zum zweiten Mal eine Schleife ist.
Als ich debugging versuchte ich dies.
1. Wenn es zum ersten Mal es Schleifen, überprüft, ob entity[1] ausgewählt ist oder nicht, Dieser Schritt funktioniert gut.
2. Wenn es zum zweiten Mal Schleife, überprüft, ob entity[2] ausgewählt ist oder nicht, HIER IST DAS PROBLEM. Es scheint, dass nach der ersten Schleife etwas falsch ist, aber ich kann nicht sehen, was es ist. Übrigens bekomme ich keine Fehler. EDIT 3: die gesamte Funktion

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

Diese Beschreibung ist wirklich schwer ohne Interpunktion zu lesen. – BBoy

+0

ok ich gebe sie jetzt entschuldigung – Ramilol

+3

Ist das ... ein Satz? – jwueller

Antwort

1

Ich denke, dass man den Wert der rayPos und rayDir Strukturen zurückgesetzt haben, weil Sie die Anfangswerte in der Schleife ändern:

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

Mann ich sollte das bemerkt haben. ... – Ramilol

2

sollten Sie Ihre for Anweisung beheben zu:

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

jetzt Sie schreiben 1>=i, bedeutet dies i kleiner oder gleich 1 ist also die Schleife funktioniert so, wie Sie es codiert haben.

+0

funktioniert immer noch nicht – Ramilol

+2

@Ramilol: Wie wäre es mit Buchungsfehler? Ich kann nicht scheinen, meine Kristallkugel zu finden ... – jwueller

+0

gibt es keine Fehler – Ramilol

1

Wenn hasHit die Variable ist, die Sie überprüfen, wenn das Objekt ausgewählt wurde, sieht es nicht so aus, als ob Sie gerade eine für jedes Objekt spezifische Variable überprüfen. Es scheint nur eine Variable zu sein, die niemals in der for-Schleife aktualisiert wird und immer denselben Wert enthält.

+0

ich denke nicht, dass es das Problem ist, weil, wenn ich meinen Code debugge, kann ich sehen, wenn "hasHit" geändert wird – Ramilol

Verwandte Themen