From 2e0bbc9fcc1cce3e1faeff85cc63de7f676e8077 Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Wed, 8 Aug 2012 11:38:10 +0200 Subject: [PATCH] added gauges for health, mana, and ikari displays --- Debug/src/graphics/subdir.mk | 3 + Release/src/graphics/subdir.mk | 3 + src/battle/BattleState.cpp | 17 +++-- src/battle/BattleState.h | 9 ++- src/battle/HeroTag.cpp | 29 ++++++-- src/battle/HeroTag.h | 12 +++- src/graphics/Frame.h | 2 + src/graphics/Gauge.cpp | 123 +++++++++++++++++++++++++++++++++ src/graphics/Gauge.h | 43 ++++++++++++ src/main.cpp | 17 +++-- test-data/battle-bg.png | Bin 15240 -> 15937 bytes test-data/gauges.png | Bin 0 -> 265 bytes test-data/tag-frames.png | Bin 197 -> 229 bytes 13 files changed, 236 insertions(+), 22 deletions(-) create mode 100644 src/graphics/Gauge.cpp create mode 100644 src/graphics/Gauge.h create mode 100644 test-data/gauges.png diff --git a/Debug/src/graphics/subdir.mk b/Debug/src/graphics/subdir.mk index b7c5c2d..df30151 100644 --- a/Debug/src/graphics/subdir.mk +++ b/Debug/src/graphics/subdir.mk @@ -5,14 +5,17 @@ # Add inputs and outputs from these tool invocations to the build variables CPP_SRCS += \ ../src/graphics/Frame.cpp \ +../src/graphics/Gauge.cpp \ ../src/graphics/Sprite.cpp OBJS += \ ./src/graphics/Frame.o \ +./src/graphics/Gauge.o \ ./src/graphics/Sprite.o CPP_DEPS += \ ./src/graphics/Frame.d \ +./src/graphics/Gauge.d \ ./src/graphics/Sprite.d diff --git a/Release/src/graphics/subdir.mk b/Release/src/graphics/subdir.mk index 1471b9c..44c1049 100644 --- a/Release/src/graphics/subdir.mk +++ b/Release/src/graphics/subdir.mk @@ -5,14 +5,17 @@ # Add inputs and outputs from these tool invocations to the build variables CPP_SRCS += \ ../src/graphics/Frame.cpp \ +../src/graphics/Gauge.cpp \ ../src/graphics/Sprite.cpp OBJS += \ ./src/graphics/Frame.o \ +./src/graphics/Gauge.o \ ./src/graphics/Sprite.o CPP_DEPS += \ ./src/graphics/Frame.d \ +./src/graphics/Gauge.d \ ./src/graphics/Sprite.d diff --git a/src/battle/BattleState.cpp b/src/battle/BattleState.cpp index 6cb3b32..b1eaa4d 100644 --- a/src/battle/BattleState.cpp +++ b/src/battle/BattleState.cpp @@ -50,7 +50,7 @@ void BattleState::EnterState(Application &ctrl, SDL_Surface *screen) { heroesLayout->CalculatePositions(background->w, background->h, heroesPositions); attackChoices.resize(heroes.size()); for (vector::size_type i(0), end(heroes.size()); i < end; ++i) { - heroTags.push_back(HeroTag(&heroes[i], &attackChoices[i], heroTagFrame, activeHeroTagFrame, HeroTag::Alignment((i + 1) % 2))); + heroTags.push_back(HeroTag(&heroes[i], &attackChoices[i], heroTagFrame, activeHeroTagFrame, healthGauge, manaGauge, ikariGauge, HeroTag::Alignment((i + 1) % 2))); } } @@ -112,16 +112,15 @@ void BattleState::RenderHeroes(SDL_Surface *screen, const Vector &offset) { } void BattleState::RenderHeroTags(SDL_Surface *screen, const Vector &offset) { - int margin(attackTypeMenu.Height() * 3 / 48); - int tagHeight(attackTypeMenu.Height() - 2 * margin); - int tagWidth(attackTypeMenu.Width() * 2 + attackTypeMenu.Width() / 2 - 2 * margin); - int xOffset((BackgroundWidth() - 2 * tagWidth - 2 * margin) / 2); + int tagHeight(attackTypeMenu.Height()); + int tagWidth(attackTypeMenu.Width() * 2 + attackTypeMenu.Width() / 2); + int xOffset((BackgroundWidth() - 2 * tagWidth) / 2); Point tagPosition[4]; - tagPosition[0] = Point(xOffset, BackgroundHeight() - 2 * tagHeight - 3 * margin); - tagPosition[1] = Point(xOffset + tagWidth + 2 * margin, BackgroundHeight() - 2 * tagHeight - 3 * margin); - tagPosition[2] = Point(xOffset, BackgroundHeight() - tagHeight - margin); - tagPosition[3] = Point(xOffset + tagWidth + 2 * margin, BackgroundHeight() - tagHeight - margin); + tagPosition[0] = Point(xOffset, BackgroundHeight() - 2 * tagHeight); + tagPosition[1] = Point(xOffset + tagWidth, BackgroundHeight() - 2 * tagHeight); + tagPosition[2] = Point(xOffset, BackgroundHeight() - tagHeight); + tagPosition[3] = Point(xOffset + tagWidth, BackgroundHeight() - tagHeight); for (vector::size_type i(0), end(heroTags.size()); i < end; ++i) { heroTags[i].Render(screen, tagWidth, tagHeight, tagPosition[i] + offset, (int)i == activeHero); diff --git a/src/battle/BattleState.h b/src/battle/BattleState.h index f4f8bc1..b56b9fe 100644 --- a/src/battle/BattleState.h +++ b/src/battle/BattleState.h @@ -24,6 +24,7 @@ namespace app { class Input; } namespace graphics { class Frame; + class Gauge; class Sprite; } @@ -35,12 +36,15 @@ class BattleState : public app::State { public: - BattleState(SDL_Surface *background, const PartyLayout &monstersLayout, const PartyLayout &heroesLayout, const graphics::Sprite *attackIcons, const graphics::Sprite *moveIcons, const graphics::Frame *heroTagFrame, const graphics::Frame *activeHeroTagFrame) + BattleState(SDL_Surface *background, const PartyLayout &monstersLayout, const PartyLayout &heroesLayout, const graphics::Sprite *attackIcons, const graphics::Sprite *moveIcons, const graphics::Frame *heroTagFrame, const graphics::Frame *activeHeroTagFrame, const graphics::Gauge *healthGauge, const graphics::Gauge *manaGauge, const graphics::Gauge *ikariGauge) : background(background) , monstersLayout(&monstersLayout) , heroesLayout(&heroesLayout) , heroTagFrame(heroTagFrame) , activeHeroTagFrame(activeHeroTagFrame) + , healthGauge(healthGauge) + , manaGauge(manaGauge) + , ikariGauge(ikariGauge) , attackTypeMenu(attackIcons) , moveMenu(moveIcons) , activeHero(-1) { } @@ -91,6 +95,9 @@ private: const PartyLayout *heroesLayout; const graphics::Frame *heroTagFrame; const graphics::Frame *activeHeroTagFrame; + const graphics::Gauge *healthGauge; + const graphics::Gauge *manaGauge; + const graphics::Gauge *ikariGauge; AttackTypeMenu attackTypeMenu; MoveMenu moveMenu; std::vector > monsterPositions; diff --git a/src/battle/HeroTag.cpp b/src/battle/HeroTag.cpp index 87f35dd..851e88e 100644 --- a/src/battle/HeroTag.cpp +++ b/src/battle/HeroTag.cpp @@ -11,6 +11,7 @@ #include "../geometry/operators.h" #include "../geometry/Vector.h" #include "../graphics/Frame.h" +#include "../graphics/Gauge.h" #include "../graphics/Sprite.h" using geometry::Point; @@ -19,17 +20,37 @@ using geometry::Vector; namespace battle { void HeroTag::Render(SDL_Surface *screen, int width, int height, Point position, bool active) const { + // frame + Vector frameOffset; if (active) { activeFrame->Draw(screen, position, width, height); + frameOffset = Vector(activeFrame->BorderWidth(), activeFrame->BorderHeight()); } else { frame->Draw(screen, position, width, height); + frameOffset = Vector(frame->BorderWidth(), frame->BorderHeight()); } - int verticalHeroOffset((height - hero->Sprite()->Height()) / 2); - + int yOffset((height - hero->Sprite()->Height()) / 2); + + // gauges + // NOTE: assuming frame border is unit size until charsets are impemented + int gaugeX((align == LEFT ? 10 : 6) * frameOffset.X()); + // 4 units reserved for hero, gaugeX already includes frame offset + int gaugeWidth(width - gaugeX - (align == LEFT ? 1 : 5) * frameOffset.X()); + // health gauge, second line + Vector healthGaugeOffset(gaugeX, 2 * frameOffset.Y()); + healthGauge->Draw(screen, position + healthGaugeOffset, gaugeWidth, hero->RelativeHealth(256)); + // mana gauge, third line + Vector manaGaugeOffset(gaugeX, 3 * frameOffset.Y()); + manaGauge->Draw(screen, position + manaGaugeOffset, gaugeWidth, hero->RelativeMana(256)); + // ikari gauge, fourth line + Vector ikariGaugeOffset(gaugeX, 4 * frameOffset.Y()); + ikariGauge->Draw(screen, position + ikariGaugeOffset, gaugeWidth, hero->RelativeIP(256)); + + // hero Vector heroOffset( - (align == LEFT) ? verticalHeroOffset : width - hero->Sprite()->Width() - verticalHeroOffset, - verticalHeroOffset); + (align == LEFT) ? yOffset : width - hero->Sprite()->Width() - yOffset, + yOffset); hero->Sprite()->Draw(screen, position + heroOffset, 0, hero->Health() > 0 ? 0 : 2); } diff --git a/src/battle/HeroTag.h b/src/battle/HeroTag.h index 6799e94..b5ab475 100644 --- a/src/battle/HeroTag.h +++ b/src/battle/HeroTag.h @@ -12,7 +12,10 @@ #include -namespace graphics { class Frame; } +namespace graphics { + class Frame; + class Gauge; +} namespace battle { @@ -28,8 +31,8 @@ public: }; public: - HeroTag(const Hero *hero, const AttackChoice *choice, const graphics::Frame *frame, const graphics::Frame *activeFrame, Alignment align) - : hero(hero), choice(choice), frame(frame), activeFrame(activeFrame), align(align) { } + HeroTag(const Hero *hero, const AttackChoice *choice, const graphics::Frame *frame, const graphics::Frame *activeFrame, const graphics::Gauge *healthGauge, const graphics::Gauge *manaGauge, const graphics::Gauge *ikariGauge, Alignment align) + : hero(hero), choice(choice), frame(frame), activeFrame(activeFrame), healthGauge(healthGauge), manaGauge(manaGauge), ikariGauge(ikariGauge), align(align) { } ~HeroTag() { } public: @@ -40,6 +43,9 @@ private: const AttackChoice *choice; const graphics::Frame *frame; const graphics::Frame *activeFrame; + const graphics::Gauge *healthGauge; + const graphics::Gauge *manaGauge; + const graphics::Gauge *ikariGauge; Alignment align; }; diff --git a/src/graphics/Frame.h b/src/graphics/Frame.h index 0f1287c..3743640 100644 --- a/src/graphics/Frame.h +++ b/src/graphics/Frame.h @@ -23,6 +23,8 @@ public: public: int MinWidth() const { return 2 * borderWidth; } int MinHeight() const { return 2 * borderHeight; } + int BorderWidth() const { return borderWidth; } + int BorderHeight() const { return borderHeight; } void Draw(SDL_Surface *dest, geometry::Point position, int width, int height) const; private: diff --git a/src/graphics/Gauge.cpp b/src/graphics/Gauge.cpp new file mode 100644 index 0000000..042dc27 --- /dev/null +++ b/src/graphics/Gauge.cpp @@ -0,0 +1,123 @@ +/* + * Gauge.cpp + * + * Created on: Aug 7, 2012 + * Author: holy + */ + +#include "Gauge.h" + +using geometry::Point; + +namespace graphics { + +// TODO: add start and end "ignore" offsets +void Gauge::Draw(SDL_Surface *dest, Point position, int width, Uint8 level) const { + int fullWidth(width * level / 255); + SDL_Rect srcRect, destRect; + + // start + srcRect.h = height; + destRect.x = position.X(); + destRect.y = position.Y(); + // full part + if (fullWidth >= startWidth) { // completely filled + srcRect.x = fullX; + srcRect.y = fullY; + srcRect.w = startWidth; + SDL_BlitSurface(surface, &srcRect, dest, &destRect); + } else if (fullWidth > 0) { // partially filled + srcRect.x = fullX; + srcRect.y = fullY; + srcRect.w = fullWidth; + SDL_BlitSurface(surface, &srcRect, dest, &destRect); + } + // empty part + if (fullWidth == 0) { // completely empty + srcRect.x = emptyX; + srcRect.y = emptyY; + srcRect.w = startWidth; + SDL_BlitSurface(surface, &srcRect, dest, &destRect); + } else if (fullWidth < startWidth) { // partially empty + srcRect.x = emptyX + fullWidth; + srcRect.y = emptyY; + srcRect.w = startWidth - fullWidth; + destRect.x = position.X() + fullWidth; + SDL_BlitSurface(surface, &srcRect, dest, &destRect); + } + + destRect.x = position.X() + startWidth; + + // fill + if (fullWidth >= width - endWidth) { // completely filled + srcRect.x = fullX + startWidth; + srcRect.y = fullY; + srcRect.w = repeatWidth; + int fillWidth(width - startWidth - endWidth); + int fillCursor(0); + while (fillCursor < fillWidth) { + SDL_BlitSurface(surface, &srcRect, dest, &destRect); + destRect.x += repeatWidth; + fillCursor += repeatWidth; + } + } else if (fullWidth <= startWidth) { // completely empty + srcRect.x = emptyX + startWidth; + srcRect.y = emptyY; + srcRect.w = repeatWidth; + int fillWidth(width - startWidth - endWidth); + int fillCursor(0); + while (fillCursor < fillWidth) { + SDL_BlitSurface(surface, &srcRect, dest, &destRect); + destRect.x += repeatWidth; + fillCursor += repeatWidth; + } + } else { // partially filled/empty + srcRect.x = fullX + startWidth; + srcRect.y = fullY; + srcRect.w = repeatWidth; + int fillCursor(0); + while (fillCursor < fullWidth) { + SDL_BlitSurface(surface, &srcRect, dest, &destRect); + destRect.x += repeatWidth; + fillCursor += repeatWidth; + } + srcRect.x = emptyX + startWidth; + srcRect.y = emptyY; + int remaining(width - startWidth - endWidth); + while (fillCursor < remaining) { + SDL_BlitSurface(surface, &srcRect, dest, &destRect); + destRect.x += repeatWidth; + fillCursor += repeatWidth; + } + } + + // end + // full part + if (fullWidth >= width) { // completely filled + srcRect.x = fullX + startWidth + repeatWidth; + srcRect.y = fullY; + srcRect.w = endWidth; + SDL_BlitSurface(surface, &srcRect, dest, &destRect); + } else if (fullWidth > (width - endWidth)) { // partially filled + srcRect.x = fullX + startWidth + repeatWidth; + srcRect.y = fullY; + srcRect.w = endWidth - width + fullWidth; + SDL_BlitSurface(surface, &srcRect, dest, &destRect); + } + // empty part + if (fullWidth <= width - endWidth) { // completely empty + srcRect.x = emptyX + startWidth + repeatWidth; + srcRect.y = emptyY; + srcRect.w = startWidth; + SDL_BlitSurface(surface, &srcRect, dest, &destRect); + } else if (fullWidth > (width - endWidth) && fullWidth < width) { // partially empty + srcRect.x = emptyX + startWidth + repeatWidth + fullWidth - width + endWidth; + srcRect.y = emptyY; + srcRect.w = width - fullWidth; + destRect.x = position.X() + fullWidth; + SDL_BlitSurface(surface, &srcRect, dest, &destRect); + } + +} + +} diff --git a/src/graphics/Gauge.h b/src/graphics/Gauge.h new file mode 100644 index 0000000..dde1db0 --- /dev/null +++ b/src/graphics/Gauge.h @@ -0,0 +1,43 @@ +/* + * Gauge.h + * + * Created on: Aug 7, 2012 + * Author: holy + */ + +#ifndef GRAPHICS_GAUGE_H_ +#define GRAPHICS_GAUGE_H_ + +#include "../geometry/Point.h" + +#include + +namespace graphics { + +class Gauge { + +public: + Gauge(SDL_Surface *s, int fullX, int fullY, int emptyX, int emptyY, int height, int startWidth, int repeatWidth, int endWidth) + : surface(s), fullX(fullX), fullY(fullY), emptyX(emptyX), emptyY(emptyY), height(height), startWidth(startWidth), repeatWidth(repeatWidth), endWidth(endWidth) { } + +public: + int MinWidth() const { return startWidth + endWidth; } + int Height() const { return height; } + void Draw(SDL_Surface *dest, geometry::Point position, int width, Uint8 level) const; + +private: + SDL_Surface *surface; + int fullX; + int fullY; + int emptyX; + int emptyY; + int height; + int startWidth; + int repeatWidth; + int endWidth; + +}; + +} + +#endif /* GRAPHICS_GAUGE_H_ */ diff --git a/src/main.cpp b/src/main.cpp index f12b275..e230433 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,6 +13,7 @@ #include "battle/PartyLayout.h" #include "geometry/Point.h" #include "graphics/Frame.h" +#include "graphics/Gauge.h" #include "graphics/Sprite.h" #include "sdl/InitImage.h" #include "sdl/InitScreen.h" @@ -31,6 +32,7 @@ using battle::Monster; using battle::PartyLayout; using geometry::Point; using graphics::Frame; +using graphics::Gauge; using graphics::Sprite; using sdl::InitImage; using sdl::InitScreen; @@ -77,18 +79,23 @@ int main(int argc, char **argv) { hero.SetMaxHealth(100); hero.SetHealth(50); hero.SetMaxMana(100); - hero.SetMana(66); - hero.SetIP(160); + hero.SetMana(0); + hero.SetIP(255); SDL_Surface *attackIcons(IMG_Load("test-data/attack-type-icons.png")); Sprite attackIconsSprite(attackIcons, 32, 32); SDL_Surface *moveIcons(IMG_Load("test-data/move-icons.png")); Sprite moveIconsSprite(moveIcons, 32, 32); SDL_Surface *tagFrames(IMG_Load("test-data/tag-frames.png")); - Frame heroTagFrame(tagFrames, 8, 8, 1, 1, 17); - Frame activeHeroTagFrame(tagFrames, 8, 8); + Frame heroTagFrame(tagFrames, 16, 16, 1, 1, 0, 33); + Frame activeHeroTagFrame(tagFrames, 16, 16); - BattleState *battleState(new BattleState(bg, monstersLayout, heroesLayout, &attackIconsSprite, &moveIconsSprite, &heroTagFrame, &activeHeroTagFrame)); + SDL_Surface *gauges(IMG_Load("test-data/gauges.png")); + Gauge healthGauge(gauges, 0, 16, 0, 0, 16, 6, 1, 6); + Gauge manaGauge(gauges, 0, 32, 0, 0, 16, 6, 1, 6); + Gauge ikariGauge(gauges, 0, 48, 0, 0, 16, 6, 1, 6); + + BattleState *battleState(new BattleState(bg, monstersLayout, heroesLayout, &attackIconsSprite, &moveIconsSprite, &heroTagFrame, &activeHeroTagFrame, &healthGauge, &manaGauge, &ikariGauge)); battleState->AddMonster(monster); battleState->AddMonster(monster); battleState->AddMonster(monster); diff --git a/test-data/battle-bg.png b/test-data/battle-bg.png index b62ab74798ce01f3d471579dc157179595f6817e..65fa4087c0e8c54024ed97ef827e50bbac2e134d 100644 GIT binary patch literal 15937 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 B3CjQg diff --git a/test-data/gauges.png b/test-data/gauges.png new file mode 100644 index 0000000000000000000000000000000000000000..381fd1b810621c7db87234b22091bb7e0115ae10 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp@K^P)-SiU zH9BkGT7(jQ<>RtNH(jS8OPOCN(WC}C1^g=C#{Svz8t{IK3@l-+`yU z#m&!|dt^wMJ>b?XiBIO1Omfb;&?+D-CvUQ6N8vukxxRb~uKL{bSZ+3GpYmW`@!W_ayRR?yizc0ahomg%*wzp|3;|aarQY=fbL@OboFyt=akR{0FApua{vGU -- 2.39.2