more rework

This commit is contained in:
Henrique Santiago 2011-12-27 00:18:15 -02:00
parent 5830a3dc3e
commit df0f2febe6
15 changed files with 70 additions and 53 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;
} }

View File

@ -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);

View File

@ -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();

View File

@ -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)

View File

@ -47,7 +47,6 @@ public:
private: private:
int m_data; int m_data;
ticks_t m_lastTicks;
}; };
#endif #endif

View File

@ -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)

View File

@ -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);
} }

View File

@ -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;

View File

@ -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;

View File

@ -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");

View File

@ -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);
} }

View File

@ -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;