
Definition at line 16 of file FinderAlg.h.
Public Member Functions | |
| FinderAlg (int w, int h) | |
| Dir::eDir | findDir (const Unit *unit, const V2 &dest) |
| Finds the best start direction to the destination. | |
|
||||||||||||
|
Definition at line 16 of file FinderAlg.cpp. 00017 : m_closed(w, h)
00018 {
00019 m_unit = NULL;
00020 }
|
|
||||||||||||
|
Finds the best start direction to the destination.
Definition at line 29 of file FinderAlg.cpp. 00030 {
00031 if (m_unit) {
00032 m_closed.reset();
00033 m_fifo.clear();
00034 }
00035 m_unit = unit;
00036 V2 uLoc = unit->getLoc();
00037 int w = unit->getW();
00038 int h = unit->getH();
00039 if (isInRect(uLoc, w, h, dest)) {
00040 return Dir::DIR_NO;
00041 }
00042 //TODO: don't compute when dest is on the wall
00043
00044 m_closed.markClosed(uLoc);
00045 m_fifo.push_back(FinderPlace(Dir::DIR_LEFT, uLoc.plus(V2(-1, 0))));
00046 m_fifo.push_back(FinderPlace(Dir::DIR_RIGHT, uLoc.plus(V2(+1, 0))));
00047 m_fifo.push_back(FinderPlace(Dir::DIR_UP, uLoc.plus(V2(0, -1))));
00048 m_fifo.push_back(FinderPlace(Dir::DIR_DOWN, uLoc.plus(V2(0, +1))));
00049
00050 while (!m_fifo.empty()) {
00051 FinderPlace place = m_fifo.front();
00052 m_fifo.pop_front();
00053 if (tryPlace(place)) {
00054 if (isInRect(place.getLoc(), w, h, dest)) {
00055 return place.getStartDir();
00056 }
00057
00058 pushNext(place, V2(-1, 0));
00059 pushNext(place, V2(+1, 0));
00060 pushNext(place, V2(0, -1));
00061 pushNext(place, V2(0, +1));
00062 }
00063 }
00064 return Dir::DIR_NO;
00065 }
|
1.4.2