From c0c24118544b6c5388189d1e54fab3d2e42ca9b0 Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Thu, 12 Jul 2012 16:16:23 -0300 Subject: [PATCH] Improve minimap --- modules/game_minimap/minimap.lua | 46 ++++++------ modules/game_minimap/minimap.otui | 96 ++++++++++++-------------- src/framework/luafunctions.cpp | 2 + src/framework/ui/uiwidget.h | 3 + src/framework/ui/uiwidgetbasestyle.cpp | 8 ++- 5 files changed, 78 insertions(+), 77 deletions(-) diff --git a/modules/game_minimap/minimap.lua b/modules/game_minimap/minimap.lua index f4aec99d..03942525 100644 --- a/modules/game_minimap/minimap.lua +++ b/modules/game_minimap/minimap.lua @@ -4,7 +4,7 @@ Minimap = {} local minimapWidget local minimapButton local minimapWindow -local DEFAULT_ZOOM = 45 +local DEFAULT_ZOOM = 60 minimapFirstLoad = true -- private functions @@ -31,15 +31,15 @@ function onMinimapMouseWheel(self, mousePos, direction) end --[[ - Known Issue (TODO): - If you move the minimap compass directions and + Known Issue (TODO): + If you move the minimap compass directions and you change floor it will not update the minimap. ]] -- public functions function Minimap.init() connect(g_game, { onGameStart = Minimap.reset, onForceWalk = Minimap.center }) - + g_keyboard.bindKeyDown('Ctrl+M', Minimap.toggle) minimapButton = TopMenu.addRightGameToggleButton('minimapButton', tr('Minimap') .. ' (Ctrl+M)', 'minimap.png', Minimap.toggle) @@ -79,7 +79,7 @@ end function Minimap.terminate() disconnect(g_game, { onGameStart = Minimap.reset, onForceWalk = Minimap.center }) - + g_keyboard.unbindKeyDown('Ctrl+M') minimapButton:destroy() @@ -105,30 +105,28 @@ function Minimap.onMiniWindowClose() end function Minimap.isClickInRange(position, fromPosition, toPosition) - return (position.x >= fromPosition.x and position.y >= fromPosition.y and position.x <= toPosition.x and position.y <= toPosition.y) + return (position.x >= fromPosition.x and position.y >= fromPosition.y and position.x <= toPosition.x and position.y <= toPosition.y) end + -- hooked functions -local compassZones = {} -compassZones.west = {x = 0, y = 30, posx = -1, posy = 0} -compassZones.north = {x = 30, y = 0, posx = 0, posy = -1} -compassZones.south = {x = 30, y = 57, posx = 0, posy = 1} -compassZones.east = {x = 57, y = 30, posx = 1, posy = 0} function Minimap.compassClick(self, mousePos) - local compassPos = self:getRect() - local pos = {x = mousePos.x-compassPos.x, y = mousePos.y-compassPos.y} - local move = {x = 0, y = 0} - for i,v in pairs(compassZones) do - local lowPos = {x = v.x-15, y = v.y-15} - local highPos = {x = v.x+15, y = v.y+15} - if Minimap.isClickInRange(pos, lowPos, highPos) then - move.x = move.x + v.posx * minimapWidget:getZoom()/10 - move.y = move.y + v.posy * minimapWidget:getZoom()/10 - break - end - end + local px = mousePos.x - self:getX() + local py = mousePos.y - self:getY() + local dx = px - self:getWidth()/2 + local dy = -(py - self:getHeight()/2) + local radius = math.sqrt(dx*dx+dy*dy) + local movex=0 + local movey=0 + dx = dx/radius + dy = dy/radius + + if dx > 0.5 then movex = 1 end + if dx < -0.5 then movex = -1 end + if dy > 0.5 then movey = -1 end + if dy < -0.5 then movey = 1 end local cameraPos = minimapWidget:getCameraPosition() - local pos = {x = cameraPos.x + move.x, y = cameraPos.y + move.y, z = cameraPos.z} + local pos = {x = cameraPos.x + movex, y = cameraPos.y + movey, z = cameraPos.z} minimapWidget:setCameraPosition(pos) end diff --git a/modules/game_minimap/minimap.otui b/modules/game_minimap/minimap.otui index cd06b3b4..6f87e3af 100644 --- a/modules/game_minimap/minimap.otui +++ b/modules/game_minimap/minimap.otui @@ -1,27 +1,24 @@ MapControl < Button - size: 16 16 + size: 20 20 $pressed: - image-clip: 0 0 16 16 + icon-clip: 0 0 16 16 $hover !pressed: - image-clip: 0 16 16 16 + icon-clip: 0 16 16 16 $!pressed !hover: - image-clip: 0 32 16 16 - - $disabled: - image-color: #ffffff88 + icon-clip: 0 32 16 16 FloorUpControl < MapControl - image-source: /game_minimap/floor_up.png - + icon-source: /game_minimap/floor_up.png + FloorDownControl < MapControl - image-source: /game_minimap/floor_down.png - + icon-source: /game_minimap/floor_down.png + //ZoomOutControl < MapControl //image-source: /game_minimap/zoom_out.png - + //ZoomInControl < MapControl //image-source: /game_minimap/zoom_in.png @@ -37,81 +34,78 @@ MiniWindow padding: 3 UIMap id: minimap - anchors.left: parent.left - anchors.top: parent.top - size: 110 110 - + anchors.fill: parent + UIButton id: compass image-source: /game_minimap/compass.png + image-smooth: true color: #ffffff - anchors.left: minimap.right - anchors.top: minimap.top - size: 60 60 - margin-top: 3 - margin-left: 5 + anchors.left: parent.left + anchors.top: parent.top + size: 48 48 + margin-top: 4 + margin-left: 4 @onClick: function(...) Minimap.compassClick(...) end - + UIButton id: compassReset - text: Reset + text: R font: verdana-11px-rounded - anchors.left: compass.left - anchors.top: compass.top - margin-top: 25 - margin-left: 14 + anchors.centerIn: compass + margin-top: 2 + margin-right: 1 @onClick: function(...) Minimap.center(...) end $pressed: color: #eb9f4f88 - margin-top: 26 - margin-left: 15 $hover !pressed: color: #eb9f4f $!pressed !hover: color: #ffffff - margin-top: 25 - margin-left: 14 $disabled: image-color: #ffffff88 - + FloorUpControl id: floorUp - anchors.left: minimap.right - anchors.top: compass.bottom - margin-top: 10 - margin-left: 15 + anchors.right: parent.right + anchors.bottom: parent.bottom + margin-right: 28 + margin-bottom: 28 enabled: true @onClick: Minimap.onButtonClick(self:getId()) - + FloorDownControl id: floorDown - anchors.left: floorUp.left - anchors.top: floorUp.bottom - margin-top: 4 + anchors.right: parent.right + anchors.bottom: parent.bottom + margin-right: 28 + margin-bottom: 4 enabled: true @onClick: Minimap.onButtonClick(self:getId()) - + Button id: zoomIn text: + - size: 16 16 - anchors.left: floorUp.right - anchors.top: floorUp.top - margin-left: 10 + size: 20 20 + anchors.right: parent.right + anchors.bottom: parent.bottom + margin-right: 4 + margin-bottom: 28 enabled: true @onClick: Minimap.onButtonClick(self:getId()) - + Button id: zoomOut text: - font: terminus-14px-bold - size: 16 16 - anchors.left: floorDown.right - anchors.top: floorDown.top - margin-left: 10 + size: 20 20 + anchors.right: parent.right + anchors.bottom: parent.bottom + margin-right: 4 + margin-bottom: 4 enabled: true @onClick: Minimap.onButtonClick(self:getId()) - + diff --git a/src/framework/luafunctions.cpp b/src/framework/luafunctions.cpp index 1daf538a..a425c78f 100644 --- a/src/framework/luafunctions.cpp +++ b/src/framework/luafunctions.cpp @@ -218,6 +218,7 @@ void Application::registerLuaFunctions() g_lua.bindClassMemberFunction("setIconHeight", &UIWidget::setIconHeight); g_lua.bindClassMemberFunction("setIconSize", &UIWidget::setIconSize); g_lua.bindClassMemberFunction("setIconRect", &UIWidget::setIconRect); + g_lua.bindClassMemberFunction("setIconClip", &UIWidget::setIconClip); g_lua.bindClassMemberFunction("setBorderWidth", &UIWidget::setBorderWidth); g_lua.bindClassMemberFunction("setBorderWidthTop", &UIWidget::setBorderWidthTop); g_lua.bindClassMemberFunction("setBorderWidthRight", &UIWidget::setBorderWidthRight); @@ -267,6 +268,7 @@ void Application::registerLuaFunctions() g_lua.bindClassMemberFunction("getIconHeight", &UIWidget::getIconHeight); g_lua.bindClassMemberFunction("getIconSize", &UIWidget::getIconSize); g_lua.bindClassMemberFunction("getIconRect", &UIWidget::getIconRect); + g_lua.bindClassMemberFunction("getIconClip", &UIWidget::getIconClip); g_lua.bindClassMemberFunction("getBorderTopColor", &UIWidget::getBorderTopColor); g_lua.bindClassMemberFunction("getBorderRightColor", &UIWidget::getBorderRightColor); g_lua.bindClassMemberFunction("getBorderBottomColor", &UIWidget::getBorderBottomColor); diff --git a/src/framework/ui/uiwidget.h b/src/framework/ui/uiwidget.h index e9c50ac8..90aa2bad 100644 --- a/src/framework/ui/uiwidget.h +++ b/src/framework/ui/uiwidget.h @@ -278,6 +278,7 @@ protected: TexturePtr m_icon; Color m_iconColor; Rect m_iconRect; + Rect m_iconClipRect; EdgeGroup m_borderColor; EdgeGroup m_borderWidth; EdgeGroup m_margin; @@ -311,6 +312,7 @@ public: void setIconHeight(int height) { m_iconRect.setHeight(height); } void setIconSize(const Size& size) { m_iconRect.resize(size); } void setIconRect(const Rect& rect) { m_iconRect = rect; } + void setIconClip(const Rect& rect) { m_iconClipRect = rect; } void setBorderWidth(int width) { m_borderWidth.set(width); updateLayout(); } void setBorderWidthTop(int width) { m_borderWidth.top = width; } void setBorderWidthRight(int width) { m_borderWidth.right = width; } @@ -361,6 +363,7 @@ public: int getIconHeight() { return m_iconRect.height(); } Size getIconSize() { return m_iconRect.size(); } Rect getIconRect() { return m_iconRect; } + Rect getIconClip() { return m_iconClipRect; } Color getBorderTopColor() { return m_borderColor.top; } Color getBorderRightColor() { return m_borderColor.right; } Color getBorderBottomColor() { return m_borderColor.bottom; } diff --git a/src/framework/ui/uiwidgetbasestyle.cpp b/src/framework/ui/uiwidgetbasestyle.cpp index edc6ab90..2126c624 100644 --- a/src/framework/ui/uiwidgetbasestyle.cpp +++ b/src/framework/ui/uiwidgetbasestyle.cpp @@ -100,6 +100,8 @@ void UIWidget::parseBaseStyle(const OTMLNodePtr& styleNode) setIconSize(node->value()); else if(node->tag() == "icon-rect") setIconRect(node->value()); + else if(node->tag() == "icon-clip") + setIconClip(node->value()); else if(node->tag() == "opacity") setOpacity(node->value()); else if(node->tag() == "enabled") @@ -369,15 +371,17 @@ void UIWidget::drawIcon(const Rect& screenCoords) drawRect.translate(m_iconRect.topLeft()); drawRect.resize(m_iconRect.size()); } else { - drawRect.resize(m_icon->getSize()); + drawRect.resize(m_iconClipRect.size()); drawRect.moveCenter(screenCoords.center()); } g_painter->setColor(m_iconColor); - g_painter->drawTexturedRect(drawRect, m_icon); + g_painter->drawTexturedRect(drawRect, m_icon, m_iconClipRect); } } void UIWidget::setIcon(const std::string& iconFile) { m_icon = g_textures.getTexture(iconFile); + if(!m_iconClipRect.isValid()) + m_iconClipRect = Rect(0, 0, m_icon->getSize()); }