Improve game map view modes

This commit is contained in:
Eduardo Bart
2013-01-24 17:15:07 -02:00
parent 5b65088426
commit a8fbd6cdfc
4 changed files with 81 additions and 49 deletions

View File

@@ -555,10 +555,12 @@ void Client::registerLuaFunctions()
g_lua.bindClassMemberFunction<UIMap>("setKeepAspectRatio", &UIMap::setKeepAspectRatio);
g_lua.bindClassMemberFunction<UIMap>("setMapShader", &UIMap::setMapShader);
g_lua.bindClassMemberFunction<UIMap>("setMinimumAmbientLight", &UIMap::setMinimumAmbientLight);
g_lua.bindClassMemberFunction<UIMap>("setLimitVisibleRange", &UIMap::setLimitVisibleRange);
g_lua.bindClassMemberFunction<UIMap>("isMultifloor", &UIMap::isMultifloor);
g_lua.bindClassMemberFunction<UIMap>("isAutoViewModeEnabled", &UIMap::isAutoViewModeEnabled);
g_lua.bindClassMemberFunction<UIMap>("isDrawingTexts", &UIMap::isDrawingTexts);
g_lua.bindClassMemberFunction<UIMap>("isDrawingLights", &UIMap::isDrawingLights);
g_lua.bindClassMemberFunction<UIMap>("isLimitVisibleRangeEnabled", &UIMap::isLimitVisibleRangeEnabled);
g_lua.bindClassMemberFunction<UIMap>("isAnimating", &UIMap::isAnimating);
g_lua.bindClassMemberFunction<UIMap>("isKeepAspectRatioEnabled", &UIMap::isKeepAspectRatioEnabled);
g_lua.bindClassMemberFunction<UIMap>("getVisibleDimension", &UIMap::getVisibleDimension);

View File

@@ -33,9 +33,11 @@ UIMap::UIMap()
m_draggable = true;
m_mapView = MapViewPtr(new MapView);
m_zoom = m_mapView->getVisibleDimension().height();
m_aspectRatio = 0.0f;
m_keepAspectRatio = true;
m_limitVisibleRange = false;
m_aspectRatio = m_mapView->getVisibleDimension().ratio();
m_maxZoomIn = 3;
m_maxZoomOut = 512;
m_maxZoomOut = 513;
m_mapRect.resize(1,1);
g_map.addMapView(m_mapView);
}
@@ -78,7 +80,10 @@ bool UIMap::setZoom(int zoom)
bool UIMap::zoomIn()
{
int delta = 2;
if(m_zoom - delta <= m_maxZoomIn)
if(m_zoom - delta < m_maxZoomIn)
delta--;
if(m_zoom - delta < m_maxZoomIn)
return false;
m_zoom -= delta;
@@ -89,7 +94,10 @@ bool UIMap::zoomIn()
bool UIMap::zoomOut()
{
int delta = 2;
if(m_zoom + delta >= m_maxZoomOut)
if(m_zoom + delta > m_maxZoomOut)
delta--;
if(m_zoom + delta > m_maxZoomOut)
return false;
m_zoom += 2;
@@ -100,19 +108,17 @@ bool UIMap::zoomOut()
void UIMap::setVisibleDimension(const Size& visibleDimension)
{
m_mapView->setVisibleDimension(visibleDimension);
m_aspectRatio = visibleDimension.ratio();
if(m_aspectRatio != 0.0f) {
m_aspectRatio = visibleDimension.ratio();
if(m_keepAspectRatio)
updateMapSize();
}
}
void UIMap::setKeepAspectRatio(bool enable)
{
m_keepAspectRatio = enable;
if(enable)
m_aspectRatio = getVisibleDimension().ratio();
else
m_aspectRatio = 0.0f;
updateMapSize();
}
@@ -196,8 +202,8 @@ void UIMap::updateVisibleDimension()
{
int dimensionHeight = m_zoom;
float ratio = 1;
if(!m_mapRect.isEmpty())
float ratio = m_aspectRatio;
if(!m_limitVisibleRange && !m_mapRect.isEmpty() && !m_keepAspectRatio)
ratio = m_mapRect.size().ratio();
if(dimensionHeight % 2 == 0)
@@ -208,7 +214,7 @@ void UIMap::updateVisibleDimension()
m_mapView->setVisibleDimension(Size(dimensionWidth, dimensionHeight));
if(m_aspectRatio != 0.0f)
if(m_keepAspectRatio)
updateMapSize();
}
@@ -216,7 +222,7 @@ void UIMap::updateMapSize()
{
Rect clippingRect = getPaddingRect();
Size mapSize;
if(m_aspectRatio != 0.0f) {
if(m_keepAspectRatio) {
Rect mapRect = clippingRect.expanded(-1);
mapSize = Size(m_aspectRatio*m_zoom, m_zoom);
mapSize.scale(mapRect.size(), Fw::KeepAspectRatio);
@@ -228,6 +234,6 @@ void UIMap::updateMapSize()
m_mapRect.moveCenter(clippingRect.center());
m_mapView->optimizeForSize(mapSize);
if(m_aspectRatio == 0.0f)
if(!m_keepAspectRatio)
updateVisibleDimension();
}

View File

@@ -56,13 +56,15 @@ public:
void setKeepAspectRatio(bool enable);
void setMapShader(const PainterShaderProgramPtr& shader, float fadeout, float fadein) { m_mapView->setShader(shader, fadein, fadeout); }
void setMinimumAmbientLight(float intensity) { m_mapView->setMinimumAmbientLight(intensity); }
void setLimitVisibleRange(bool limitVisibleRange) { m_limitVisibleRange = limitVisibleRange; updateVisibleDimension(); }
bool isMultifloor() { return m_mapView->isMultifloor(); }
bool isAutoViewModeEnabled() { return m_mapView->isAutoViewModeEnabled(); }
bool isDrawingTexts() { return m_mapView->isDrawingTexts(); }
bool isDrawingLights() { return m_mapView->isDrawingLights(); }
bool isAnimating() { return m_mapView->isAnimating(); }
bool isKeepAspectRatioEnabled() { return m_aspectRatio != 0.0f; }
bool isKeepAspectRatioEnabled() { return m_keepAspectRatio; }
bool isLimitVisibleRangeEnabled() { return m_limitVisibleRange; }
Size getVisibleDimension() { return m_mapView->getVisibleDimension(); }
MapView::ViewMode getViewMode() { return m_mapView->getViewMode(); }
@@ -89,6 +91,8 @@ private:
MapViewPtr m_mapView;
Rect m_mapRect;
float m_aspectRatio;
bool m_keepAspectRatio;
bool m_limitVisibleRange;
int m_maxZoomIn;
int m_maxZoomOut;
};