some reworks
This commit is contained in:
parent
3abbf5255e
commit
37a6a38ca6
|
@ -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];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -44,6 +44,8 @@ public:
|
|||
|
||||
private:
|
||||
void updateColor();
|
||||
void updatePosition(double elapsedTime);
|
||||
void updateSize();
|
||||
|
||||
Color m_color;
|
||||
std::vector<Color> m_colors;
|
||||
|
|
|
@ -304,7 +304,8 @@ namespace Otc
|
|||
NorthEast,
|
||||
SouthEast,
|
||||
SouthWest,
|
||||
NorthWest
|
||||
NorthWest,
|
||||
InvalidDirection
|
||||
};
|
||||
|
||||
enum FluidsColor {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -91,7 +91,6 @@ protected:
|
|||
ticks_t m_walkStartTicks;
|
||||
bool m_walking, m_inverseWalking;
|
||||
float m_walkTimePerPixel;
|
||||
Position m_walkingFromPosition;
|
||||
Point m_walkOffset;
|
||||
};
|
||||
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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) {
|
||||
m_xPattern = 1;
|
||||
if(m_positionDelta.y < 0) {
|
||||
m_yPattern = 0;
|
||||
}
|
||||
else if(m_positionDelta.y > 0) {
|
||||
m_yPattern = 2;
|
||||
}
|
||||
else if(direction == Otc::SouthEast) {
|
||||
m_xPattern = 2;
|
||||
m_yPattern = 2;
|
||||
}
|
||||
else if(m_positionDelta.y == 0) {
|
||||
else if(direction == Otc::South) {
|
||||
m_xPattern = 1;
|
||||
m_yPattern = 2;
|
||||
}
|
||||
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();
|
||||
|
|
|
@ -25,6 +25,8 @@
|
|||
#include <framework/otml/otml.h>
|
||||
#include <framework/graphics/graphics.h>
|
||||
#include <otclient/core/tile.h>
|
||||
#include <otclient/core/missile.h>
|
||||
#include <otclient/core/effect.h>
|
||||
|
||||
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);
|
||||
|
|
|
@ -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); }
|
||||
|
|
Loading…
Reference in New Issue