From 37a6a38ca64632c8d0016ff4bbeeb66cef9a2a07 Mon Sep 17 00:00:00 2001 From: Henrique Santiago Date: Mon, 26 Dec 2011 04:14:57 -0200 Subject: [PATCH] some reworks --- src/framework/graphics/particle.cpp | 52 +++++++++++++---- src/framework/graphics/particle.h | 2 + src/otclient/const.h | 3 +- src/otclient/core/creature.cpp | 83 +++++++++++++------------- src/otclient/core/creature.h | 1 - src/otclient/core/effect.cpp | 22 ++++++- src/otclient/core/missile.cpp | 90 +++++++++++------------------ src/otclient/ui/uimap.cpp | 17 ++++++ src/otclient/util/position.h | 42 ++++++++++++++ 9 files changed, 196 insertions(+), 116 deletions(-) diff --git a/src/framework/graphics/particle.cpp b/src/framework/graphics/particle.cpp index ed3bfd7f..43ed876c 100644 --- a/src/framework/graphics/particle.cpp +++ b/src/framework/graphics/particle.cpp @@ -65,34 +65,61 @@ void Particle::update(double elapsedTime) } updateColor(); + updateSize(); + updatePosition(elapsedTime); - // update size - m_size = m_startSize + (m_finalSize - m_startSize) / m_duration * m_elapsedTime; + m_elapsedTime += elapsedTime; +} + +void Particle::updatePosition(double elapsedTime) +{ + bool mustRedraw = false; - // update position if(m_ignorePhysicsAfter < 0 || m_elapsedTime < m_ignorePhysicsAfter ) { // update position PointF delta = m_velocity * elapsedTime; delta.y *= -1; // painter orientate Y axis in the inverse direction - m_position += delta; + + PointF position = m_position + delta; + + if(m_position != position) { + mustRedraw = true; + m_position += delta; + } // update acceleration m_velocity += m_acceleration * elapsedTime; } m_rect.moveTo((int)m_position.x - m_size.width() / 2, (int)m_position.y - m_size.height() / 2); - m_rect.resize(m_size); +} - m_elapsedTime += elapsedTime; +void Particle::updateSize() +{ + bool mustRedraw = false; + + Size size = m_startSize + (m_finalSize - m_startSize) / m_duration * m_elapsedTime; + if(m_size != size) { + mustRedraw = true; + m_size = size; + } + + m_rect.resize(m_size); } void Particle::updateColor() { + bool mustRedraw = false; + if(m_elapsedTime < m_colorsStops[1]) { - m_color.setRGBA(m_colors[0].r() + (m_colors[1].r() - m_colors[0].r()) / (m_colorsStops[1] - m_colorsStops[0]) * (m_elapsedTime - m_colorsStops[0]), - m_colors[0].g() + (m_colors[1].g() - m_colors[0].g()) / (m_colorsStops[1] - m_colorsStops[0]) * (m_elapsedTime - m_colorsStops[0]), - m_colors[0].b() + (m_colors[1].b() - m_colors[0].b()) / (m_colorsStops[1] - m_colorsStops[0]) * (m_elapsedTime - m_colorsStops[0]), - m_colors[0].a() + (m_colors[1].a() - m_colors[0].a()) / (m_colorsStops[1] - m_colorsStops[0]) * (m_elapsedTime - m_colorsStops[0])); + Color color = Color(m_colors[0].r() + (m_colors[1].r() - m_colors[0].r()) / (m_colorsStops[1] - m_colorsStops[0]) * (m_elapsedTime - m_colorsStops[0]), + m_colors[0].g() + (m_colors[1].g() - m_colors[0].g()) / (m_colorsStops[1] - m_colorsStops[0]) * (m_elapsedTime - m_colorsStops[0]), + m_colors[0].b() + (m_colors[1].b() - m_colors[0].b()) / (m_colorsStops[1] - m_colorsStops[0]) * (m_elapsedTime - m_colorsStops[0]), + m_colors[0].a() + (m_colors[1].a() - m_colors[0].a()) / (m_colorsStops[1] - m_colorsStops[0]) * (m_elapsedTime - m_colorsStops[0])); + if(m_color != color) { + mustRedraw = true; + m_color = color; + } } else { if(m_colors.size() > 1) { @@ -100,7 +127,10 @@ void Particle::updateColor() m_colorsStops.erase(m_colorsStops.begin()); } else { - m_color = m_colors[0]; + if(m_color != m_colors[0]) { + mustRedraw = true; + m_color = m_colors[0]; + } } } } diff --git a/src/framework/graphics/particle.h b/src/framework/graphics/particle.h index 8ad30bbe..90e02ea8 100644 --- a/src/framework/graphics/particle.h +++ b/src/framework/graphics/particle.h @@ -44,6 +44,8 @@ public: private: void updateColor(); + void updatePosition(double elapsedTime); + void updateSize(); Color m_color; std::vector m_colors; diff --git a/src/otclient/const.h b/src/otclient/const.h index 150d209e..32273cb8 100644 --- a/src/otclient/const.h +++ b/src/otclient/const.h @@ -304,7 +304,8 @@ namespace Otc NorthEast, SouthEast, SouthWest, - NorthWest + NorthWest, + InvalidDirection }; enum FluidsColor { diff --git a/src/otclient/core/creature.cpp b/src/otclient/core/creature.cpp index a55a1f57..e6acb52d 100644 --- a/src/otclient/core/creature.cpp +++ b/src/otclient/core/creature.cpp @@ -43,6 +43,7 @@ Creature::Creature() : Thing() m_walkTimePerPixel = 1000.0/32.0; m_walking = false; + m_inverseWalking = true; m_informationFont = g_fonts.getFont("verdana-11px-rounded"); } @@ -173,45 +174,42 @@ void Creature::walk(const Position& position, bool inverse) int walkTimeFactor = 1; // set new direction - if(m_position + Position(0, -1, 0) == position) { - setDirection(Otc::North); - m_walkOffset.y = 32; - } - else if(m_position + Position(1, 0, 0) == position) { - setDirection(Otc::East); - m_walkOffset.x = -32; - } - else if(m_position + Position(0, 1, 0) == position) { - setDirection(Otc::South); - m_walkOffset.y = -32; - } - else if(m_position + Position(-1, 0, 0) == position) { - setDirection(Otc::West); - m_walkOffset.x = 32; - } - else if(m_position + Position(1, -1, 0) == position) { - setDirection(Otc::NorthEast); - m_walkOffset.x = -32; - m_walkOffset.y = 32; - walkTimeFactor = 2; - } - else if(m_position + Position(1, 1, 0) == position) { - setDirection(Otc::SouthEast); - m_walkOffset.x = -32; - m_walkOffset.y = -32; - walkTimeFactor = 2; - } - else if(m_position + Position(-1, 1, 0) == position) { - setDirection(Otc::SouthWest); - m_walkOffset.x = 32; - m_walkOffset.y = -32; - walkTimeFactor = 2; - } - else if(m_position + Position(-1, -1, 0) == position) { - setDirection(Otc::NorthWest); - m_walkOffset.x = 32; - m_walkOffset.y = 32; - walkTimeFactor = 2; + if(m_position.isInRange(position, 1, 1, 0)) { + Otc::Direction direction = m_position.getDirectionFromPosition(position); + setDirection(direction); + + if(direction == Otc::NorthWest) { + m_walkOffset.x = 32; + m_walkOffset.y = 32; + walkTimeFactor = 2; + } + else if(direction == Otc::North) { + m_walkOffset.y = 32; + } + else if(direction == Otc::NorthEast) { + m_walkOffset.x = -32; + m_walkOffset.y = 32; + walkTimeFactor = 2; + } + else if(direction == Otc::East) { + m_walkOffset.x = -32; + } + else if(direction == Otc::SouthEast) { + m_walkOffset.x = -32; + m_walkOffset.y = -32; + walkTimeFactor = 2; + } + else if(direction == Otc::South) { + m_walkOffset.y = -32; + } + else if(direction == Otc::SouthWest) { + m_walkOffset.x = 32; + m_walkOffset.y = -32; + walkTimeFactor = 2; + } + else if(direction == Otc::West) { + m_walkOffset.x = 32; + } } else { // Teleport // we teleported, dont walk or change direction @@ -260,9 +258,6 @@ void Creature::updateWalk() m_walkOffset.x = totalPixelsWalked - 32; else if(m_direction == Otc::West || m_direction == Otc::NorthWest || m_direction == Otc::SouthWest) m_walkOffset.x = 32 - totalPixelsWalked; - - if(m_walkOffset.x == 0 && m_walkOffset.y == 0) - cancelWalk(m_direction); } else { if(m_direction == Otc::North || m_direction == Otc::NorthEast || m_direction == Otc::NorthWest) @@ -281,10 +276,12 @@ void Creature::updateWalk() m_animation = (g_clock.ticks() % totalWalkTileTicks) / (totalWalkTileTicks / (m_type->dimensions[ThingType::AnimationPhases] - 1)) + 1; else m_animation = 0; - g_dispatcher.scheduleEvent(std::bind(&Creature::updateWalk, asCreature()), m_walkTimePerPixel); + if(totalPixelsWalked == 32) cancelWalk(m_direction); + else + g_dispatcher.scheduleEvent(std::bind(&Creature::updateWalk, asCreature()), m_walkTimePerPixel); } } diff --git a/src/otclient/core/creature.h b/src/otclient/core/creature.h index 96899250..fae32534 100644 --- a/src/otclient/core/creature.h +++ b/src/otclient/core/creature.h @@ -91,7 +91,6 @@ protected: ticks_t m_walkStartTicks; bool m_walking, m_inverseWalking; float m_walkTimePerPixel; - Position m_walkingFromPosition; Point m_walkOffset; }; diff --git a/src/otclient/core/effect.cpp b/src/otclient/core/effect.cpp index ce891f0e..5f36eefd 100644 --- a/src/otclient/core/effect.cpp +++ b/src/otclient/core/effect.cpp @@ -33,12 +33,22 @@ Effect::Effect() : Thing() } void Effect::draw(const Point& p) +{ + internalDraw(p, 0); +} + +void Effect::updateAnimation() { int animationPhase = (g_clock.ticks() - m_animationStartTicks) / TICKS_PER_FRAME; - if(animationPhase < getAnimationPhases()) { + if(animationPhase < getAnimationPhases()) m_animation = animationPhase; - internalDraw(p, 0); + + if(animationPhase < getAnimationPhases() - 1) { + auto self = asEffect(); + g_dispatcher.scheduleEvent([self]() { + self->updateAnimation(); + }, TICKS_PER_FRAME); } } @@ -46,8 +56,14 @@ void Effect::startAnimation() { m_animationStartTicks = g_clock.ticks(); - // schedule removal auto self = asEffect(); + + // schedule update + g_dispatcher.scheduleEvent([self]() { + self->updateAnimation(); + }, TICKS_PER_FRAME); + + // schedule removal g_dispatcher.scheduleEvent([self]() { g_map.getTile(self->getPosition())->removeEffect(self); }, TICKS_PER_FRAME * getAnimationPhases()); diff --git a/src/otclient/core/missile.cpp b/src/otclient/core/missile.cpp index 014c6697..cd185479 100644 --- a/src/otclient/core/missile.cpp +++ b/src/otclient/core/missile.cpp @@ -40,75 +40,51 @@ void Missile::draw(const Point& p) void Missile::setPath(const Position& fromPosition, const Position& toPosition) { - m_position = fromPosition; - m_positionDelta = toPosition - fromPosition; + Otc::Direction direction = fromPosition.getDirectionFromPosition(toPosition); - if(m_positionDelta.x == 0 && m_positionDelta.y == 0) { + if(direction == Otc::NorthWest) { + m_xPattern = 0; + m_yPattern = 0; + } + else if(direction == Otc::North) { m_xPattern = 1; + m_yPattern = 0; + } + else if(direction == Otc::NorthEast) { + m_xPattern = 2; + m_yPattern = 0; + } + else if(direction == Otc::East) { + m_xPattern = 2; m_yPattern = 1; } - else if(m_positionDelta.x == 0) { + else if(direction == Otc::SouthEast) { + m_xPattern = 2; + m_yPattern = 2; + } + else if(direction == Otc::South) { m_xPattern = 1; - if(m_positionDelta.y < 0) { - m_yPattern = 0; - } - else if(m_positionDelta.y > 0) { - m_yPattern = 2; - } + m_yPattern = 2; } - else if(m_positionDelta.y == 0) { + else if(direction == Otc::SouthWest) { + m_xPattern = 0; + m_yPattern = 2; + } + else if(direction == Otc::West) { + m_xPattern = 0; m_yPattern = 1; - if(m_positionDelta.x < 0) { - m_xPattern = 0; - } - else if(m_positionDelta.x > 0) { - m_xPattern = 2; - } } else { - float angle = std::atan2(m_positionDelta.y * -1, m_positionDelta.x) * 180.0 / 3.141592; - if(angle < 0) - angle += 360; - - if(angle >= 360 - 22.5 || angle < 0 + 22.5) { - m_xPattern = 2; - m_yPattern = 1; - } - else if(angle >= 45 - 22.5 && angle < 45 + 22.5) { - m_xPattern = 2; - m_yPattern = 0; - } - else if(angle >= 90 - 22.5 && angle < 90 + 22.5) { - m_xPattern = 1; - m_yPattern = 0; - } - else if(angle >= 135 - 22.5 && angle < 135 + 22.5) { - m_xPattern = 0; - m_yPattern = 0; - } - else if(angle >= 180 - 22.5 && angle < 180 + 22.5) { - m_xPattern = 0; - m_yPattern = 1; - } - else if(angle >= 225 - 22.5 && angle < 225 + 22.5) { - m_xPattern = 0; - m_yPattern = 2; - } - else if(angle >= 270 - 22.5 && angle < 270 + 22.5) { - m_xPattern = 1; - m_yPattern = 2; - } - else if(angle >= 315 - 22.5 && angle < 315 + 22.5) { - m_xPattern = 2; - m_yPattern = 2; - } + m_xPattern = 1; + m_yPattern = 1; } - m_duration = 150 * std::sqrt(Point(m_positionDelta.x, m_positionDelta.y).length()); - m_positionDelta.x *= 32; - m_positionDelta.y *= 32; - + m_position = fromPosition; + m_positionDelta = toPosition - fromPosition; m_startTicks = g_clock.ticks(); + m_duration = 150 * std::sqrt(Point(m_positionDelta.x, m_positionDelta.y).length()); + m_positionDelta.x *= Map::NUM_TILE_PIXELS; + m_positionDelta.y *= Map::NUM_TILE_PIXELS; // schedule removal auto self = asMissile(); diff --git a/src/otclient/ui/uimap.cpp b/src/otclient/ui/uimap.cpp index 2359b539..79b746dc 100644 --- a/src/otclient/ui/uimap.cpp +++ b/src/otclient/ui/uimap.cpp @@ -25,6 +25,8 @@ #include #include #include +#include +#include UIMap::UIMap() { @@ -67,6 +69,21 @@ bool UIMap::onMousePress(const Point& mousePos, Fw::MouseButton button) TilePtr tile = g_map.getTile(tilePos); if(tile) tile->useItem(); + + // cool testing \/ + if(button == Fw::MouseLeftButton) { + MissilePtr shot = MissilePtr(new Missile()); + shot->setId(1); + shot->setPath(g_map.getCentralPosition(), tilePos); + g_map.addThing(shot, g_map.getCentralPosition()); + } + else if(button == Fw::MouseRightButton) { + EffectPtr effect = EffectPtr(new Effect()); + effect->setId(6); + effect->startAnimation(); + if(tile) + tile->addEffect(effect); + } } return UIWidget::onMousePress(mousePos, button); diff --git a/src/otclient/util/position.h b/src/otclient/util/position.h index fdd5a416..7e395c54 100644 --- a/src/otclient/util/position.h +++ b/src/otclient/util/position.h @@ -56,6 +56,48 @@ public: } } + Otc::Direction getDirectionFromPosition(const Position& position) const { + Position positionDelta = position - *this; + + if(positionDelta.x == 0 && positionDelta.y == 0) + return Otc::InvalidDirection; + else if(positionDelta.x == 0) { + if(positionDelta.y < 0) + return Otc::North; + else if(positionDelta.y > 0) + return Otc::South; + } + else if(positionDelta.y == 0) { + if(positionDelta.x < 0) + return Otc::West; + else if(positionDelta.x > 0) + return Otc::East; + } + else { + float angle = std::atan2(positionDelta.y * -1, positionDelta.x) * 180.0 / 3.141592; + if(angle < 0) + angle += 360; + + if(angle >= 360 - 22.5 || angle < 0 + 22.5) + return Otc::East; + else if(angle >= 45 - 22.5 && angle < 45 + 22.5) + return Otc::NorthEast; + else if(angle >= 90 - 22.5 && angle < 90 + 22.5) + return Otc::North; + else if(angle >= 135 - 22.5 && angle < 135 + 22.5) + return Otc::NorthWest; + else if(angle >= 180 - 22.5 && angle < 180 + 22.5) + return Otc::West; + else if(angle >= 225 - 22.5 && angle < 225 + 22.5) + return Otc::SouthWest; + else if(angle >= 270 - 22.5 && angle < 270 + 22.5) + return Otc::South; + else if(angle >= 315 - 22.5 && angle < 315 + 22.5) + return Otc::SouthEast; + } + return Otc::InvalidDirection; + } + bool isValid() const { return x >= 0 && y >= 0 && z >= 0 && x < 65536 && y < 65536 && z < 15; } Position operator+(const Position& other) const { return Position(x + other.x, y + other.y, z + other.z); }