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 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; }
|
|
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. void followThePath( float dt ) { float dist = 15.0f * 4.0f * dt; 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; } } } }
|
|
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 |
|
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 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"; } |
|
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. |
|
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. 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 ) { neighbors.emplace_back( p.x - stepsize, p.y ); neighbors.emplace_back( p.x + stepsize, p.y ); neighbors.emplace_back( p.x, p.y - stepsize ); neighbors.emplace_back( p.x, p.y + stepsize ); neighbors.emplace_back( p.x - stepsize, p.y - stepsize ); neighbors.emplace_back( p.x - stepsize, p.y + stepsize ); neighbors.emplace_back( p.x + stepsize, p.y - stepsize ); neighbors.emplace_back( p.x + stepsize, p.y + stepsize ); } return neighbors; }
|
|
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 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? |
|
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ć". |
|
1 « 2 » |