separator fix, fix draw outside map

This commit is contained in:
Henrique Santiago 2012-01-05 16:34:37 -02:00
parent 4620f71444
commit 1b83126ed5
20 changed files with 49 additions and 38 deletions

View File

@ -23,9 +23,8 @@ function Game.createThingMenu(menuPosition, lookThing, useThing, creatureThing)
menu:addOption('Rotate', function() Game.rotate(useThing) end)
end
menu:addSeparator()
if not useThing:isNotMoveable() and useThing:isPickupable() then
menu:addSeparator()
menu:addOption('Trade with ...', function() print('trade with') end)
end
end

View File

@ -159,6 +159,12 @@ public:
return true;
}
bool contains(const TRect<T> &r, bool insideOnly = false) const {
if(contains(r.topLeft(), insideOnly) && contains(r.bottomRight(), insideOnly))
return true;
return false;
}
bool intersects(const TRect<T> &r) const {
if(isNull() || r.isNull())
return false;

View File

@ -43,10 +43,13 @@ void AnimatedText::start()
}, DURATION);
}
void AnimatedText::draw(const Point& p)
void AnimatedText::draw(const Point& p, const Rect& visibleRect)
{
if(m_font)
m_font->renderText(m_text, Rect(p + Point(20 - m_textSize.width() / 2, -20.0 * g_clock.timeElapsed(m_startTime) / (DURATION / 1000)), m_textSize), Fw::AlignLeft, m_color);
if(m_font) {
Rect rect = Rect(p + Point(20 - m_textSize.width() / 2, -20.0 * g_clock.timeElapsed(m_startTime) / (DURATION / 1000)), m_textSize);
if(visibleRect.contains(rect))
m_font->renderText(m_text, rect, Fw::AlignLeft, m_color);
}
}
void AnimatedText::setColor(int color)

View File

@ -36,7 +36,7 @@ public:
AnimatedText();
void start();
void draw(const Point& p);
void draw(const Point& p, const Rect& visibleRect);
void setColor(int color);
void setText(const std::string& text);

View File

@ -57,7 +57,7 @@ int LEGS_COLOR_UNIFORM = 12;
int FEET_COLOR_UNIFORM = 13;
int MASK_TEXTURE_UNIFORM = 14;
void Creature::draw(const Point& p)
void Creature::draw(const Point& p, const Rect&)
{
if(m_showVolatileSquare) {
g_painter.setColor(m_volatileSquareColor);
@ -125,7 +125,7 @@ void Creature::draw(const Point& p)
}
}
void Creature::drawInformation(int x, int y, bool useGray, const Rect& rect)
void Creature::drawInformation(int x, int y, bool useGray, const Rect& visibleRect)
{
Color fillColor = Color(96, 96, 96);
@ -134,15 +134,15 @@ void Creature::drawInformation(int x, int y, bool useGray, const Rect& rect)
// calculate main rects
Rect backgroundRect = Rect(x-(13.5), y, 27, 4);
backgroundRect.bound(rect);
backgroundRect.bound(visibleRect);
Rect textRect = Rect(x - m_nameSize.width() / 2.0, y-12, m_nameSize);
textRect.bound(rect);
textRect.bound(visibleRect);
// distance them
if(textRect.top() == rect.top())
if(textRect.top() == visibleRect.top())
backgroundRect.moveTop(textRect.top() + 12);
if(backgroundRect.bottom() == rect.bottom())
if(backgroundRect.bottom() == visibleRect.bottom())
textRect.moveTop(backgroundRect.top() - 12);
// health rect is based on background rect, so no worries

View File

@ -37,8 +37,8 @@ public:
Creature();
virtual ~Creature() { }
virtual void draw(const Point& p);
void drawInformation(int x, int y, bool useGray, const Rect& rect);
virtual void draw(const Point& p, const Rect&);
void drawInformation(int x, int y, bool useGray, const Rect& visibleRect);
void setName(const std::string& name);
void setHealthPercent(uint8 healthPercent);

View File

@ -51,7 +51,7 @@ void Effect::start()
}, TICKS_PER_FRAME * getAnimationPhases());
}
void Effect::draw(const Point& p)
void Effect::draw(const Point& p, const Rect&)
{
internalDraw(p, 0);
}

View File

@ -35,7 +35,7 @@ class Effect : public Thing
public:
Effect();
void draw(const Point& p);
void draw(const Point& p, const Rect&);
void start();
void updateAnimation();

View File

@ -32,7 +32,7 @@ Item::Item() : Thing()
m_data = 0;
}
void Item::draw(const Point& p)
void Item::draw(const Point& p, const Rect&)
{
if(m_type->dimensions[ThingType::AnimationPhases] > 1)
m_animation = (g_clock.ticks() % (TICKS_PER_FRAME * m_type->dimensions[ThingType::AnimationPhases])) / TICKS_PER_FRAME;

View File

@ -35,7 +35,7 @@ public:
TICKS_PER_FRAME = 500
};
void draw(const Point& p);
void draw(const Point& p, const Rect&);
void setPos(const Position &position);
void setData(int data);

View File

@ -81,7 +81,7 @@ void Map::draw(const Rect& rect)
// skip tiles that are behind another tile
//if(isCompletlyCovered(tilePos, firstFloor))
// continue;
tile->draw(positionTo2D(tilePos) - m_drawOffset);
tile->draw(positionTo2D(tilePos) - m_drawOffset, rect);
}
}
}
@ -89,7 +89,7 @@ void Map::draw(const Rect& rect)
// after drawing all tiles, draw shots
for(const MissilePtr& shot : m_missilesAtFloor[iz]) {
Position missilePos = shot->getPos();
shot->draw(positionTo2D(missilePos) - m_drawOffset);
shot->draw(positionTo2D(missilePos) - m_drawOffset, rect);
}
}
@ -135,7 +135,7 @@ void Map::draw(const Rect& rect)
Point pos = positionTo2D((*it)->getPos()) - m_drawOffset;
pos.x *= horizontalStretchFactor;
pos.y *= verticalStretchFactor;
(*it)->draw(rect.topLeft() + pos);
(*it)->draw(rect.topLeft() + pos, rect);
}
// draw static text
@ -143,7 +143,7 @@ void Map::draw(const Rect& rect)
Point pos = positionTo2D((*it)->getPos()) - m_drawOffset;
pos.x *= horizontalStretchFactor;
pos.y *= verticalStretchFactor;
(*it)->draw(rect.topLeft() + pos);
(*it)->draw(rect.topLeft() + pos, rect);
}
}

View File

@ -32,7 +32,7 @@ Missile::Missile() : Thing()
m_startTicks = 0;
}
void Missile::draw(const Point& p)
void Missile::draw(const Point& p, const Rect&)
{
float time = (g_clock.ticks() - m_startTicks) / m_duration;
internalDraw(p + Point(m_positionDelta.x * time, m_positionDelta.y * time), 0);

View File

@ -35,7 +35,7 @@ class Missile : public Thing
public:
Missile();
void draw(const Point& p);
void draw(const Point& p, const Rect&);
void updateAnimation();

View File

@ -31,10 +31,13 @@ StaticText::StaticText()
m_font = g_fonts.getFont("verdana-11px-rounded");
}
void StaticText::draw(const Point& p)
void StaticText::draw(const Point& p, const Rect& visibleRect)
{
if(m_font)
m_font->renderText(m_text, Rect(p - Point(m_textSize.width() / 2, m_textSize.height()) + Point(20, 5), m_textSize), Fw::AlignCenter, m_color);
if(m_font) {
Rect rect = Rect(p - Point(m_textSize.width() / 2, m_textSize.height()) + Point(20, 5), m_textSize);
if(visibleRect.contains(rect))
m_font->renderText(m_text, rect, Fw::AlignCenter, m_color);
}
}
bool StaticText::addMessage(const std::string& name, int type, const std::string& message)

View File

@ -35,7 +35,7 @@ public:
StaticText();
void draw(const Point& p);
void draw(const Point& p, const Rect& visibleRect);
std::string getName() { return m_name; }
int getMessageType() { return m_type; }

View File

@ -41,7 +41,7 @@ public:
virtual void start() {}
virtual void draw(const Point& p) = 0;
virtual void draw(const Point& p, const Rect&) = 0;
void setId(int id);
virtual void setPos(const Position& position) { m_position = position; }

View File

@ -36,7 +36,7 @@ Tile::Tile(const Position& position)
m_position = position;
}
void Tile::draw(const Point& p)
void Tile::draw(const Point& p, const Rect& visibleRect)
{
m_drawElevation = 0;
@ -45,7 +45,7 @@ void Tile::draw(const Point& p)
ThingType *type = thing->getType();
if(!type->properties[ThingType::IsGround] && !type->properties[ThingType::IsGroundBorder] && !type->properties[ThingType::IsOnBottom])
break;
thing->draw(p - m_drawElevation);
thing->draw(p - m_drawElevation, visibleRect);
m_drawElevation += type->parameters[ThingType::Elevation];
if(m_drawElevation > MAX_DRAW_ELEVATION)
m_drawElevation = MAX_DRAW_ELEVATION;
@ -57,7 +57,7 @@ void Tile::draw(const Point& p)
ThingType *type = thing->getType();
if(thing->asCreature() || type->properties[ThingType::IsOnTop] || type->properties[ThingType::IsOnBottom] || type->properties[ThingType::IsGroundBorder] || type->properties[ThingType::IsGround])
break;
thing->draw(p - m_drawElevation);
thing->draw(p - m_drawElevation, visibleRect);
m_drawElevation += type->parameters[ThingType::Elevation];
if(m_drawElevation > MAX_DRAW_ELEVATION)
m_drawElevation = MAX_DRAW_ELEVATION;
@ -74,7 +74,7 @@ void Tile::draw(const Point& p)
// only render creatures where bottom right is inside our rect
if(thisTileRect.contains(creatureRect.bottomRight())) {
creature->draw(Point(p.x + xi*32 - m_drawElevation, p.y + yi*32 - m_drawElevation));
creature->draw(Point(p.x + xi*32 - m_drawElevation, p.y + yi*32 - m_drawElevation), visibleRect);
}
}
}
@ -82,13 +82,13 @@ void Tile::draw(const Point& p)
// effects
for(const EffectPtr& effect : m_effects)
effect->draw(p - m_drawElevation);
effect->draw(p - m_drawElevation, visibleRect);
// top items
for(const ThingPtr& thing : m_things) {
ThingType *type = thing->getType();
if(type->properties[ThingType::IsOnTop])
thing->draw(p);
thing->draw(p, visibleRect);
}
}

View File

@ -34,7 +34,7 @@ class Tile : public LuaObject
public:
Tile(const Position& position);
void draw(const Point& p);
void draw(const Point& p, const Rect& visibleRect);
void clean();
ThingPtr addThing(const ThingPtr& thing, int stackPos = -1);

View File

@ -35,7 +35,7 @@ void UICreature::render()
if(m_creature) {
g_painter.setColor(Fw::white);
m_creature->draw(m_rect.bottomRight() - Point(32, 32) + m_creatureMargin);
m_creature->draw(m_rect.bottomRight() - Point(32, 32) + m_creatureMargin, m_rect);
}
renderChildren();

View File

@ -35,7 +35,7 @@ void UIItem::render()
if(m_item) {
g_painter.setColor(Fw::white);
m_item->draw(m_rect.bottomRight() - Point(32, 32) + m_itemMargin);
m_item->draw(m_rect.bottomRight() - Point(32, 32) + m_itemMargin, m_rect);
}
renderChildren();