more rework
This commit is contained in:
parent
5830a3dc3e
commit
df0f2febe6
|
@ -25,6 +25,8 @@
|
||||||
|
|
||||||
#include "util/types.h"
|
#include "util/types.h"
|
||||||
|
|
||||||
|
#define DEG_TO_RAD (acos(-1)/180.0)
|
||||||
|
|
||||||
namespace Fw
|
namespace Fw
|
||||||
{
|
{
|
||||||
static const double pi = 3.14159265;
|
static const double pi = 3.14159265;
|
||||||
|
|
|
@ -24,8 +24,6 @@
|
||||||
#include "particleaffector.h"
|
#include "particleaffector.h"
|
||||||
#include <framework/core/clock.h>
|
#include <framework/core/clock.h>
|
||||||
|
|
||||||
#define DEG_TO_RAD (acos(-1)/180.0)
|
|
||||||
|
|
||||||
ParticleAffector::ParticleAffector()
|
ParticleAffector::ParticleAffector()
|
||||||
{
|
{
|
||||||
m_active = false;
|
m_active = false;
|
||||||
|
|
|
@ -27,8 +27,6 @@
|
||||||
#include <framework/graphics/texturemanager.h>
|
#include <framework/graphics/texturemanager.h>
|
||||||
#include <framework/util/tools.h>
|
#include <framework/util/tools.h>
|
||||||
|
|
||||||
#define DEG_TO_RAD (acos(-1)/180.0)
|
|
||||||
|
|
||||||
ParticleEmitter::ParticleEmitter(const ParticleSystemPtr& parent)
|
ParticleEmitter::ParticleEmitter(const ParticleSystemPtr& parent)
|
||||||
{
|
{
|
||||||
m_parent = parent;
|
m_parent = parent;
|
||||||
|
|
|
@ -45,7 +45,7 @@ void AnimatedText::start()
|
||||||
|
|
||||||
void AnimatedText::draw(const Point& p)
|
void AnimatedText::draw(const Point& p)
|
||||||
{
|
{
|
||||||
assert(m_font);
|
if(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);
|
m_font->renderText(m_text, Rect(p + Point(0, -20.0 * g_clock.timeElapsed(m_startTime) / (DURATION / 1000)), m_textSize), Fw::AlignTopCenter, m_color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,6 +56,7 @@ void AnimatedText::setColor(int color)
|
||||||
|
|
||||||
void AnimatedText::setText(const std::string& text)
|
void AnimatedText::setText(const std::string& text)
|
||||||
{
|
{
|
||||||
|
if(m_font)
|
||||||
m_textSize = m_font->calculateTextRectSize(text);
|
m_textSize = m_font->calculateTextRectSize(text);
|
||||||
m_text = text;
|
m_text = text;
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,25 @@ Effect::Effect() : Thing()
|
||||||
m_animationStartTicks = 0;
|
m_animationStartTicks = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Effect::start()
|
||||||
|
{
|
||||||
|
m_animationStartTicks = g_clock.ticks();
|
||||||
|
|
||||||
|
auto self = asEffect();
|
||||||
|
|
||||||
|
// schedule update
|
||||||
|
if(getAnimationPhases() > 1) {
|
||||||
|
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());
|
||||||
|
}
|
||||||
|
|
||||||
void Effect::draw(const Point& p)
|
void Effect::draw(const Point& p)
|
||||||
{
|
{
|
||||||
internalDraw(p, 0);
|
internalDraw(p, 0);
|
||||||
|
@ -52,23 +71,6 @@ void Effect::updateAnimation()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Effect::startAnimation()
|
|
||||||
{
|
|
||||||
m_animationStartTicks = g_clock.ticks();
|
|
||||||
|
|
||||||
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());
|
|
||||||
}
|
|
||||||
|
|
||||||
ThingType *Effect::getType()
|
ThingType *Effect::getType()
|
||||||
{
|
{
|
||||||
return g_thingsType.getThingType(m_id, ThingsType::Effect);
|
return g_thingsType.getThingType(m_id, ThingsType::Effect);
|
||||||
|
|
|
@ -37,7 +37,7 @@ public:
|
||||||
|
|
||||||
void draw(const Point& p);
|
void draw(const Point& p);
|
||||||
|
|
||||||
void startAnimation();
|
void start();
|
||||||
void updateAnimation();
|
void updateAnimation();
|
||||||
|
|
||||||
ThingType *getType();
|
ThingType *getType();
|
||||||
|
|
|
@ -25,11 +25,11 @@
|
||||||
#include "spritemanager.h"
|
#include "spritemanager.h"
|
||||||
#include "thing.h"
|
#include "thing.h"
|
||||||
#include <framework/core/clock.h>
|
#include <framework/core/clock.h>
|
||||||
|
#include <framework/core/eventdispatcher.h>
|
||||||
|
|
||||||
Item::Item() : Thing()
|
Item::Item() : Thing()
|
||||||
{
|
{
|
||||||
m_data = 0;
|
m_data = 0;
|
||||||
m_lastTicks = g_clock.ticks();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Item::draw(const Point& p)
|
void Item::draw(const Point& p)
|
||||||
|
|
|
@ -47,7 +47,6 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int m_data;
|
int m_data;
|
||||||
ticks_t m_lastTicks;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -229,7 +229,16 @@ void Map::addThing(const ThingPtr& thing, const Position& pos, int stackPos)
|
||||||
if(!thing)
|
if(!thing)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(MissilePtr shot = thing->asMissile()) {
|
TilePtr tile = getTile(pos);
|
||||||
|
|
||||||
|
if(CreaturePtr creature = thing->asCreature()) {
|
||||||
|
tile->addThing(thing, stackPos);
|
||||||
|
m_creatures[creature->getId()] = creature;
|
||||||
|
}
|
||||||
|
else if(EffectPtr effect = thing->asEffect()) {
|
||||||
|
tile->addEffect(effect);
|
||||||
|
}
|
||||||
|
else if(MissilePtr shot = thing->asMissile()) {
|
||||||
m_missilesAtFloor[shot->getPosition().z].push_back(shot);
|
m_missilesAtFloor[shot->getPosition().z].push_back(shot);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -238,12 +247,11 @@ void Map::addThing(const ThingPtr& thing, const Position& pos, int stackPos)
|
||||||
m_animatedTexts.push_back(animatedText);
|
m_animatedTexts.push_back(animatedText);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
TilePtr tile = getTile(pos);
|
|
||||||
tile->addThing(thing, stackPos);
|
tile->addThing(thing, stackPos);
|
||||||
|
}
|
||||||
|
|
||||||
if(CreaturePtr creature = thing->asCreature())
|
thing->start();
|
||||||
m_creatures[creature->getId()] = creature;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ThingPtr Map::getThing(const Position& pos, int stackPos)
|
ThingPtr Map::getThing(const Position& pos, int stackPos)
|
||||||
|
|
|
@ -34,26 +34,18 @@ Thing::Thing() : m_id(0)
|
||||||
m_type = g_thingsType.getEmptyThingType();
|
m_type = g_thingsType.getEmptyThingType();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Thing::internalDraw(const Point& p, int layers)
|
void Thing::internalDraw(const Point& p, int layer)
|
||||||
{
|
{
|
||||||
for(int yi = 0; yi < m_type->dimensions[ThingType::Height]; yi++) {
|
for(int h = 0; h < m_type->dimensions[ThingType::Height]; h++) {
|
||||||
for(int xi = 0; xi < m_type->dimensions[ThingType::Width]; xi++) {
|
for(int w = 0; w < m_type->dimensions[ThingType::Width]; w++) {
|
||||||
int sprIndex = ((((((m_animation % m_type->dimensions[ThingType::AnimationPhases])
|
int spriteId = m_type->getSpriteId(w, h, layer, m_xPattern, m_yPattern, m_zPattern, m_animation);
|
||||||
* m_type->dimensions[ThingType::PatternZ] + m_zPattern)
|
|
||||||
* m_type->dimensions[ThingType::PatternY] + m_yPattern)
|
|
||||||
* m_type->dimensions[ThingType::PatternX] + m_xPattern)
|
|
||||||
* m_type->dimensions[ThingType::Layers] + layers)
|
|
||||||
* m_type->dimensions[ThingType::Height] + yi)
|
|
||||||
* m_type->dimensions[ThingType::Width] + xi;
|
|
||||||
|
|
||||||
int spriteId = m_type->sprites[sprIndex];
|
|
||||||
if(!spriteId)
|
if(!spriteId)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
TexturePtr spriteTex = g_sprites.getSpriteTexture(spriteId);
|
TexturePtr spriteTex = g_sprites.getSpriteTexture(spriteId);
|
||||||
|
|
||||||
Rect drawRect((p.x - xi*32) - m_type->parameters[ThingType::DisplacementX],
|
Rect drawRect((p.x - w*32) - m_type->parameters[ThingType::DisplacementX],
|
||||||
(p.y - yi*32) - m_type->parameters[ThingType::DisplacementY],
|
(p.y - h*32) - m_type->parameters[ThingType::DisplacementY],
|
||||||
32, 32);
|
32, 32);
|
||||||
g_painter.drawTexturedRect(drawRect, spriteTex);
|
g_painter.drawTexturedRect(drawRect, spriteTex);
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,8 @@ public:
|
||||||
Thing();
|
Thing();
|
||||||
virtual ~Thing() { }
|
virtual ~Thing() { }
|
||||||
|
|
||||||
|
virtual void start() {}
|
||||||
|
|
||||||
virtual void draw(const Point& p) = 0;
|
virtual void draw(const Point& p) = 0;
|
||||||
|
|
||||||
void setId(uint32 id);
|
void setId(uint32 id);
|
||||||
|
@ -64,7 +66,7 @@ public:
|
||||||
virtual AnimatedTextPtr asAnimatedText() { return nullptr; }
|
virtual AnimatedTextPtr asAnimatedText() { return nullptr; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void internalDraw(const Point& p, int layers);
|
void internalDraw(const Point& p, int layer);
|
||||||
|
|
||||||
uint32 m_id;
|
uint32 m_id;
|
||||||
Position m_position;
|
Position m_position;
|
||||||
|
|
|
@ -103,6 +103,22 @@ struct ThingType
|
||||||
LastParameter
|
LastParameter
|
||||||
};
|
};
|
||||||
std::array<int, LastParameter> parameters;
|
std::array<int, LastParameter> parameters;
|
||||||
|
|
||||||
|
int getSpriteId(int w, int h, int l, int x, int y, int z, int a)
|
||||||
|
{
|
||||||
|
int sprIndex = ((((((a % dimensions[ThingType::AnimationPhases])
|
||||||
|
* dimensions[ThingType::PatternZ] + z)
|
||||||
|
* dimensions[ThingType::PatternY] + y)
|
||||||
|
* dimensions[ThingType::PatternX] + x)
|
||||||
|
* dimensions[ThingType::Layers] + l)
|
||||||
|
* dimensions[ThingType::Height] + h)
|
||||||
|
* dimensions[ThingType::Width] + w;
|
||||||
|
|
||||||
|
if(sprIndex >= 0 && sprIndex < (int)sprites.size())
|
||||||
|
return sprites[sprIndex];
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::vector<ThingType> ThingTypeList;
|
typedef std::vector<ThingType> ThingTypeList;
|
||||||
|
|
|
@ -526,10 +526,9 @@ void ProtocolGame::parseMagicEffect(InputMessage& msg)
|
||||||
if(effectId != 37) {
|
if(effectId != 37) {
|
||||||
EffectPtr effect = EffectPtr(new Effect());
|
EffectPtr effect = EffectPtr(new Effect());
|
||||||
effect->setId(effectId);
|
effect->setId(effectId);
|
||||||
effect->startAnimation();
|
effect->setPosition(pos);
|
||||||
|
|
||||||
TilePtr tile = g_map.getTile(pos);
|
g_map.addThing(effect, pos);
|
||||||
tile->addEffect(effect);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
g_particleManager.load("particle.otpa");
|
g_particleManager.load("particle.otpa");
|
||||||
|
|
|
@ -88,7 +88,7 @@ bool UIMap::onMousePress(const Point& mousePos, Fw::MouseButton button)
|
||||||
else if(button == Fw::MouseRightButton) {
|
else if(button == Fw::MouseRightButton) {
|
||||||
EffectPtr effect = EffectPtr(new Effect());
|
EffectPtr effect = EffectPtr(new Effect());
|
||||||
effect->setId(6);
|
effect->setId(6);
|
||||||
effect->startAnimation();
|
effect->start();
|
||||||
if(tile)
|
if(tile)
|
||||||
tile->addEffect(effect);
|
tile->addEffect(effect);
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,7 +74,7 @@ public:
|
||||||
return Otc::East;
|
return Otc::East;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
float angle = std::atan2(positionDelta.y * -1, positionDelta.x) * 180.0 / 3.141592;
|
float angle = std::atan2(positionDelta.y * -1, positionDelta.x) * DEG_TO_RAD;
|
||||||
if(angle < 0)
|
if(angle < 0)
|
||||||
angle += 360;
|
angle += 360;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue