From d2c3e554dc472a0d6cbf952fc6dbf44d52f5621c Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Sat, 5 Nov 2011 19:37:36 -0200 Subject: [PATCH] remove walk updates from render loop to fix some issues and have better performance --- src/otclient/core/creature.cpp | 91 ++++++++++++++++++++-------------- src/otclient/core/creature.h | 2 + 2 files changed, 55 insertions(+), 38 deletions(-) diff --git a/src/otclient/core/creature.cpp b/src/otclient/core/creature.cpp index ecea5d65..1e80d760 100644 --- a/src/otclient/core/creature.cpp +++ b/src/otclient/core/creature.cpp @@ -29,6 +29,7 @@ #include #include +#include Creature::Creature() : Thing() @@ -45,8 +46,10 @@ Creature::Creature() : Thing() void Creature::draw(int x, int y) { - x += m_walkOffsetX; - y += m_walkOffsetY; + if(m_walking) { + x += m_walkOffsetX; + y += m_walkOffsetY; + } const ThingType& type = getType(); @@ -86,42 +89,6 @@ void Creature::draw(int x, int y) g_graphics.bindColor(Fw::white); } } - - // Update animation and position - if(m_walking && type.animationPhases > 1) { - int elapsedTicks = g_platform.getTicks() - m_walkStartTicks; - int totalPixelsWalked = std::min((int)std::round(elapsedTicks / m_walkTimePerPixel), 32); - - if(m_inverseWalking) { - if(m_direction == Otc::North || m_direction == Otc::NorthEast || m_direction == Otc::NorthWest) - m_walkOffsetY = 32 - totalPixelsWalked; - else if(m_direction == Otc::South || m_direction == Otc::SouthEast || m_direction == Otc::SouthWest) - m_walkOffsetY = totalPixelsWalked - 32; - - if(m_direction == Otc::East || m_direction == Otc::NorthEast || m_direction == Otc::SouthEast) - m_walkOffsetX = totalPixelsWalked - 32; - else if(m_direction == Otc::West || m_direction == Otc::NorthWest || m_direction == Otc::SouthWest) - m_walkOffsetX = 32 - totalPixelsWalked; - - if(m_walkOffsetX == 0 && m_walkOffsetY == 0) - cancelWalk(m_direction); - } - else { - if(m_direction == Otc::North || m_direction == Otc::NorthEast || m_direction == Otc::NorthWest) - m_walkOffsetY = -totalPixelsWalked; - else if(m_direction == Otc::South || m_direction == Otc::SouthEast || m_direction == Otc::SouthWest) - m_walkOffsetY = totalPixelsWalked; - - if(m_direction == Otc::East || m_direction == Otc::NorthEast || m_direction == Otc::SouthEast) - m_walkOffsetX = totalPixelsWalked; - else if(m_direction == Otc::West || m_direction == Otc::NorthWest || m_direction == Otc::SouthWest) - m_walkOffsetX = -totalPixelsWalked; - } - - int totalWalkTileTicks = (int)m_walkTimePerPixel*32; - m_animation = (g_platform.getTicks() % totalWalkTileTicks) / (totalWalkTileTicks / (type.animationPhases - 1)) + 1; - } else - m_animation = 0; } void Creature::drawInformation(int x, int y, bool useGray, const Rect& rect) @@ -225,6 +192,9 @@ void Creature::walk(const Position& position, bool inverse) else { // Teleport // we teleported, dont walk or change direction m_walking = false; + m_walkOffsetX = 0; + m_walkOffsetY = 0; + m_animation = 0; } if(!m_inverseWalking) { @@ -257,12 +227,57 @@ void Creature::walk(const Position& position, bool inverse) m_walkTimePerPixel = walkTime / 32.0; if(!sameWalk) m_walkStartTicks = g_platform.getTicks(); + + g_dispatcher.scheduleEvent(std::bind(&Creature::updateWalk, asCreature()), m_walkTimePerPixel); + } +} + +void Creature::updateWalk() +{ + const ThingType& type = getType(); + if(m_walking) { + int elapsedTicks = g_platform.getTicks() - m_walkStartTicks; + int totalPixelsWalked = std::min((int)std::round(elapsedTicks / m_walkTimePerPixel), 32); + + if(m_inverseWalking) { + if(m_direction == Otc::North || m_direction == Otc::NorthEast || m_direction == Otc::NorthWest) + m_walkOffsetY = 32 - totalPixelsWalked; + else if(m_direction == Otc::South || m_direction == Otc::SouthEast || m_direction == Otc::SouthWest) + m_walkOffsetY = totalPixelsWalked - 32; + + if(m_direction == Otc::East || m_direction == Otc::NorthEast || m_direction == Otc::SouthEast) + m_walkOffsetX = totalPixelsWalked - 32; + else if(m_direction == Otc::West || m_direction == Otc::NorthWest || m_direction == Otc::SouthWest) + m_walkOffsetX = 32 - totalPixelsWalked; + + if(m_walkOffsetX == 0 && m_walkOffsetY == 0) + cancelWalk(m_direction); + } + else { + if(m_direction == Otc::North || m_direction == Otc::NorthEast || m_direction == Otc::NorthWest) + m_walkOffsetY = -totalPixelsWalked; + else if(m_direction == Otc::South || m_direction == Otc::SouthEast || m_direction == Otc::SouthWest) + m_walkOffsetY = totalPixelsWalked; + + if(m_direction == Otc::East || m_direction == Otc::NorthEast || m_direction == Otc::SouthEast) + m_walkOffsetX = totalPixelsWalked; + else if(m_direction == Otc::West || m_direction == Otc::NorthWest || m_direction == Otc::SouthWest) + m_walkOffsetX = -totalPixelsWalked; + } + + int totalWalkTileTicks = (int)m_walkTimePerPixel*32; + m_animation = (g_platform.getTicks() % totalWalkTileTicks) / (totalWalkTileTicks / (type.animationPhases - 1)) + 1; + g_dispatcher.scheduleEvent(std::bind(&Creature::updateWalk, asCreature()), m_walkTimePerPixel); + + if(totalPixelsWalked == 32) + cancelWalk(m_direction); } } void Creature::cancelWalk(Otc::Direction direction) { m_walking = false; + m_walkStartTicks = 0; m_walkOffsetX = 0; m_walkOffsetY = 0; m_animation = 0; diff --git a/src/otclient/core/creature.h b/src/otclient/core/creature.h index b6470493..2081c224 100644 --- a/src/otclient/core/creature.h +++ b/src/otclient/core/creature.h @@ -80,6 +80,8 @@ public: CreaturePtr asCreature() { return std::static_pointer_cast(shared_from_this()); } protected: + void updateWalk(); + std::string m_name; uint8 m_healthPercent; Otc::Direction m_direction;