fix walk freeze, fix some texts displaying in pink

This commit is contained in:
Eduardo Bart 2012-01-19 14:23:24 -02:00
parent 3725577aac
commit 9450fab9e7
6 changed files with 19 additions and 7 deletions

View File

@ -43,6 +43,7 @@ function table.removevalue(t, value)
for k,v in pairs(t) do for k,v in pairs(t) do
if v == value then if v == value then
table.remove(t, k) table.remove(t, k)
break
end end
end end
end end

View File

@ -134,5 +134,11 @@ void Painter::setCompositionMode(Painter::CompositionMode compositionMode)
case CompositionMode_Add: case CompositionMode_Add:
glBlendFunc(GL_ONE, GL_ONE); glBlendFunc(GL_ONE, GL_ONE);
break; break;
case CompositionMode_Replace:
glBlendFunc(GL_ONE, GL_ZERO);
break;
case CompositionMode_DestBlending:
glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA);
break;
} }
} }

View File

@ -34,7 +34,9 @@ public:
enum CompositionMode { enum CompositionMode {
CompositionMode_Normal, CompositionMode_Normal,
CompositionMode_Multiply, CompositionMode_Multiply,
CompositionMode_Add CompositionMode_Add,
CompositionMode_Replace,
CompositionMode_DestBlending
}; };
void init(); void init();

View File

@ -61,7 +61,7 @@ void UIWidget::drawText(const Rect& screenCoords)
m_textFramebuffer->bind(); m_textFramebuffer->bind();
Rect virtualTextRect(0, 0, boxSize); Rect virtualTextRect(0, 0, boxSize);
virtualTextRect.translate(m_textOffset); virtualTextRect.translate(m_textOffset);
g_painter.setCompositionMode(Painter::CompositionMode_Add); g_painter.setCompositionMode(Painter::CompositionMode_DestBlending);
m_font->renderText(m_text, virtualTextRect, m_textAlign, Fw::white); m_font->renderText(m_text, virtualTextRect, m_textAlign, Fw::white);
g_painter.resetCompositionMode(); g_painter.resetCompositionMode();
m_textFramebuffer->release(); m_textFramebuffer->release();

View File

@ -54,9 +54,8 @@ void LocalPlayer::walk(const Position& oldPos, const Position& newPos)
// switch to normal walking // switch to normal walking
m_preWalking = false; m_preWalking = false;
m_lastPrewalkDone = true; m_lastPrewalkDone = true;
// if is to the destination, updates it preserving the animation // if is to the last prewalk destination, updates the walk preserving the animation
if(newPos == m_lastPrewalkDestionation) { if(newPos == m_lastPrewalkDestionation) {
// walk started by prewalk could already be finished by now
updateWalk(); updateWalk();
// was to another direction, replace the walk // was to another direction, replace the walk
} else } else
@ -77,12 +76,15 @@ void LocalPlayer::preWalk(Otc::Direction direction)
bool LocalPlayer::canWalk(Otc::Direction direction) bool LocalPlayer::canWalk(Otc::Direction direction)
{ {
// prewalk has a timeout, because for some reason that I don't know yet the server sometimes doesn't answer the prewalk
bool prewalkTimeouted = m_walking && m_preWalking && m_walkTimer.ticksElapsed() >= m_walkInterval + PREWALK_TIMEOUT;
// cannot walk while already walking // cannot walk while already walking
if(m_walking) if(m_walking && !prewalkTimeouted)
return false; return false;
// avoid doing more walks than wanted when receiving a lot of walks from server // avoid doing more walks than wanted when receiving a lot of walks from server
if(!m_lastPrewalkDone) if(!m_lastPrewalkDone && !prewalkTimeouted)
return false; return false;
// cannot walk while locked // cannot walk while locked

View File

@ -28,7 +28,8 @@
class LocalPlayer : public Player class LocalPlayer : public Player
{ {
enum { enum {
WALK_LOCK_INTERVAL = 250 WALK_LOCK_INTERVAL = 250,
PREWALK_TIMEOUT = 1000
}; };
public: public:
LocalPlayer(); LocalPlayer();