diff options
author | Guillaume Melquiond <guillaume.melquiond@gmail.com> | 2007-11-21 15:08:20 +0000 |
---|---|---|
committer | Guillaume Melquiond <guillaume.melquiond@gmail.com> | 2007-11-21 15:08:20 +0000 |
commit | 6b4436ee8d777f720f80a3436e30f34213258810 (patch) | |
tree | 6615196d1e35325bf1ceaff25dc712fc9ee06bf3 | |
parent | a4b503456499b91a2f0ea9840944ce84bd1422c6 (diff) | |
download | mana-6b4436ee8d777f720f80a3436e30f34213258810.tar.gz mana-6b4436ee8d777f720f80a3436e30f34213258810.tar.bz2 mana-6b4436ee8d777f720f80a3436e30f34213258810.tar.xz mana-6b4436ee8d777f720f80a3436e30f34213258810.zip |
Added interpolation of tile offset for intermediate steps in long moves.
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | src/being.cpp | 27 |
2 files changed, 27 insertions, 5 deletions
@@ -1,3 +1,8 @@ +2007-11-21 Guillaume Melquiond <guillaume.melquiond@gmail.com> + + * src/being.cpp: Added interpolation of tile offset for intermediate + steps in long moves. + 2007-11-16 Guillaume Melquiond <guillaume.melquiond@gmail.com> * src/resources/resourcemanager.h, src/resources/resource.h, diff --git a/src/being.cpp b/src/being.cpp index d5f37371..22c56a6d 100644 --- a/src/being.cpp +++ b/src/being.cpp @@ -149,9 +149,9 @@ void Being::adjustCourse(Uint16 srcX, Uint16 srcY, Uint16 dstX, Uint16 dstY) { onPath = j; } - // Set intermediate steps to tile centers. - i->x = i->x * 32 + 16; - i->y = i->y * 32 + 16; + // Do not set any offset for intermediate steps. + i->x = i->x * 32; + i->y = i->y * 32; ++j; } p1_length = mMap->getMetaTile(dstX / 32, dstY / 32)->Gcost; @@ -218,8 +218,8 @@ void Being::adjustCourse(Uint16 srcX, Uint16 srcY, Uint16 dstX, Uint16 dstY) bestPath.pop_back(); for (Path::iterator i = bestPath.begin(), i_end = bestPath.end(); i != i_end; ++i) { - i->x = i->x * 32 + 16; - i->y = i->y * 32 + 16; + i->x = i->x * 32; + i->y = i->y * 32; } // Concatenate paths. @@ -260,6 +260,23 @@ Being::setPath(const Path &path, int mod) mPath = path; mSpeedModifier = mod >= 512 ? (mod <= 2048 ? mod : 2048) : 512; // TODO: tune bounds + int sz = mPath.size(); + if (sz > 1) + { + // The path contains intermediate steps, so avoid going through tile + // centers for them. Instead, interpolate the tile offset. + int sx = mX & 31, sy = mY & 31; + int dx = (mPath.back().x & 31) - sx; + int dy = (mPath.back().y & 31) - sy; + Path::iterator j = mPath.begin(); + for (int i = 0; i < sz - 1; ++i) + { + j->x |= sx + dx * (i + 1) / (sz - 1); + j->y |= sy + dy * (i + 1) / (sz - 1); + ++j; + } + } + if (mAction != WALK && mAction != DEAD) { mWalkTime = tick_time; |