浏览代码

Merge pull request #2683 from Laserlicht/zoom_dead_area

dead area for zooming
Nordsoft91 2 年之前
父节点
当前提交
6394a77270
共有 2 个文件被更改,包括 25 次插入4 次删除
  1. 19 3
      client/mapView/MapViewController.cpp
  2. 6 1
      client/mapView/MapViewController.h

+ 19 - 3
client/mapView/MapViewController.cpp

@@ -20,6 +20,7 @@
 #include "../adventureMap/AdventureMapInterface.h"
 #include "../gui/CGuiHandler.h"
 #include "../gui/WindowHandler.h"
+#include "../eventsSDL/InputHandler.h"
 
 #include "../../lib/CConfigHandler.h"
 #include "../../lib/mapObjects/CGHeroInstance.h"
@@ -90,13 +91,13 @@ void MapViewController::modifyTileSize(int stepsChange)
 	// we want to zoom in/out in fixed 10% steps, to allow player to return back to exactly 100% zoom just by scrolling
 	// so, zooming in for 5 steps will put game at 1.1^5 = 1.61 scale
 	// try to determine current zooming level and change it by requested number of steps
-	double currentZoomFactor = model->getSingleTileSize().x / 32.0;
+	double currentZoomFactor = targetTileSize.x / static_cast<double>(defaultTileSize);
 	double currentZoomSteps = std::round(std::log(currentZoomFactor) / std::log(1.01));
 	double newZoomSteps = stepsChange != 0 ? currentZoomSteps + stepsChange : stepsChange;
 	double newZoomFactor = std::pow(1.01, newZoomSteps);
 
-	Point currentZoom = model->getSingleTileSize();
-	Point desiredZoom = Point(32,32) * newZoomFactor;
+	Point currentZoom = targetTileSize;
+	Point desiredZoom = Point(defaultTileSize,defaultTileSize) * newZoomFactor;
 
 	if (desiredZoom == currentZoom && stepsChange < 0)
 		desiredZoom -= Point(1,1);
@@ -112,7 +113,22 @@ void MapViewController::modifyTileSize(int stepsChange)
 	};
 
 	if (actualZoom != currentZoom)
+	{
+		targetTileSize = actualZoom;
+		if(actualZoom.x >= defaultTileSize - zoomTileDeadArea && actualZoom.x <= defaultTileSize + zoomTileDeadArea)
+			actualZoom.x = defaultTileSize;
+		if(actualZoom.y >= defaultTileSize - zoomTileDeadArea && actualZoom.y <= defaultTileSize + zoomTileDeadArea)
+			actualZoom.y = defaultTileSize;
+		
+		bool isInDeadZone = targetTileSize != actualZoom || actualZoom == Point(defaultTileSize, defaultTileSize);
+
+		if(!wasInDeadZone && isInDeadZone)
+			GH.input().hapticFeedback();
+
+		wasInDeadZone = isInDeadZone;
+
 		setTileSize(actualZoom);
+	}
 }
 
 MapViewController::MapViewController(std::shared_ptr<MapViewModel> model, std::shared_ptr<MapViewCache> view)

+ 6 - 1
client/mapView/MapViewController.h

@@ -10,9 +10,9 @@
 #pragma once
 
 #include "IMapRendererObserver.h"
+#include "../../lib/Point.h"
 
 VCMI_LIB_NAMESPACE_BEGIN
-class Point;
 struct ObjectPosInfo;
 VCMI_LIB_NAMESPACE_END
 
@@ -50,6 +50,11 @@ class MapViewController : public IMapObjectObserver
 	std::shared_ptr<MapRendererPuzzleMapContext> puzzleMapContext;
 
 private:
+	const int defaultTileSize = 32;
+	const int zoomTileDeadArea = 5;
+	Point targetTileSize = Point(32, 32);
+	bool wasInDeadZone = true;
+
 	bool isEventInstant(const CGObjectInstance * obj);
 	bool isEventVisible(const CGObjectInstance * obj);
 	bool isEventVisible(const CGHeroInstance * obj, const int3 & from, const int3 & dest);