Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Pathfinding - Podążanie wyznaczoną ścieżką

Ostatnio zmodyfikowano 2024-09-08 17:54
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
» 2024-09-05 23:10:03
Ale po co sprawdzać czy ścieżka jest pusta skoro jest też sprawdzanie przez target, który domyślnie wynosi tyle ile ostatni element ścieżki

C/C++
if( position.x == target.x && position.y == target.y ) {
   
cout << "\nmonster: " << name << "\n";
   
loadTheTarget();
   
sf::Time starttime = currentTime;
   
loadThePath();
   
cout << "time: " <<( timeClock.getElapsedTime() - starttime ).asSeconds() << "s\n";
}
else if( position.x != target.x && fabs( target.x - position.x ) < dist ) {
   
position.x = target.x;
}
else if( position.y != target.y && fabs( target.y - position.y ) < dist ) {
   
position.y = target.y;
}
P-181567
tBane
Temat założony przez niniejszego użytkownika
» 2024-09-05 23:14:13
Bo pewnie nie sprawdzasz czy dostałeś niepustą ścieżkę. Po co w ogóle o tym tu piszesz? Możesz to po prostu sprawdzić debuggerem.
Zrobiłem tak jak doradziłeś. Choć osobiście uważam, że jest to nie eleganckie rozwiązanie. Najwyżej kiedyś poprawię ten kod.

C/C++
void followThePath( float dt ) {
   
   
float dist = 15.0f * 4.0f * dt; // distance to move
   
   
if( position.x == target.x && position.y == target.y ) {
       
cout << "\nmonster: " << name << "\n";
       
loadTheTarget();
       
sf::Time starttime = currentTime;
       
loadThePath();
       
cout << "time: " <<( timeClock.getElapsedTime() - starttime ).asSeconds() << "s\n";
   
}
   
else if( position.x != target.x && fabs( target.x - position.x ) < dist ) {
       
position.x = target.x;
   
}
   
else if( position.y != target.y && fabs( target.y - position.y ) < dist ) {
       
position.y = target.y;
   
}
   
else {
       
if( path.size() > 0 ) {
           
if( position.x == path[ 0 ].x && position.y == path[ 0 ].y ) {
               
path.erase( path.begin() );
           
}
           
else if( position.x != path[ 0 ].x && fabs( path[ 0 ].x - position.x ) < dist ) {
               
position.x = path[ 0 ].x;
           
}
           
else if( position.y != path[ 0 ].y && fabs( path[ 0 ].y - position.y ) < dist ) {
               
position.y = path[ 0 ].y;
           
}
           
else if( path[ 0 ].x < position.x ) {
               
position.x -= dist;
           
}
           
else if( path[ 0 ].x > position.x ) {
               
position.x += dist;
           
}
           
else if( path[ 0 ].y < position.y ) {
               
position.y -= dist;
           
}
           
else if( path[ 0 ].y > position.y ) {
               
position.y += dist;
           
}
        }
    }
   
}
P-181568
pekfos
» 2024-09-05 23:20:26
Nie możesz w nieskończoność poprawiać trasy, ani nie masz nieskończonej liczby możliwych pozycji.
Poprawka: ta mapa jest nieskończona, bo nigdy nie sprawdzasz czy jesteś w jej zakresie.

Ale po co sprawdzać czy ścieżka jest pusta skoro jest też sprawdzanie przez target, który domyślnie wynosi tyle ile ostatni element ścieżki
C/C++
return { }; // No path found
P-181569
tBane
Temat założony przez niniejszego użytkownika
» 2024-09-05 23:22:50
Poprawka: ta mapa jest nieskończona, bo nigdy nie sprawdzasz czy jesteś w jej zakresie.
Tak

C/C++
return { }; // No path found


C/C++
void loadTheTarget() {
   
do {
       
target.x = base.x + rand() % 200 - 100;
       
target.y = base.y + rand() % 200 - 100;
   
} while( collisionPrediction( this, target.x - position.x, target.y - position.y ) );
   
   
cout << "Load the target: [" << target.x << "," << target.y << "]\n";
}
P-181570
pekfos
» 2024-09-05 23:26:39
No to po prostu odpal to pod debuggerem i sam sobie zobacz gdzie się wywala. Rozmowa o tym to tylko strata czasu.

Dodaj do getNeighbors() test czy nowe współrzędne są w dopuszczalnym zakresie, żeby algorytm miał skończony czas działania jeżeli cel jest nieosiągalny z powodu kolizji.
P-181571
tBane
Temat założony przez niniejszego użytkownika
» 2024-09-05 23:27:46
Dodaj do getNeighbors() test czy nowe współrzędne są w dopuszczalnym zakresie, żeby algorytm miał skończony czas działania jeżeli cel jest nieosiągalny z powodu kolizji.
Dobra, zrobione. Pozostało jeszcze uwzględnić w algorytmie kolizje z innymi obiektami.

C/C++
std::vector < Point > getNeighbors( GameObject * object, const Point & p ) {
   
std::vector < Point > neighbors;
   
   
   
if( fabs( p.x - object->position.x ) < 512.0f && fabs( p.y - object->position.y ) < 512.0f ) {
       
//if(!collisionPrediction(object, -stepsize, 0))
       
neighbors.emplace_back( p.x - stepsize, p.y );
       
       
//if (!collisionPrediction(object, stepsize, 0))
       
neighbors.emplace_back( p.x + stepsize, p.y );
       
       
//if (!collisionPrediction(object, 0, -stepsize))
       
neighbors.emplace_back( p.x, p.y - stepsize );
       
       
//if (!collisionPrediction(object, 0, stepsize))
       
neighbors.emplace_back( p.x, p.y + stepsize );
       
       
//if (!collisionPrediction(object, -stepsize, -stepsize))
       
neighbors.emplace_back( p.x - stepsize, p.y - stepsize );
       
       
//if (!collisionPrediction(object, -stepsize, stepsize))
       
neighbors.emplace_back( p.x - stepsize, p.y + stepsize );
       
       
//if (!collisionPrediction(object, stepsize, -stepsize))
       
neighbors.emplace_back( p.x + stepsize, p.y - stepsize );
       
       
//if (!collisionPrediction(object, stepsize, stepsize))
       
neighbors.emplace_back( p.x + stepsize, p.y + stepsize );
   
}
   
   
return neighbors;
}
P-181572
tBane
Temat założony przez niniejszego użytkownika
» 2024-09-06 16:26:13
ale ja jestem głupi ... w tych collisionPrediction powinienem uzględnić nowe pozycje dla obiektu, czego nie zrobiłem. Zaraz to naprawię i dam znać czy kod działa :P

C/C++
std::vector < Point > getNeighbors( GameObject * object, const Point & p ) {
   
std::vector < Point > neighbors;
   
   
   
if( fabs( p.x - object->position.x ) < 512.0f && fabs( p.y - object->position.y ) < 512.0f ) {
       
       
if( !collisionPrediction( object, p, - stepsize, 0 ) )
           
 neighbors.emplace_back( p.x - stepsize, p.y );
       
       
if( !collisionPrediction( object, p, stepsize, 0 ) )
           
 neighbors.emplace_back( p.x + stepsize, p.y );
       
       
if( !collisionPrediction( object, p, 0, - stepsize ) )
           
 neighbors.emplace_back( p.x, p.y - stepsize );
       
       
if( !collisionPrediction( object, p, 0, stepsize ) )
           
 neighbors.emplace_back( p.x, p.y + stepsize );
       
       
return neighbors;
   
}
   

Ogólnie to działa, ale znalazłem jeszcze jeden problem do rozwiązania. Potworki na siebie wchodzą. Jak przewidzieć czy potworek będzie kolidował z innym potworkiem podczas przechodzenia swojej ścieżki?
P-181573
pekfos
» 2024-09-08 17:54:35
Potworki na siebie wchodzą. Jak przewidzieć czy potworek będzie kolidował z innym potworkiem podczas przechodzenia swojej ścieżki?
To czemu nie sprawdzasz kolizji idąc tą ścieżką? Jak wykryjesz kolizję na wyznaczonej ścieżce, która nie ustąpi przez N kolejnych aktualizacji (albo N sekund), to wyszukaj nową. Nie chcesz od razu szukać nowej ścieżki, bo nieprzewidziane kolizje to wina ruchomych obiektów które mogą zejść z drogi, zwłaszcza gdy idą do tego samego celu. No i sprawdzaj czy kolizji nie wywołał obiekt do którego idziesz. Inaczej gdy wróg idzie do gracza, to gracz może skrócić dystans i wroga tym "zaskoczyć".
P-181574
1 « 2 »
Poprzednia strona Strona 2 z 2