animated text
This commit is contained in:
		
							parent
							
								
									37a6a38ca6
								
							
						
					
					
						commit
						5830a3dc3e
					
				|  | @ -61,6 +61,16 @@ public: | |||
|     bool operator==(const Color& other) const { return other.m_rgba == m_rgba; } | ||||
|     bool operator!=(const Color& other) const { return other.m_rgba != m_rgba; } | ||||
| 
 | ||||
|     static Color from8bit(int color) { | ||||
|         if(color >= 216 || color <= 0) | ||||
|             return Color(0, 0, 0); | ||||
| 
 | ||||
|         int r = int(color / 36) % 6 * 51; | ||||
|         int g = int(color / 6) % 6 * 51; | ||||
|         int b = color % 6 * 51; | ||||
|         return Color(r, g, b); | ||||
|     } | ||||
| 
 | ||||
| private: | ||||
|     union { | ||||
|         uint32 m_rgba; | ||||
|  |  | |||
|  | @ -29,6 +29,7 @@ SET(otclient_SOURCES ${otclient_SOURCES} | |||
|     ${CMAKE_CURRENT_LIST_DIR}/core/missile.cpp | ||||
|     ${CMAKE_CURRENT_LIST_DIR}/core/localplayer.cpp | ||||
|     ${CMAKE_CURRENT_LIST_DIR}/core/outfit.cpp | ||||
|     ${CMAKE_CURRENT_LIST_DIR}/core/animatedtext.cpp | ||||
| 
 | ||||
|     # otclient ui | ||||
|     ${CMAKE_CURRENT_LIST_DIR}/ui/uiitem.cpp | ||||
|  |  | |||
|  | @ -0,0 +1,61 @@ | |||
| /*
 | ||||
|  * Copyright (c) 2010-2011 OTClient <https://github.com/edubart/otclient>
 | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| 
 | ||||
| #include "animatedtext.h" | ||||
| #include "outfit.h" | ||||
| #include "map.h" | ||||
| #include <framework/core/clock.h> | ||||
| #include <framework/core/eventdispatcher.h> | ||||
| 
 | ||||
| AnimatedText::AnimatedText() | ||||
| { | ||||
|     m_font = g_fonts.getFont("verdana-11px-rounded"); | ||||
| } | ||||
| 
 | ||||
| void AnimatedText::start() | ||||
| { | ||||
|     m_startTime = g_clock.time(); | ||||
| 
 | ||||
|     auto self = asAnimatedText(); | ||||
| 
 | ||||
|     // schedule removal
 | ||||
|     g_dispatcher.scheduleEvent([self]() { | ||||
|         g_map.removeThing(self); | ||||
|     }, DURATION); | ||||
| } | ||||
| 
 | ||||
| void AnimatedText::draw(const Point& p) | ||||
| { | ||||
|     assert(m_font); | ||||
|     m_font->renderText(m_text, Rect(p + Point(0, -20.0 * g_clock.timeElapsed(m_startTime) / (DURATION / 1000)), m_textSize), Fw::AlignTopCenter, m_color); | ||||
| } | ||||
| 
 | ||||
| void AnimatedText::setColor(int color) | ||||
| { | ||||
|     m_color = Color::from8bit(color); | ||||
| } | ||||
| 
 | ||||
| void AnimatedText::setText(const std::string& text) | ||||
| { | ||||
|     m_textSize = m_font->calculateTextRectSize(text); | ||||
|     m_text = text; | ||||
| } | ||||
|  | @ -0,0 +1,55 @@ | |||
| /*
 | ||||
|  * Copyright (c) 2010-2011 OTClient <https://github.com/edubart/otclient>
 | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef ANIMATEDTEXT_H | ||||
| #define ANIMATEDTEXT_H | ||||
| 
 | ||||
| #include "thing.h" | ||||
| #include <framework/graphics/fontmanager.h> | ||||
| 
 | ||||
| class AnimatedText : public Thing | ||||
| { | ||||
| public: | ||||
|     enum { | ||||
|         DURATION = 1000 | ||||
|     }; | ||||
| 
 | ||||
|     AnimatedText(); | ||||
| 
 | ||||
|     void start(); | ||||
|     void draw(const Point& p); | ||||
| 
 | ||||
|     void setColor(int color); | ||||
|     void setText(const std::string& text); | ||||
| 
 | ||||
|     AnimatedTextPtr asAnimatedText() { return std::static_pointer_cast<AnimatedText>(shared_from_this()); } | ||||
| 
 | ||||
| private: | ||||
|     FontPtr m_font; | ||||
|     Size m_textSize; | ||||
|     std::string m_text; | ||||
|     Color m_color; | ||||
|     double m_startTime; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| #endif | ||||
|  | @ -33,6 +33,7 @@ class Effect; | |||
| class Missile; | ||||
| class Player; | ||||
| class LocalPlayer; | ||||
| class AnimatedText; | ||||
| 
 | ||||
| typedef std::shared_ptr<Tile> TilePtr; | ||||
| typedef std::shared_ptr<Thing> ThingPtr; | ||||
|  | @ -42,6 +43,7 @@ typedef std::shared_ptr<Effect> EffectPtr; | |||
| typedef std::shared_ptr<Missile> MissilePtr; | ||||
| typedef std::shared_ptr<Player> PlayerPtr; | ||||
| typedef std::shared_ptr<LocalPlayer> LocalPlayerPtr; | ||||
| typedef std::shared_ptr<AnimatedText> AnimatedTextPtr; | ||||
| 
 | ||||
| typedef std::vector<ThingPtr> ThingList; | ||||
| 
 | ||||
|  |  | |||
|  | @ -127,6 +127,14 @@ void Map::draw(const Rect& rect) | |||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     // draw animated text
 | ||||
|     for(auto it = m_animatedTexts.begin(), end = m_animatedTexts.end(); it != end; ++it) { | ||||
|         Point pos = positionTo2D((*it)->getPosition()) - m_drawOffset; | ||||
|         pos.x *= horizontalStretchFactor; | ||||
|         pos.y *= verticalStretchFactor; | ||||
|         (*it)->draw(rect.topLeft() + pos); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void Map::clean() | ||||
|  | @ -225,6 +233,11 @@ void Map::addThing(const ThingPtr& thing, const Position& pos, int stackPos) | |||
|         m_missilesAtFloor[shot->getPosition().z].push_back(shot); | ||||
|         return; | ||||
|     } | ||||
|     else if(AnimatedTextPtr animatedText = thing->asAnimatedText()) { | ||||
|         animatedText->start(); | ||||
|         m_animatedTexts.push_back(animatedText); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     TilePtr tile = getTile(pos); | ||||
|     tile->addThing(thing, stackPos); | ||||
|  | @ -258,6 +271,12 @@ void Map::removeThing(const ThingPtr& thing) | |||
|         } | ||||
|         return; | ||||
|     } | ||||
|     else if(AnimatedTextPtr animatedText = thing->asAnimatedText()) { | ||||
|         auto it = std::find(m_animatedTexts.begin(), m_animatedTexts.end(), animatedText); | ||||
|         if(it != m_animatedTexts.end()) | ||||
|             m_animatedTexts.erase(it); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     if(TilePtr& tile = m_tiles[thing->getPosition()]) | ||||
|         tile->removeThing(thing); | ||||
|  |  | |||
|  | @ -24,6 +24,8 @@ | |||
| #define MAP_H | ||||
| 
 | ||||
| #include "creature.h" | ||||
| #include "animatedtext.h" | ||||
| #include <framework/core/clock.h> | ||||
| #include <framework/graphics/declarations.h> | ||||
| 
 | ||||
| class Map | ||||
|  | @ -76,6 +78,7 @@ private: | |||
|     std::unordered_map<Position, TilePtr, PositionHasher> m_tiles; | ||||
|     std::map<uint32, CreaturePtr> m_creatures; | ||||
|     std::array<std::vector<MissilePtr>, MAX_Z> m_missilesAtFloor; | ||||
|     std::vector<AnimatedTextPtr> m_animatedTexts; | ||||
| 
 | ||||
|     Light m_light; | ||||
|     Position m_centralPosition; | ||||
|  |  | |||
|  | @ -81,3 +81,7 @@ int Thing::getStackPriority() | |||
|     return 5; | ||||
| } | ||||
| 
 | ||||
| ThingType *Thing::getType() | ||||
| { | ||||
|     return g_thingsType.getEmptyThingType(); | ||||
| } | ||||
|  |  | |||
|  | @ -47,7 +47,7 @@ public: | |||
|     uint32 getId() const { return m_id; } | ||||
|     Position getPosition() const { return m_position; } | ||||
|     int getStackPriority(); | ||||
|     virtual ThingType *getType() = 0; | ||||
|     virtual ThingType *getType(); | ||||
|     int getAnimationPhases() { return m_type->dimensions[ThingType::AnimationPhases]; } | ||||
| 
 | ||||
|     void setXPattern(int xPattern) { m_xPattern = xPattern; } | ||||
|  | @ -61,6 +61,7 @@ public: | |||
|     virtual MissilePtr asMissile() { return nullptr; } | ||||
|     virtual PlayerPtr asPlayer() { return nullptr; } | ||||
|     virtual LocalPlayerPtr asLocalPlayer() { return nullptr; } | ||||
|     virtual AnimatedTextPtr asAnimatedText() { return nullptr; } | ||||
| 
 | ||||
| protected: | ||||
|     void internalDraw(const Point& p, int layers); | ||||
|  |  | |||
|  | @ -537,9 +537,16 @@ void ProtocolGame::parseMagicEffect(InputMessage& msg) | |||
| 
 | ||||
| void ProtocolGame::parseAnimatedText(InputMessage& msg) | ||||
| { | ||||
|     parsePosition(msg); // textPos
 | ||||
|     msg.getU8(); // color
 | ||||
|     msg.getString(); // text
 | ||||
|     Position position = parsePosition(msg); | ||||
|     uint8 color = msg.getU8(); | ||||
|     std::string text = msg.getString(); | ||||
| 
 | ||||
|     AnimatedTextPtr animatedText = AnimatedTextPtr(new AnimatedText); | ||||
|     animatedText->setPosition(position); | ||||
|     animatedText->setColor(color); | ||||
|     animatedText->setText(text); | ||||
| 
 | ||||
|     g_map.addThing(animatedText, position); | ||||
| } | ||||
| 
 | ||||
| void ProtocolGame::parseDistanceMissile(InputMessage& msg) | ||||
|  |  | |||
|  | @ -27,6 +27,7 @@ | |||
| #include <otclient/core/tile.h> | ||||
| #include <otclient/core/missile.h> | ||||
| #include <otclient/core/effect.h> | ||||
| #include <otclient/core/animatedtext.h> | ||||
| 
 | ||||
| UIMap::UIMap() | ||||
| { | ||||
|  | @ -72,10 +73,17 @@ bool UIMap::onMousePress(const Point& mousePos, Fw::MouseButton button) | |||
| 
 | ||||
|         // cool testing \/
 | ||||
|         if(button == Fw::MouseLeftButton) { | ||||
|             MissilePtr shot = MissilePtr(new Missile()); | ||||
|             /*MissilePtr shot = MissilePtr(new Missile());
 | ||||
|             shot->setId(1); | ||||
|             shot->setPath(g_map.getCentralPosition(), tilePos); | ||||
|             g_map.addThing(shot, g_map.getCentralPosition()); | ||||
|             g_map.addThing(shot, g_map.getCentralPosition());*/ | ||||
| 
 | ||||
|             AnimatedTextPtr animatedText = AnimatedTextPtr(new AnimatedText); | ||||
|             animatedText->setPosition(g_map.getCentralPosition()); | ||||
|             animatedText->setColor(12); | ||||
|             animatedText->setText("text"); | ||||
| 
 | ||||
|             g_map.addThing(animatedText, g_map.getCentralPosition()); | ||||
|         } | ||||
|         else if(button == Fw::MouseRightButton) { | ||||
|             EffectPtr effect = EffectPtr(new Effect()); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Henrique Santiago
						Henrique Santiago