Squeak.ru - шаблоны программирования

for цикл не работает правильно

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

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], ВОТ ПРОБЛЕМА. кажется, что после первого цикла что-то не так, но я не вижу, что это. У меня, кстати, ошибок нет. РЕДАКТИРОВАТЬ 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;
}

  • Это описание действительно трудно читать без знаков препинания. 25.11.2010
  • Пожалуйста, используйте знаки препинания. Очень сложно понять вашу проблему. 25.11.2010
  • Попробуйте перефразировать, пожалуйста. 25.11.2010
  • Ваш i может быть только 0 и 1. Если вы хотите больше, вам нужно изменить условие, чтобы включить больше. 25.11.2010
  • Несмотря на знаки препинания, спасибо 13-летнему парню, работающему над разработкой игр на C++ (да, ему 13!). 25.11.2010
  • выложу всю функцию 26.11.2010

Ответы:


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

2

вы должны исправить свой оператор for на:

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

теперь вы пишете 1>=i, это означает, что i меньше или равно 1. Таким образом, цикл работает так, как вы его закодировали.

25.11.2010

3

Если hasHit является переменной, которую вы проверяете, был ли выбран объект, это не похоже на то, что вы в настоящее время проверяете переменную, специфичную для каждого объекта. Похоже, это просто переменная, которая никогда не обновляется в цикле for и всегда будет содержать одно и то же значение.

25.11.2010
  • я не думаю, что это проблема, потому что, когда я отлаживаю свой код, я вижу, когда hasHit изменяется 25.11.2010
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...