diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | src/being.cpp | 19 | ||||
-rw-r--r-- | src/localplayer.cpp | 6 |
3 files changed, 15 insertions, 16 deletions
@@ -1,9 +1,11 @@ 2006-12-30 Guillaume Melquiond <guillaume.melquiond@gmail.com> * src/being.h, src/being.cpp: Improved movement smoothness by avoiding - useless changes of sprite direction. + useless changes of sprite direction. Reduced field of direction + components from 180° to 120° when computing being direction. * src/localplayer.cpp: Changed attack message to send the direction - the player is visually facing. + the player is visually facing. Removed check on beings when setting an + absolute destination. 2006-12-29 Guillaume Melquiond <guillaume.melquiond@gmail.com> diff --git a/src/being.cpp b/src/being.cpp index 08f5a491..1018b8e1 100644 --- a/src/being.cpp +++ b/src/being.cpp @@ -422,20 +422,17 @@ Being::nextStep() PATH_NODE node = mPath.front(); mPath.pop_front(); - int dir = 0; - if (node.x > mX) - dir |= RIGHT; - else if (node.x < mX) - dir |= LEFT; - if (node.y > mY) - dir |= DOWN; - else if (node.y < mY) - dir |= UP; + mStepX = node.x - mX; + mStepY = node.y - mY; + + int dir = 0, dx = std::abs(mStepX), dy = std::abs(mStepY); + if (dx * 2 > dy) + dir |= mStepX > 0 ? RIGHT : LEFT; + if (dy * 2 > dx) + dir |= mStepY > 0 ? DOWN : UP; setDirection(dir); - mStepX = node.x - mX; - mStepY = node.y - mY; mX = node.x; mY = node.y; setAction(WALK); diff --git a/src/localplayer.cpp b/src/localplayer.cpp index 962a1ae4..ba7b6117 100644 --- a/src/localplayer.cpp +++ b/src/localplayer.cpp @@ -218,9 +218,9 @@ void LocalPlayer::setDestination(Uint16 x, Uint16 y) { // Fix coordinates so that the player does not seem to dig into walls. int tx = x / 32, ty = y / 32, fx = x % 32, fy = y % 32; - if (fx != 16 && !mMap->getWalk(tx + fx / 16 * 2 - 1, ty)) fx = 16; - if (fy != 16 && !mMap->getWalk(tx, ty + fy / 16 * 2 - 1)) fy = 16; - if (fx != 16 && fy != 16 && !mMap->getWalk(tx + fx / 16 * 2 - 1, ty + fy / 16 * 2 - 1)) fx = 16; + if (fx != 16 && mMap->tileCollides(tx + fx / 16 * 2 - 1, ty)) fx = 16; + if (fy != 16 && mMap->tileCollides(tx, ty + fy / 16 * 2 - 1)) fy = 16; + if (fx != 16 && fy != 16 && mMap->tileCollides(tx + fx / 16 * 2 - 1, ty + fy / 16 * 2 - 1)) fx = 16; x = tx * 32 + fx; y = ty * 32 + fy; |