diff options
author | Ira Rice <irarice@gmail.com> | 2008-10-27 01:32:22 +0000 |
---|---|---|
committer | Ira Rice <irarice@gmail.com> | 2008-10-27 01:32:22 +0000 |
commit | 8119f4ec53b64adc427f683077f65ce8aec85582 (patch) | |
tree | ed95e9a85c4cfe412e391f95860866253d25b0a4 /src/localplayer.cpp | |
parent | fe76762f26180fdbbbac6e16bfa02c8bde3be78b (diff) | |
download | mana-8119f4ec53b64adc427f683077f65ce8aec85582.tar.gz mana-8119f4ec53b64adc427f683077f65ce8aec85582.tar.bz2 mana-8119f4ec53b64adc427f683077f65ce8aec85582.tar.xz mana-8119f4ec53b64adc427f683077f65ce8aec85582.zip |
Merged the Tametomo branch back into trunk. Targeting has been removed
from the viewport, and is now located on the beings themselves.
Eventually, this will be changed further so that the targets draw below
the being, instead of maintaining the same logic, but baby steps first.
Diffstat (limited to 'src/localplayer.cpp')
-rw-r--r-- | src/localplayer.cpp | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/src/localplayer.cpp b/src/localplayer.cpp index 66d37ddf..4cdaf03c 100644 --- a/src/localplayer.cpp +++ b/src/localplayer.cpp @@ -20,6 +20,7 @@ * * $Id$ */ +#include <cassert> #include "localplayer.h" @@ -38,6 +39,9 @@ #include "net/messageout.h" #include "net/protocol.h" +#include "resources/resourcemanager.h" +#include "resources/imageset.h" + #include "utils/tostring.h" LocalPlayer *player_node = NULL; @@ -54,12 +58,21 @@ LocalPlayer::LocalPlayer(Uint32 id, Uint16 job, Map *map): mInventory(new Inventory(INVENTORY_SIZE)), mStorage(new Inventory(STORAGE_SIZE)) { + initTargetCursor(); } LocalPlayer::~LocalPlayer() { delete mInventory; delete mStorage; + + for (int i = Being::TC_SMALL; i < Being::NUM_TC; i++) + { + delete mTargetCursorInRange[i]; + delete mTargetCursorOutRange[i]; + mInRangeImages[i]->decRef(); + mOutRangeImages[i]->decRef(); + } } void LocalPlayer::logic() @@ -104,6 +117,12 @@ void LocalPlayer::logic() mLastAction = -1; } + for (int i = Being::TC_SMALL; i < Being::NUM_TC; i++) + { + player_node->mTargetCursorInRange[i]->update(10); + player_node->mTargetCursorOutRange[i]->update(10); + } + Being::logic(); } @@ -494,3 +513,83 @@ void LocalPlayer::setGotoTarget(Being *target) mGoingToTarget = true; setDestination(target->mX, target->mY); } + +void LocalPlayer::initTargetCursor() +{ + // Load target cursors + loadTargetCursor("graphics/gui/target-cursor-blue-s.png", 44, 35, + false, TC_SMALL); + loadTargetCursor("graphics/gui/target-cursor-red-s.png", 44, 35, + true, TC_SMALL); + loadTargetCursor("graphics/gui/target-cursor-blue-m.png", 62, 44, + false, TC_MEDIUM); + loadTargetCursor("graphics/gui/target-cursor-red-m.png", 62, 44, + true, TC_MEDIUM); + loadTargetCursor("graphics/gui/target-cursor-blue-l.png", 82, 60, + false, TC_LARGE); + loadTargetCursor("graphics/gui/target-cursor-red-l.png", 82, 60, + true, TC_LARGE); +} + +void LocalPlayer::loadTargetCursor(std::string filename, int width, int height, + bool outRange, TargetCursorSize size) +{ + assert(size > -1); + assert(size < 3); + + ImageSet* currentImageSet; + SimpleAnimation* currentCursor; + + ResourceManager *resman = ResourceManager::getInstance(); + + currentImageSet = resman->getImageSet(filename, width, height); + Animation *anim = new Animation(); + for (unsigned int i = 0; i < currentImageSet->size(); ++i) + { + anim->addFrame(currentImageSet->get(i), 75, 0, 0); + } + currentCursor = new SimpleAnimation(anim); + + if (outRange) + { + mOutRangeImages[size] = currentImageSet; + mTargetCursorOutRange[size] = currentCursor; + } + else + { + mInRangeImages[size] = currentImageSet; + mTargetCursorInRange[size] = currentCursor; + } +} + +void LocalPlayer::drawTargetCursor(Graphics *graphics, int offsetX, int offsetY) +{ + // Draw target marker if needed + if (mTarget) + { + // Calculate target circle position + + // Find whether target is in range + int rangeX = abs(mTarget->mX - mX); + int rangeY = abs(mTarget->mY - mY); + int attackRange = getAttackRange(); + + // Get the correct target cursors graphic + TargetCursorSize cursorSize = mTarget->getTargetCursorSize(); + + if (rangeX > attackRange || rangeY > attackRange) + { + mTarget->mTargetCursor = mTargetCursorOutRange[cursorSize]->getCurrentImage(); + } + else + { + mTarget->mTargetCursor = mTargetCursorInRange[cursorSize]->getCurrentImage(); + } + + // Draw the target cursor at the correct position + int posX = mTarget->getPixelX() + 16 - mTarget->mTargetCursor->getWidth() / 2 - offsetX; + int posY = mTarget->getPixelY() + 16 - mTarget->mTargetCursor->getHeight() / 2 - offsetY; + + graphics->drawImage(mTarget->mTargetCursor, posX, posY); + } +} |