1 °³¿ä
2 µ¿ÀÛ
2.1 ±âº»ÀûÀÎ Æ®·¹À̽Ì
2.2 ¹®Á¦Á¡
2.3 °³¼±¾È
3 »ùÇÃ
¾ÆÁ÷ ¿©·¯ °¡Áö·Î ¸ðÀÚ¶õ ¼Ò½ºÁö¸¸, °³³ä Àâ´Â Á¤µµ¿¡´Â µµ¿òÀÌ µÇÁö ¾ÊÀ»±î³ª.
pathfinder.h
//////////////////////////////////////////////////////////////////////////////
/// \file PathFinder.h
/// \author excel96
/// \date 2004.11.30
//////////////////////////////////////////////////////////////////////////////
#ifndef __PATHFINDER_H__
#define __PATHFINDER_H__
#include <list>
//////////////////////////////////////////////////////////////////////////////
/// \class MapProxy
/// \brief PathFinder Ŭ·¡½º¿Í ¸Ê °ü·Ã Ŭ·¡½º °£ÀÇ ÀÇÁ¸¼ºÀ» ÁÙÀ̱â À§ÇØ
/// ¸¸µç ÇÁ¶ô½Ã Ŭ·¡½º.
//////////////////////////////////////////////////////////////////////////////
class MapProxy
{
public:
/// \brief ÇØ´ç ÁÂÇ¥°¡ ¸·ÇôÀÖ´ÂÁöÀÇ ¿©ºÎ¸¦ ¹ÝȯÇÑ´Ù.
/// \param x X ÁÂÇ¥
/// \param y Y ÁÂÇ¥
/// \return bool ¸·ÇôÀÖ´Â °æ¿ì true, ¶Õ·ÁÀÖ´Ù¸é false¸¦ ¹ÝȯÇÑ´Ù.
virtual bool isBlocked(int x, int y) const = 0;
};
//////////////////////////////////////////////////////////////////////////////
/// \class PathFinder
/// \brief Bresenham ¾Ë°í¸®Áò°ú Contour Tracing (Theo Pavlidis) ¾Ë°í¸®ÁòÀ»
/// Àû´çÈ÷ ¼¯Àº ±æÃ£±â °´Ã¼.
///
/// A* ¾Ë°í¸®Áò°ú´Â ´Þ¸®, °¡Àå ªÀº ±æÀ» ¼±ÅÃÇÏÁöµµ ¾Ê°í, ¹Ýµå½Ã µµÂøÇÏ´Â
/// °Íµµ º¸ÀåÇÏÁö ¾Ê´Â´Ù. ÇѸ¶µð·Î ¹«Ã¥ÀÓ!
//////////////////////////////////////////////////////////////////////////////
class PathFinder
{
private:
class Utility;
friend class Utility;
/// °Ë»öÀ» À§ÇÑ ¹æÇâ ¼±¾ð
enum Direction
{
DIR_LEFT = 0, ///< 9½Ã ¹æÇâ
DIR_LEFTDOWN, ///< 7½Ã ¹Ý ¹æÇâ
DIR_DOWN, ///< 6½Ã ¹æÇâ
DIR_RIGHTDOWN, ///< 4½Ã ¹Ý ¹æÇâ
DIR_RIGHT, ///< 3½Ã ¹æÇâ
DIR_RIGHTUP, ///< 1½Ã ¹Ý ¹æÇâ
DIR_UP, ///< 12½Ã ¹æÇâ
DIR_LEFTUP, ///< 10½Ã ¹Ý ¹æÇâ
DIR_MAX ///< ¹è¿À» À§ÇÑ ¸Æ½º°ª
};
/// ±æÃ£±â °´Ã¼ÀÇ µ¿ÀÛ ¸ðµå
enum MoveMode
{
MOVE_MODE_NORMAL = 0, ///< ÀÏ¹Ý ¸ðµå. Á÷¼±À¸·Î ¿òÁ÷ÀδÙ.
MOVE_MODE_TRACE ///< Àå¾Ö¹° °¡ÀåÀÚ¸® µû¶ó°¡±â ¸ðµå.
};
/// \struct POINT
/// \brief 2D ÁÂÇ¥ °´Ã¼
typedef struct POINT
{
int x;
int y;
POINT(int _X=0, int _Y=0) : x(_X), y(_Y) {}
bool operator == (const POINT& rhs) const { return x == rhs.x && y == rhs.y; }
bool operator != (const POINT& rhs) const { return x != rhs.x || y != rhs.y; }
} POINT;
typedef std::list<POINT> PATH;
POINT m_Goal; ///< ¸ñÇ¥ À§Ä¡
POINT m_Current; ///< ÇöÀç À§Ä¡
MoveMode m_MoveMode; ///< ÇöÀç µ¿ÀÛ ¸ðµå
int m_TraceDir; ///< ÀÌÀü ÅÏ¿¡¼ µû¶ó°£ ¹æÇâ
PATH m_DirectPath; ///< ÇöÀç À§Ä¡¿¡¼ ¸ñÇ¥ À§Ä¡±îÁöÀÇ ÀÏÁ÷¼± ÆÐ½º
public:
/// \brief »ý¼ºÀÚ
PathFinder();
/// \brief ¼Ò¸êÀÚ
~PathFinder();
public:
/// \brief ±æÃ£±â¸¦ ÃʱâÈÇÑ´Ù.
/// \param sx ½ÃÀÛ ÁöÁ¡ X ÁÂÇ¥
/// \param sy ½ÃÀÛ ÁöÁ¡ Y ÁÂÇ¥
/// \param gx ¸ñÇ¥ ÁöÁ¡ X ÁÂÇ¥
/// \param gy ¸ñÇ¥ ÁöÁ¡ Y ÁÂÇ¥
void init(int sx, int sy, int gx, int gy);
/// \brief ¸ñÇ¥ ÁöÁ¡¿¡ µµ´ÞÇϱâ À§ÇØ °¡¾ßÇÏ´Â ´ÙÀ½ ÁÂÇ¥¸¦ ¹ÝȯÇÑ´Ù.
/// \param x ´ÙÀ½ X ÁÂÇ¥¸¦ Áý¾î³ÖÀ» º¯¼ö
/// \param y ´ÙÀ½ Y ÁÂÇ¥¸¦ Áý¾î³ÖÀ» º¯¼ö
/// \param map ¸Ê Á¤º¸¸¦ ¾Ë·ÁÁÙ ÇÁ¶ô½Ã °´Ã¼
/// \return bool ´ÙÀ½ ÁÂÇ¥¸¦ ã¾Ò´Ù¸é true¸¦ ¹ÝȯÇϰí, ãÁö ¸øÇß´Ù¸é
/// false¸¦ ¹ÝȯÇÑ´Ù.
bool next(int& x, int& y, const MapProxy& map);
private:
/// º¹»ç »ý¼ºÀÚ´Â »ç¿ë ±ÝÁö
PathFinder(const PathFinder&) {}
/// ´ëÀÔ ¿¬»êÀÚ´Â »ç¿ë ±ÝÁö
const PathFinder& operator = (const PathFinder&) { return *this; }
};
#endif
pathfinder.cpp
//////////////////////////////////////////////////////////////////////////////
/// \file PathFinder.cpp
/// \author excel96
/// \date 2004.11.30
//////////////////////////////////////////////////////////////////////////////
#include "PCH.h"
#pragma hdrstop
#include "PathFinder.h"
#include <assert.h>
//////////////////////////////////////////////////////////////////////////////
/// \class PathFinder
//////////////////////////////////////////////////////////////////////////////
class PathFinder::Utility
{
public:
/// \brief ¼±ºÐÀÌ ÁÖ¾îÁø ÁÂÇ¥¸¦ Æ÷ÇÔÇÏ´ÂÁöÀÇ ¿©ºÎ¸¦ ¹ÝȯÇÑ´Ù.
/// \param path ¼±ºÐ
/// \param pt ÁÂÇ¥
/// \return bool ÁÂÇ¥¸¦ Æ÷ÇÔÇÏ´Â °æ¿ì true
static bool ptInPath(
const PATH& path, const POINT& pt)
{
return std::find(path.begin(), path.end(), pt) != path.end();
}
/// \brief ¼±ºÐ ¾È¿¡ Æ÷ÇԵǴ ÁÂÇ¥µéÀ» ¸®½ºÆ®·Î ¹ÝȯÇÑ´Ù.
/// \param x1 ½ÃÀÛ ÁöÁ¡ X ÁÂÇ¥
/// \param y1 ½ÃÀÛ ÁöÁ¡ Y ÁÂÇ¥
/// \param x2 ¸ñÇ¥ ÁöÁ¡ X ÁÂÇ¥
/// \param y2 ¸ñÇ¥ ÁöÁ¡ Y ÁÂÇ¥
/// \param path ÁÂÇ¥¸¦ Áý¾î³ÖÀ» ¸®½ºÆ® °´Ã¼
static void bresenham(int x1, int y1, int x2, int y2, PATH& path)
{
static const int OFFSET = 0x8000;
static const int SHIFT = 16;
bool yLonger = false;
int shortLen = y2 - y1;
int longLen = x2 - x1;
if (abs(shortLen) > abs(longLen))
{
std::swap(shortLen, longLen);
yLonger = true;
}
int decInc = longLen == 0 ? 0 : (shortLen << SHIFT) / longLen;
if (yLonger)
{
if (longLen > 0)
{
longLen += y1;
for (int j=OFFSET+(x1<<SHIFT); y1 <= longLen; ++y1)
{
path.push_back(POINT(j >> SHIFT, y1));
j += decInc;
}
}
else
{
longLen += y1;
for (int j=OFFSET+(x1<<SHIFT); y1 >= longLen; --y1)
{
path.push_back(POINT(j >> SHIFT, y1));
j -= decInc;
}
}
}
else
{
if (longLen > 0)
{
longLen += x1;
for (int j=OFFSET+(y1<<SHIFT); x1 <= longLen; ++x1)
{
path.push_back(POINT(x1, j >> SHIFT));
j += decInc;
}
}
else
{
longLen += x1;
for (int j=OFFSET+(y1<<SHIFT); x1 >= longLen; --x1)
{
path.push_back(POINT(x1, j >> SHIFT));
j -= decInc;
}
}
}
}
/// \brief ½ÃÀÛ ÁöÁ¡¿¡¼ ¸ñÇ¥ ÁöÁ¡À¸·Î Á÷¼± °æ·Î·Î ¿òÁ÷À̱â À§ÇØ ´ÙÀ½¿¡
/// °¡¾ßÇÏ´Â ÁöÁ¡ÀÇ ÁÂÇ¥¸¦ ¹ÝȯÇÑ´Ù.
/// \param from ½ÃÀÛ ÁöÁ¡
/// \param to ¸ñÇ¥ ÁöÁ¡
/// \param path ÁÂÇ¥¸¦ Áý¾î³ÖÀ» ¸®½ºÆ® °´Ã¼
static void bresenham(const POINT& from, const POINT& to, PATH& path)
{
bresenham(from.x, from.y, to.x, to.y, path);
}
/// \brief ½ÃÀÛ ÁöÁ¡¿¡¼ ¸ñÇ¥ ÁöÁ¡À¸·Î Á÷¼± °æ·Î·Î ¿òÁ÷À̱â À§ÇØ ´ÙÀ½¿¡
/// °¡¾ßÇÏ´Â ÁöÁ¡ÀÇ ÁÂÇ¥¸¦ ¹ÝȯÇÑ´Ù.
/// \param from ½ÃÀÛ ÁöÁ¡
/// \param to ¸ñÇ¥ ÁöÁ¡
/// \return POINT ´ÙÀ½ ÁöÁ¡ÀÇ ÁÂÇ¥
static POINT getNextBresenhamPoint(const POINT& from, const POINT& to)
{
assert(from != to);
PATH path;
bresenham(from, to, path);
assert(!path.empty());
PATH::const_iterator b = path.begin();
PATH::const_reverse_iterator e = path.rbegin();
return *b == from ? *(++b) : *(++e);
}
/// \brief ÇØ´ç ÁÂÇ¥¿¡¼ ÁÖ¾îÁø ¹æÇâÀ¸·Î ¿òÁ÷¿´À» °æ¿ì¿¡ µµÂøÇÏ´Â ÁÂÇ¥¸¦
/// ¹ÝȯÇÑ´Ù.
/// \param from ±âÁØÀÌ µÇ´Â ÁÂÇ¥
/// \param dir ¹æÇâ
/// \return POINT ¿òÁ÷ÀÎ ÈÄÀÇ ÁÂÇ¥
static POINT getNextPoint(const POINT& from, int dir)
{
static const POINT DirMoveMask[DIR_MAX] =
{
POINT(-1, 0), // DIR_LEFT
POINT(-1, 1), // DIR_LEFTDOWN
POINT( 0, 1), // DIR_DOWN
POINT( 1, 1), // DIR_RIGHTDOWN
POINT( 1, 0), // DIR_RIGHT
POINT( 1, -1), // DIR_RIGHTUP
POINT( 0, -1), // DIR_UP
POINT(-1, -1) // DIR_LEFTUP
};
return POINT(from.x + DirMoveMask[dir].x, from.y + DirMoveMask[dir].y);
}
/// \brief ÁÖ¾îÁø ¹æÇâÀ» ÇØ´ç ¿É¼Â¸¸Å ư ´ÙÀ½, ¿À¹öÇÃ·Î¿ì ¹×
/// ¾ð´õÇ÷ο츦 º¸Á¤ÇÑ ¹æÇâÀ» ¹ÝȯÇÑ´Ù.
/// \param dir ±âÁØÀÌ µÇ´Â ¹æÇâ
/// \param offset Ʋ ¹æÇâ. ¿¹¸¦ µé¾î 1 À̶ó¸é ½Ã°è ¹Ý´ë ¹æÇâÀ¸·Î ÇÑ ½ºÅÜ,
/// 0 À̶ó¸é ¿ø·¡ ¹æÇâ, -1 À̶ó¸é ½Ã°è ¹æÇâÀ¸·Î ÇÑ ½ºÅÜÀÌ´Ù.
/// \return int º¸Á¤ÇÑ ¹æÇâ
static int adjust(int dir, int offset)
{
dir += offset;
if (dir < 0) dir += DIR_MAX;
else if (dir >= DIR_MAX) dir -= DIR_MAX;
return dir;
}
/// \brief µÎ ÁÂÇ¥ °£ÀÇ »ó´ëÀûÀÎ ¹æÇâÀ» ±¸ÇÑ´Ù.
/// \param from ±âÁØÀÌ µÇ´Â ÁÂÇ¥
/// \param to ¹æÇâÀ» Àê ÁÂÇ¥
/// \return int ¹æÇâ (DIR_LEFT ~ DIR_LEFTUP)
static int getRelativeDir(const POINT& from, const POINT& to)
{
if (from.x < to.x)
{
if (from.y < to.y) return DIR_RIGHTDOWN;
else if (from.y > to.y) return DIR_RIGHTUP;
else return DIR_RIGHT;
}
if (from.x > to.x)
{
if (from.y < to.y) return DIR_LEFTDOWN;
else if (from.y > to.y) return DIR_LEFTUP;
else return DIR_LEFT;
}
if (from.y < to.y) return DIR_DOWN;
else if (from.y > to.y) return DIR_UP;
return DIR_MAX;
}
};
//////////////////////////////////////////////////////////////////////////////
/// \brief »ý¼ºÀÚ
//////////////////////////////////////////////////////////////////////////////
PathFinder::PathFinder()
: m_MoveMode(MOVE_MODE_NORMAL), m_TraceDir(DIR_MAX)
{
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ¼Ò¸êÀÚ
//////////////////////////////////////////////////////////////////////////////
PathFinder::~PathFinder()
{
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ±æÃ£±â¸¦ ÃʱâÈÇÑ´Ù.
/// \param sx ½ÃÀÛ ÁöÁ¡ X ÁÂÇ¥
/// \param sy ½ÃÀÛ ÁöÁ¡ Y ÁÂÇ¥
/// \param gx ¸ñÇ¥ ÁöÁ¡ X ÁÂÇ¥
/// \param gy ¸ñÇ¥ ÁöÁ¡ Y ÁÂÇ¥
//////////////////////////////////////////////////////////////////////////////
void PathFinder::init(int sx, int sy, int gx, int gy)
{
m_Goal.x = gx;
m_Goal.y = gy;
m_Current.x = sx;
m_Current.y = sy;
m_MoveMode = MOVE_MODE_NORMAL;
// ½ÃÀÛ ÁöÁ¡°ú ¸ñÇ¥ ÁöÁ¡À» ÀÕ´Â Á÷¼± ÁÂÇ¥µéÀ» ±¸ÇصдÙ.
m_DirectPath.clear();
Utility::bresenham(sx, sy, gx, gy, m_DirectPath);
}
//////////////////////////////////////////////////////////////////////////////
/// \brief ¸ñÇ¥ ÁöÁ¡¿¡ µµ´ÞÇϱâ À§ÇØ °¡¾ßÇÏ´Â ´ÙÀ½ ÁÂÇ¥¸¦ ¹ÝȯÇÑ´Ù.
/// \param x ´ÙÀ½ X ÁÂÇ¥¸¦ Áý¾î³ÖÀ» º¯¼ö
/// \param y ´ÙÀ½ Y ÁÂÇ¥¸¦ Áý¾î³ÖÀ» º¯¼ö
/// \param map ¸Ê Á¤º¸¸¦ ¾Ë·ÁÁÙ ÇÁ¶ô½Ã °´Ã¼
/// \return bool ´ÙÀ½ ÁÂÇ¥¸¦ ã¾Ò´Ù¸é true¸¦ ¹ÝȯÇϰí, ãÁö ¸øÇß´Ù¸é
/// false¸¦ ¹ÝȯÇÑ´Ù.
//////////////////////////////////////////////////////////////////////////////
bool PathFinder::next(int& x, int& y, const MapProxy& map)
{
static const int SearchSequences[DIR_MAX][DIR_MAX] =
{
{ DIR_LEFT, DIR_LEFTDOWN, DIR_LEFTUP, DIR_DOWN, DIR_UP, DIR_RIGHTDOWN, DIR_RIGHTUP, DIR_RIGHT, }, // DIR_LEFT
{ DIR_LEFTDOWN, DIR_DOWN, DIR_LEFT, DIR_RIGHTDOWN, DIR_LEFTUP, DIR_RIGHT, DIR_UP, DIR_RIGHTUP, }, // DIR_LEFTDOWN
{ DIR_DOWN, DIR_RIGHTDOWN, DIR_LEFTDOWN, DIR_RIGHT, DIR_LEFT, DIR_RIGHTUP, DIR_LEFTUP, DIR_UP, }, // DIR_DOWN
{ DIR_RIGHTDOWN, DIR_RIGHT, DIR_DOWN, DIR_RIGHTUP, DIR_LEFTDOWN, DIR_UP, DIR_LEFT, DIR_LEFTUP, }, // DIR_RIGHTDOWN
{ DIR_RIGHT, DIR_RIGHTUP, DIR_RIGHTDOWN, DIR_UP, DIR_DOWN, DIR_LEFTUP, DIR_LEFTDOWN, DIR_LEFT, }, // DIR_RIGHT
{ DIR_RIGHTUP, DIR_UP, DIR_RIGHT, DIR_LEFTUP, DIR_RIGHTDOWN, DIR_LEFT, DIR_DOWN, DIR_LEFTDOWN, }, // DIR_RIGHTUP
{ DIR_UP, DIR_LEFTUP, DIR_RIGHTUP, DIR_LEFT, DIR_RIGHT, DIR_LEFTDOWN, DIR_RIGHTDOWN, DIR_DOWN, }, // DIR_UP
{ DIR_LEFTUP, DIR_LEFT, DIR_UP, DIR_LEFTDOWN, DIR_RIGHTUP, DIR_DOWN, DIR_RIGHT, DIR_RIGHTDOWN, } // DIR_LEFTUP
};
// ÀÌ¹Ì ¸ñÇ¥ ÁöÁ¡¿¡ µµÂøÇÑ »óŶó¸é ±×³É ¸®ÅÏ
if (m_Current == m_Goal)
return false;
POINT NextPt;
//------------------------------------------------------------------------
// ÀÏ¹Ý ¸ðµå.
// ¸ñÇ¥ ÁöÁ¡±îÁö ºê·¹¼¾Çð ¾Ë°í¸®ÁòÀ» ÀÌ¿ëÇØ Á÷¼±À» ±×¾î¼ ´ÙÀ½ ÁÂÇ¥¸¦
// ±¸ÇÑ ´ÙÀ½, ¿òÁ÷ÀδÙ.
//------------------------------------------------------------------------
if (m_MoveMode == MOVE_MODE_NORMAL)
{
NextPt = Utility::getNextBresenhamPoint(m_Current, m_Goal);
if (!map.isBlocked(NextPt.x, NextPt.y))
{
m_Current = NextPt;
x = m_Current.x;
y = m_Current.y;
return true;
}
else
{
// Á÷¼±À¸·Î °¥ ¼ö ¾ø´Ù. Áï Àå¾Ö¹°°ú Ãæµ¹Çß´Ù.
// ±×·¯¹Ç·Î Àå¾Ö¹° °¡ÀåÀÚ¸® µû¶ó°¡±â ¸ðµå·Î µé¾î°¡¾ß ÇÑ´Ù.
// Á÷¼±À¸·Î °¥ ¼ö ¾ø´Ù¸é, ¾î´À ¹æÇâÀ¸·Î °¡¾ßÇÒÁö¸¦ Á¤ÇØ¾ß ÇÑ´Ù.
// ¹®Á¦´Â ¾î´À ¹æÇâÀ¸·Î °¡¾ßÇÏ´ÂÁö °áÁ¤ÇϱⰡ ¾Ö¸ÅÇÏ´Ù´Â °ÍÀÌ´Ù.
// ÃÖ¼±ÀÇ ¹æÇâÀ¸·Î °¡´Â °Ô ÁÁ´Ù°í »ý°¢ÇÒ ¼öµµ ÀÖÁö¸¸, ÀÌ·² °æ¿ì
// Çѹø ¸ø°¡´Â ±æÀº ¿µ¿øÈ÷ ¸ø °£´Ù. ±×¿¡ ¹ÝÇØ ·£´ýÀ» ÀÌ¿ëÇϸé
// Á» µ¹¾Æ°¡´Â °æÇâÀÌ ÀÖ±â´Â Çϳª, ¾î·µç ¸ñÇ¥ ÁöÁ¡±îÁö´Â
// µµÂøÇÒ È®·üÀÌ ³ô´Ù.
//int OriginalDir = getRelativeDir(m_Current, NextPt);
int OriginalDir = rand() % DIR_MAX;
for (int i=1; i<DIR_MAX; i++)
{
int dir = SearchSequences[OriginalDir][i];
NextPt = Utility::getNextPoint(m_Current, dir);
if (!map.isBlocked(NextPt.x, NextPt.y))
{
m_MoveMode = MOVE_MODE_TRACE;
m_TraceDir = dir;
m_Current = NextPt;
x = m_Current.x;
y = m_Current.y;
return true;
}
}
}
}
//------------------------------------------------------------------------
// Àå¾Ö¹° °¡ÀåÀÚ¸® µû¶ó°¡±â ¸ðµå.
// Àå¾Ö¹° °¡ÀåÀÚ¸®¸¦ µû¶ó°¡´Ù°¡, ¸ñÇ¥ ÁöÁ¡±îÁö ÀÏÁ÷¼± »óÀ¸·Î °¥ ¼ö
// ÀÖ´Ù¸é, µû¶ó°¡±â ¸ðµå¸¦ Å»ÃâÇÑ´Ù.
//------------------------------------------------------------------------
else
{
// ¸ñÇ¥ ÁöÁ¡±îÁöÀÇ Á÷¼± °æ·Î ÁÂÇ¥µéÀ» ±¸ÇÑ´Ù.
PATH path;
Utility::bresenham(m_Current, m_Goal, path);
assert(!path.empty());
// ¸ðµç ÁÂÇ¥°¡ ºñ¾îÀÖ´ÂÁö Á¶»çÇÑ´Ù.
bool bPathClear = true;
for (PATH::const_iterator itr(path.begin());
itr != path.end(); ++itr)
{
const POINT& pt = *itr;
if (map.isBlocked(pt.x, pt.y))
{
bPathClear = false;
break;
}
}
if (bPathClear)
{
// ±æÀÌ ¶Õ·ÁÀÖ´Ù. Á÷¼±À¸·Î °¡¸é µÈ´Ù.
PATH::const_iterator b = path.begin();
PATH::const_reverse_iterator e = path.rbegin();
// ºê·¹¼¾Çð ¾Ë°í¸®ÁòÀÇ Æ¯¼º»ó,
// ÁÂÇ¥°¡ ¾ÕÂÊ¿¡ ÀÖÀ» ¼öµµ µÚÂÊ¿¡ ÀÖÀ» ¼öµµ ÀÖ´Ù.
if (*b == m_Current)
{
m_Current = *(++b);
x = m_Current.x;
y = m_Current.y;
}
else if (*e == m_Current)
{
m_Current = *(++e);
x = m_Current.x;
y = m_Current.y;
}
// ÀÏ¹Ý ¸ðµå·Î µ¹¾Æ°£´Ù.
m_MoveMode = MOVE_MODE_NORMAL;
return true;
}
else
{
// µû¶ó°¡±â ¸ðµå!
for (int i=0; i<DIR_MAX; i++)
{
int NextDir = Utility::adjust(m_TraceDir, i - 2);
NextPt = Utility::getNextPoint(m_Current, NextDir);
if (!map.isBlocked(NextPt.x, NextPt.y))
{
// °¡ÀåÀÚ¸®¸¦ µû¶ó ¿òÁ÷ÀÌ´Ù°¡, ½ÃÀÛ ÁöÁ¡°ú ¸ñÇ¥ ÁöÁ¡À»
// ÀÕ´Â Á÷¼± »ó¿¡ ¿Ã¶ó°¬´Ù¸é, ´Ù½Ã ÀÏ¹Ý ¸ðµå·Î µ¹¾Æ°£´Ù.
// À̸¦ ÅëÇØ ÇÑ Àå¾Ö¹°ÀÇ °¡ÀåÀÚ¸®¸¦ °è¼Ó µµ´Â ÀÏÀ»
// ¾î´À Á¤µµ ¹æÁöÇÒ ¼ö ÀÖ´Ù.
if (Utility::ptInPath(m_DirectPath, NextPt))
m_MoveMode = MOVE_MODE_NORMAL;
m_TraceDir = NextDir;
m_Current = NextPt;
x = m_Current.x;
y = m_Current.y;
return true;
}
}
}
}
return false;
}
4 ¸µÅ©
SeriousMoin v1 (koMoinMoin 1.0a4 Modified)