]> git.localhorst.tv Git - l2e.git/commitdiff
added menu cursor animations
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Sat, 19 Jan 2013 04:21:25 +0000 (22:21 -0600)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Sat, 19 Jan 2013 05:17:24 +0000 (23:17 -0600)
12 files changed:
src/graphics/Menu.cpp
src/graphics/Menu.h
src/menu/CapsuleFeedMenu.cpp
src/menu/CapsuleMenu.cpp
src/menu/ConfigMenu.cpp
src/menu/EquipMenu.cpp
src/menu/InventoryMenu.cpp
src/menu/PartyMenu.cpp
src/menu/ScenarioMenu.cpp
src/menu/SpellMenu.cpp
src/menu/StatusMenu.cpp
test-data/test.l2s

index 1b81f85a2d731ec7e88c4ed4a1be4926f8f8a0d9..2d7e23777f51c3850ce7ddc9208716f645b11c47 100644 (file)
@@ -1,5 +1,6 @@
 #include "Menu.h"
 
+#include "Animation.h"
 #include "../loader/Interpreter.h"
 #include "../loader/TypeDescription.h"
 
@@ -20,6 +21,8 @@ void MenuProperties::CreateTypeDescription() {
        td.AddField("disabledFont", FieldDescription(((char *)&p.disabledFont) - ((char *)&p), Font::TYPE_ID).SetReferenced().SetDescription("the font for disabled entries"));
        td.AddField("cursor", FieldDescription(((char *)&p.cursor) - ((char *)&p), Sprite::TYPE_ID).SetReferenced().SetDescription("the cursor sprite indicating the current selection"));
        td.AddField("selectedCursor", FieldDescription(((char *)&p.selectedCursor) - ((char *)&p), Sprite::TYPE_ID).SetReferenced().SetDescription("the cursor sprite used when fixating a selection"));
+       td.AddField("cursorAnimation", FieldDescription(((char *)&p.cursorAnimation) - ((char *)&p), Animation::TYPE_ID).SetReferenced().SetDescription("an animation for the cursor sprite"));
+       td.AddField("selectedCursorAnimation", FieldDescription(((char *)&p.selectedCursorAnimation) - ((char *)&p), Animation::TYPE_ID).SetReferenced().SetDescription("an animation for the selected cursor"));
        td.AddField("charsPerEntry", FieldDescription(((char *)&p.charsPerEntry) - ((char *)&p), Interpreter::NUMBER_ID).SetDescription("width of an entry in characters"));
        td.AddField("rows", FieldDescription(((char *)&p.rows) - ((char *)&p), Interpreter::NUMBER_ID).SetDescription("number of visible rows"));
        td.AddField("rowGap", FieldDescription(((char *)&p.rowGap) - ((char *)&p), Interpreter::NUMBER_ID).SetDescription("space between rows in pixles"));
index e288f2d6b946844dc1766652d67728ea6d9b0aea..19ad9071541ebbac673d8b6f97b89c0647e3a3d8 100644 (file)
@@ -1,6 +1,12 @@
 #ifndef GRAPHICS_MENU_H_
 #define GRAPHICS_MENU_H_
 
+namespace app {
+       class Application;
+       class State;
+}
+
+#include "Animation.h"
 #include "Font.h"
 #include "Sprite.h"
 #include "../math/Vector.h"
@@ -18,6 +24,8 @@ struct MenuProperties {
        const Font *disabledFont;
        const Sprite *cursor;
        const Sprite *selectedCursor;
+       const Animation *cursorAnimation;
+       const Animation *selectedCursorAnimation;
        int charsPerEntry;
        int rows;
        int rowGap;
@@ -34,6 +42,7 @@ struct MenuProperties {
 
        MenuProperties()
        : font(0), disabledFont(0), cursor(0), selectedCursor(0)
+       , cursorAnimation(0), selectedCursorAnimation(0)
        , charsPerEntry(0), rows(1), rowGap(0)
        , iconSpace(0), cols(1), colGap(0)
        , charsPerNumber(0), charsPerAdditionalText(0)
@@ -104,12 +113,19 @@ public:
        void Clear() { entries.clear(); }
        void ClearEntry(int at) { entries[at] = Entry(0, T(), false); }
 
+       void StartAnimation(app::Application &ctrl);
+       void StartAnimation(app::State &ctrl);
+       void StopAnimation();
+
        void Draw(SDL_Surface *dest, const math::Vector<int> &position) const;
 
 private:
        int GetRow(int index) const { return index / cols; }
        int GetCol(int index) const { return index % cols; }
 
+       void DrawCursor(SDL_Surface *, const math::Vector<int> &) const;
+       void DrawSelectedCursor(SDL_Surface *, const math::Vector<int> &) const;
+
 private:
        struct Entry {
                Entry(const char *title, const T &value, bool enabled = true, const Sprite *icon = 0, int number = 0, const char *additionalText = 0)
@@ -121,6 +137,8 @@ private:
                T value;
                bool enabled;
        };
+       AnimationRunner animation;
+       AnimationRunner selectedAnimation;
        std::vector<Entry> entries;
        int selected;
        int secondarySelection;
@@ -149,6 +167,8 @@ Menu<T>::Menu()
 template<class T>
 Menu<T>::Menu(const MenuProperties &p)
 : MenuProperties(p)
+, animation(cursorAnimation)
+, selectedAnimation(selectedCursorAnimation)
 , selected(0)
 , secondarySelection(0)
 , topRow(0)
@@ -229,6 +249,33 @@ void Menu<T>::SelectIndex(int index) {
 }
 
 
+template<class T>
+void Menu<T>::StartAnimation(app::Application &ctrl) {
+       if (cursorAnimation) {
+               animation.Start(ctrl);
+       }
+       if (selectedCursorAnimation) {
+               selectedAnimation.Start(ctrl);
+       }
+}
+
+template<class T>
+void Menu<T>::StartAnimation(app::State &ctrl) {
+       if (cursorAnimation) {
+               animation.Start(ctrl);
+       }
+       if (selectedCursorAnimation) {
+               selectedAnimation.Start(ctrl);
+       }
+}
+
+template<class T>
+void Menu<T>::StopAnimation() {
+       animation.Stop();
+       selectedAnimation.Stop();
+}
+
+
 template<class T>
 void Menu<T>::Draw(SDL_Surface *dest, const math::Vector<int> &position) const {
        int start(topRow * cols);
@@ -280,24 +327,46 @@ void Menu<T>::Draw(SDL_Surface *dest, const math::Vector<int> &position) const {
                case STATE_INACTIVE:
                        break;
                case STATE_ACTIVE:
-                       cursor->Draw(dest, position + cursorOffset);
+                       DrawCursor(dest, position + cursorOffset);
                        break;
                case STATE_SELECTED:
-                       selectedCursor->Draw(dest, position + cursorOffset);
+                       DrawSelectedCursor(dest, position + cursorOffset);
                        break;
                case STATE_DUAL:
-                       cursor->Draw(dest, position + cursorOffset
+                       DrawCursor(dest, position + cursorOffset
                                        - math::Vector<int>(selectedCursor->Width(), 0));
                        if (secondarySelection >= start && secondarySelection <= end) {
                                math::Vector<int> secondaryOffset(
                                                (secondarySelection % cols) * (ColWidth() + colGap) - cursor->Width(),
                                                ((secondarySelection - start) / cols) * RowHeight());
-                               selectedCursor->Draw(dest, position + secondaryOffset);
+                               DrawSelectedCursor(dest, position + secondaryOffset);
                        }
                        break;
        }
 }
 
+template<class T>
+void Menu<T>::DrawCursor(
+               SDL_Surface *dest,
+               const math::Vector<int> &position) const {
+       if (animation.Running()) {
+               animation.Draw(dest, position);
+       } else {
+               cursor->Draw(dest, position);
+       }
+}
+
+template<class T>
+void Menu<T>::DrawSelectedCursor(
+               SDL_Surface *dest,
+               const math::Vector<int> &position) const {
+       if (selectedAnimation.Running()) {
+               selectedAnimation.Draw(dest, position);
+       } else {
+               selectedCursor->Draw(dest, position);
+       }
+}
+
 }
 
 #endif
index 07808f65b49b8f9a34b031eb07ad6ad777cc6ab4..ead0d718c7382a67f1b3b00cfd0c00bf21313d87 100644 (file)
@@ -34,7 +34,9 @@ CapsuleFeedMenu::CapsuleFeedMenu(CapsuleMenu *parent)
 
 void CapsuleFeedMenu::OnEnterState(SDL_Surface *) {
        menu.SetSelected();
+       menu.StartAnimation(Ctrl());
        itemMenu.SetActive();
+       itemMenu.StartAnimation(Ctrl());
 }
 
 void CapsuleFeedMenu::LoadInventory() {
index 6b2eeeb1da1194da8674754a8b7ffbe8358453c3..b45a204a9366514af10046ac8127ffbd8f83d1d4 100644 (file)
@@ -35,7 +35,7 @@ CapsuleMenu::CapsuleMenu(PartyMenu *parent)
 
 
 void CapsuleMenu::OnEnterState(SDL_Surface *) {
-
+       menu.StartAnimation(Ctrl());
 }
 
 void CapsuleMenu::OnExitState(SDL_Surface *) {
index 274f30a1d80bc6ee593e4d20e7e4c683200411dc..fa51f7732c5d5932e15e11b339b30beb6e1bd590 100644 (file)
@@ -29,7 +29,7 @@ ConfigMenu::ConfigMenu(PartyMenu *parent)
 
 
 void ConfigMenu::OnEnterState(SDL_Surface *) {
-
+       configMenu.StartAnimation(Ctrl());
 }
 
 void ConfigMenu::OnExitState(SDL_Surface *) {
index d04d2f4315ee99e68dbc387d68c737fe98ec6e9b..1a433beae3d2fb95b24340e495b7828ff340041a 100644 (file)
@@ -43,8 +43,11 @@ EquipMenu::EquipMenu(PartyMenu *parent, int cursor)
 
 
 void EquipMenu::OnEnterState(SDL_Surface *) {
+       actionMenu.StartAnimation(Ctrl());
        equipmentMenu.SetInactive();
+       equipmentMenu.StartAnimation(Ctrl());
        inventoryMenu.SetInactive();
+       inventoryMenu.StartAnimation(Ctrl());
 }
 
 void EquipMenu::OnExitState(SDL_Surface *) {
index a2881719f717caff55f0f6d4ca315846ec228543..de60edcf0e2289458d8e7d6e7252564b2c8e30a3 100644 (file)
@@ -34,7 +34,9 @@ InventoryMenu::InventoryMenu(PartyMenu *parent)
 
 void InventoryMenu::OnEnterState(SDL_Surface *) {
        menu.SetSelected();
+       menu.StartAnimation(Ctrl());
        LoadInventory();
+       itemMenu.StartAnimation(Ctrl());
 }
 
 void InventoryMenu::LoadInventory() {
index 46e271bd70218fc95f8d889d6b74f703f9021b2d..4a347c508914c274e9afbc7d47126fd1c8dc8b4c 100644 (file)
@@ -53,7 +53,7 @@ PartyMenu::~PartyMenu() {
 
 
 void PartyMenu::OnEnterState(SDL_Surface *) {
-
+       mainMenu.StartAnimation(Ctrl());
 }
 
 void PartyMenu::OnExitState(SDL_Surface *) {
index 18fa55a984291177f65ada647b8bbbfa8686fbaf..59e075bdbbaee47621a8c300a7e1c69ae37081de 100644 (file)
@@ -30,6 +30,7 @@ ScenarioMenu::ScenarioMenu(PartyMenu *parent)
 
 void ScenarioMenu::OnEnterState(SDL_Surface *) {
        LoadItems();
+       itemMenu.StartAnimation(Ctrl());
 }
 
 void ScenarioMenu::LoadItems() {
index 5f125733a58c8dcd8496f19fb32b666121df4b16..0c7936595bd2e44525b3ad97c6ca7535619b3008 100644 (file)
@@ -45,7 +45,9 @@ void SpellMenu::OnEnterState(SDL_Surface *) {
        SDL_SetAlpha(highlight, SDL_SRCALPHA|SDL_RLEACCEL, 0x20);
 
        actionMenu.SetSelected();
+       actionMenu.StartAnimation(Ctrl());
        LoadSpells();
+       spellMenu.StartAnimation(Ctrl());
 }
 
 void SpellMenu::LoadSpells() {
index 41f848f82dde590cf55c6c872e7cd4469b1ccc7f..b2435edbea1cf34de405a82a59a8adeb200fcf1e 100644 (file)
@@ -34,7 +34,7 @@ StatusMenu::StatusMenu(PartyMenu *parent, int cursor)
 
 
 void StatusMenu::OnEnterState(SDL_Surface *) {
-
+       menu.StartAnimation(Ctrl());
 }
 
 void StatusMenu::OnExitState(SDL_Surface *) {
index ed457cacfec0c3de823967d90093f8caf9351d51..24f4bb25eebb741d68960fce76d827768b51a2f6 100644 (file)
@@ -672,6 +672,18 @@ Sprite menuActiveCursor {
        image: :"menu-cursor-active.png",
        size: <32, 18>
 }
+SimpleAnimation menuCursorAnimation {
+       sprite: menuCursor,
+       frametime: fourFramesTime,
+       framecount: 6,
+       repeat: true
+}
+SimpleAnimation menuActiveCursorAnimation {
+       sprite: menuActiveCursor,
+       frametime: fourFramesTime,
+       framecount: 5,
+       repeat: true
+}
 
 export MenuResources menuResources {
        menubg: Texture {
@@ -697,6 +709,7 @@ export MenuResources menuResources {
                rowGap: 8,
                colGap: 32,
                cursor: menuCursor,
+               cursorAnimation: menuCursorAnimation,
                font: menuFont,
                disabledFont: menuInactiveFont,
                wrapX: true,
@@ -740,6 +753,7 @@ export MenuResources menuResources {
                charsPerEntry: 6,
                colGap: 16,
                cursor: menuCursor,
+               cursorAnimation: menuCursorAnimation,
                font: menuFont,
                wrapX: true
        },
@@ -753,6 +767,8 @@ export MenuResources menuResources {
                colGap: 16,
                cursor: menuCursor,
                selectedCursor: menuActiveCursor,
+               cursorAnimation: menuCursorAnimation,
+               selectedCursorAnimation: menuActiveCursorAnimation,
                font: menuFont,
                wrapX: true,
                wrapY: true
@@ -768,6 +784,8 @@ export MenuResources menuResources {
                rowGap: 8,
                cursor: menuCursor,
                selectedCursor: menuActiveCursor,
+               cursorAnimation: menuCursorAnimation,
+               selectedCursorAnimation: menuActiveCursorAnimation,
                font: menuFont,
                disabledFont: menuInactiveFont,
                iconSpace: 16,
@@ -783,6 +801,8 @@ export MenuResources menuResources {
                colGap: 48,
                cursor: menuCursor,
                selectedCursor: menuActiveCursor,
+               cursorAnimation: menuCursorAnimation,
+               selectedCursorAnimation: menuActiveCursorAnimation,
                font: menuFont,
                disabledFont: menuInactiveFont,
                charsPerNumber: 2,
@@ -795,6 +815,8 @@ export MenuResources menuResources {
                rowGap: 8,
                cursor: menuCursor,
                selectedCursor: menuActiveCursor,
+               cursorAnimation: menuCursorAnimation,
+               selectedCursorAnimation: menuActiveCursorAnimation,
                font: menuFont
        },
        equipmentMenu: MenuProperties {
@@ -804,6 +826,8 @@ export MenuResources menuResources {
                rowGap: 16,
                cursor: menuCursor,
                selectedCursor: menuActiveCursor,
+               cursorAnimation: menuCursorAnimation,
+               selectedCursorAnimation: menuActiveCursorAnimation,
                font: normalFont,
                iconSpace: 16,
                wrapY: true
@@ -819,6 +843,7 @@ export MenuResources menuResources {
                charsPerEntry: 8,
                rowGap: 32,
                cursor: menuCursor,
+               cursorAnimation: menuCursorAnimation,
                font: menuFont,
                wrapY: true
        },
@@ -839,6 +864,7 @@ export MenuResources menuResources {
                charsPerEntry: 14,
                rowGap: 8,
                cursor: menuCursor,
+               cursorAnimation: menuCursorAnimation,
                font: menuFont
        },
        scenarioMenuHeadline: "SCENARIO ITEM",
@@ -852,6 +878,8 @@ export MenuResources menuResources {
                charsPerEntry: 7,
                cursor: menuCursor,
                selectedCursor: menuActiveCursor,
+               cursorAnimation: menuCursorAnimation,
+               selectedCursorAnimation: menuActiveCursorAnimation,
                font: menuFont,
                thirdColumnHack: 2
        },
@@ -862,6 +890,8 @@ export MenuResources menuResources {
                colGap: 32,
                cursor: menuCursor,
                selectedCursor: menuActiveCursor,
+               cursorAnimation: menuCursorAnimation,
+               selectedCursorAnimation: menuActiveCursorAnimation,
                font: menuFont
        },
        capsuleFeedLabel: "FEED",