折腾了好久的地图缩放 ngui 各种偷懒实现
当时找到一篇cocos2dx 地图缩放的 很遗憾我用不了 也要记录一下 免得以后用ugui可以用
转 http://blog.csdn.net/cocosnode/article/details/40829017
using projectQ;
using UnityEngine;
public class MapGestures : MonoBehaviour
{
public GameObject BoundrayLeft;
public GameObject BoundrayRight;
public GameObject BoundrayTop;
public GameObject BoundrayBottom;
float xScaleOrigin;
float yScaleOrigin;
float fScaleFactor = 0;
bool bBeginOpt = false;
bool bPinchState = false;
Camera cam;
Vector3 moveBeginPos;
Vector3 BoundrayVecLeft;
Vector3 BoundrayVecRight;
Vector3 BoundrayVecTop;
Vector3 BoundrayVecBottom;
Vector3 tmpart = Vector3.zero;
GameObject tobject;
void Start()
{
//transform.localScale = new Vector3(1.6f, 1.6f, 1);
//transform.localPosition = new Vector3(-130f, 130f, transform.localPosition.z);
BoundrayVecLeft = BoundrayLeft.GetComponent<Transform>().position;
BoundrayVecRight = BoundrayRight.GetComponent<Transform>().position;
BoundrayVecTop = BoundrayTop.GetComponent<Transform>().position;
BoundrayVecBottom = BoundrayBottom.GetComponent<Transform>().position;
cam = _R.ui.UICamera.GetComponent<Camera>();
xScaleOrigin = transform.localScale.x;
yScaleOrigin = transform.localScale.y;
}
//private void OnGUI()
//{
// if (GUI.Button(new Rect(10, 100, 120, 65), "放大"))
// {
// ScaleMapPanel(tmpos,true);
// }
//}
void OnDrag(DragGesture gesture)
{
// 当前识别器阶段 (Started/Updated/Ended)
ContinuousGesturePhase phase = gesture.Phase;
// 最后一帧的拖拽/移动数据
Vector2 deltaMove = gesture.DeltaMove;
//完整的拖拽数据
if (gesture.Phase == ContinuousGesturePhase.Started)
{
}
else if (gesture.Phase == ContinuousGesturePhase.Updated)
{
Vector3 vvRelate = new Vector3(transform.localPosition.x + deltaMove.x, transform.localPosition.y + deltaMove.y, transform.localPosition.z);
if (gesture.Fingers.Count == 1 && !bPinchState && CheckScreenBoundray(deltaMove))
{
transform.localPosition = new Vector3(vvRelate.x, vvRelate.y, transform.localPosition.z);
}
}
}
//双指缩放
void OnPinch(PinchGesture gesture)
{
ContinuousGesturePhase phase = gesture.Phase;
// 当前两个手指的距离
float gap = gesture.Gap;
// 当前与上一帧的变动值
float delta = gesture.Delta;
var bZoomIn = delta > 0 ? true : false;
if (gesture.Phase == ContinuousGesturePhase.Started)
{
moveBeginPos = gesture.Position;
bBeginOpt = false;
bPinchState = true;
}
if (gesture.Phase == ContinuousGesturePhase.Ended)
{
moveBeginPos = new Vector3();
bPinchState = false;
}
if (moveBeginPos.sqrMagnitude > 0)
{
ScaleMapPanel(moveBeginPos, bZoomIn);
}
}
void ScaleMapPanel(Vector3 tmpos, bool bZoomIn)
{
if (!bBeginOpt)
{
tmpos = cam.ScreenToWorldPoint(tmpos);
tmpos = transform.InverseTransformPoint(tmpos);
if (tobject == null)
{
tobject = new GameObject("maodian");
tobject.transform.SetParent(transform);
}
tobject.transform.localPosition = tmpos;
bBeginOpt = true;
tmpart = tobject.transform.position;
}
if (bZoomIn)
{
fScaleFactor += 0.1f;
}
else
{
fScaleFactor -= 0.1f;
}
fScaleFactor = Mathf.Clamp(fScaleFactor, 0, 3);
var tempScaleX = xScaleOrigin + fScaleFactor;
var tempScaleY = yScaleOrigin + fScaleFactor;
transform.localScale = new Vector3(tempScaleX, tempScaleY, 1);
Vector3 tposnow = tobject.transform.position;
Vector3 tdis = tposnow - tmpart;
//if(CheckWorldBoundray(tdis))
transform.position = transform.position - tdis;
UpdateBoundray();
}
bool CheckScreenBoundray(Vector3 vPos)
{
//DebugPro.LogError("rextest CheckBoundray x " + vPos.x + " rextest CheckBoundray y " + vPos.y + " rextest CheckBoundray z " + vPos.z);
if (vPos.x > 0)
{
var brL = cam.WorldToScreenPoint(BoundrayLeft.GetComponent<Transform>().position).x + vPos.x;
if (brL > 0)
return false;
}
else
{
var brR = cam.WorldToScreenPoint(BoundrayRight.GetComponent<Transform>().position).x + vPos.x;
if (brR < Screen.width)
return false;
}
//up
if (vPos.y > 0)
{
var brB = cam.WorldToScreenPoint(BoundrayBottom.GetComponent<Transform>().position).y + vPos.y;
if (brB > 0)
return false;
}
else
{
var brT = cam.WorldToScreenPoint(BoundrayTop.GetComponent<Transform>().position).y + vPos.y;
if (brT < Screen.height)
return false;
}
//DebugPro.LogError("rextest CheckBoundray W is : " + w + " H is : " + h);
//DebugPro.LogError("rextest CheckBoundray brL is : " + brL);
//DebugPro.LogError("rextest CheckBoundray brR is : " + brR);
//DebugPro.LogError("rextest CheckBoundray brT is : " + brT);
//DebugPro.LogError("rextest CheckBoundray brB is : " + brB);
return true;
}
void UpdateBoundray()
{
var brL = cam.WorldToScreenPoint(BoundrayLeft.GetComponent<Transform>().position).x;
if (brL > 0)
{
Vector3 offset = BoundrayVecLeft - BoundrayLeft.GetComponent<Transform>().position;
transform.position = transform.position + offset;
}
var brR = cam.WorldToScreenPoint(BoundrayRight.GetComponent<Transform>().position).x;
if (brR < Screen.width)
{
Vector3 offset = BoundrayVecRight - BoundrayRight.GetComponent<Transform>().position;
transform.position = transform.position + offset;
}
//up
var brB = cam.WorldToScreenPoint(BoundrayBottom.GetComponent<Transform>().position).y;
if (brB > 0)
{
Vector3 offset = BoundrayVecBottom - BoundrayBottom.GetComponent<Transform>().position;
transform.position = transform.position + offset;
}
var brT = cam.WorldToScreenPoint(BoundrayTop.GetComponent<Transform>().position).y;
if (brT < Screen.height)
{
Vector3 offset = BoundrayVecTop - BoundrayTop.GetComponent<Transform>().position;
transform.position = transform.position + offset;
}
}
}
折腾了好久的地图缩放 ngui 各种偷懒实现的更多相关文章
- 百度地图api根据地图缩放等级显示不同的marker点,功能二
功能一里面有marker点后台的代码 根据地图的缩放等级显示不同marker点的坐标JSP代码 <%@ page language="java" contentType=&q ...
- [Windwos Phone] 实作地图缩放 MapAnimationKind 属性效果
原文:[Windwos Phone] 实作地图缩放 MapAnimationKind 属性效果 [前言] 使用经纬度来定位地图的位置,以及使用 MapAnimationKind 属性来设定地图缩放时的 ...
- openLayers地图缩放的回调
//设置地图最小缩放级别为17级 map.events.register("zoomend", this, function (e) { //每次地图缩放时就会进入到这 if (m ...
- android 中百度地图 关于地图缩放所调用的事件
在做百度地图的时候 javascript 有个地图缩放的事件 但是在android 的API里面却没有,但是还好 官方给了一个MapStatusChangeListener,是这样介绍的 百度地图S ...
- 基于高德地图的描点操作,监听地图缩放,展示合理数量的marker
原文:基于高德地图的描点操作,监听地图缩放,展示合理数量的marker 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lx583274568/art ...
- OpenLayers中地图缩放级别的设置方法
来源于:http://www.cnblogs.com/sailheart/archive/2011/03/15/1984519.html 一.概述 在OpenLayers中,地图必须具有一个缩放级别的 ...
- android百度地图中的地图缩放级别
前期搭建百度地图的环境就不说了,网上一搜一大把,这里只讲地图的缩放,大神可以直接绕道 首先在类的内部初始化一个百度地图的对象 private BaiduMap mBaiduMap; 然后在OnCrea ...
- Android Google Maps 监听地图缩放
接上篇.http://www.cnblogs.com/maomishen/p/3556297.html 由于公司项目要求,需要对google map监听地图的缩放(zoom)来进行一些操作. 但是在网 ...
- Cocos2d-x教程(26)-Cocos2d-x + Lua脚本实现大地图缩放功能
欢迎增加 Cocos2d-x 交流群: 193411763 视频教程地址:http://www.tudou.com/programs/view/qRiOfppMghM/ 转载请注明原文出处:http: ...
随机推荐
- source from Other`s
以下链接转自其他努力的程序员们: 一一感谢! http完美讲解 -- https://www.cnblogs.com/ranyonsue/p/5984001.html http协议与soap协议之间的 ...
- [转载]图解程序员必须掌握的Java常用8大排序算法
这篇文章主要介绍了Java如何实现八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序,分享给大家一起学习. 分类1)插入排序(直接插入排序.希尔排 ...
- Android NDK MediaCodec在ijkplayer中的实践
https://www.jianshu.com/p/41d3147a5e07 从API 21(Android 5.0)开始Android提供C层的NDK MediaCodec的接口. Java Med ...
- 【react懒加载组件】--react-lazyload
组件安装: npm install react-lazyload --save-dev 组件使用: //引入 import LazyLoad from 'react-lazyload'; //rend ...
- 虚拟机下Linux系统如何设置IP地址
虚拟机下Linux系统设置IP地址三种方法 文章来源:https://jingyan.baidu.com/article/ea24bc399ffeb9da62b3318f.html 工具/原料 V ...
- 禁止单个IP或ip段访问
//IP禁止判断接口,返回true则为找到 function checkIp($ip, $ipbanned) { $ipbannedFlag = false; if (!empty($ipbanned ...
- python简说(十)json模块
常用模块: 一个python文件就是一个模块 1.标准模块,python自带的 2.第三方模块,需要安装 3.自己写的python文件 json,就是一个字符串 1.json转为字典 json_str ...
- (2编写网络)自己动手,编写神经网络程序,解决Mnist问题,并网络化部署
基于<神经网络和深度学习>这本绝好的教材提供的相关资料和代码,我们自己动手编写"随机取样的梯度下降神经网络".为了更好地说明问题,我们先从简单的开始: 1.sigmod ...
- bzoj 4810 由乃的玉米田 - bitset - 莫队算法
由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐. 由乃认为玉米田不美,所以她决定出个数据结构题 这个题是这样的: 给你一个序列a,长度为n,有m ...
- topcoder srm 445 div1
problem1 link 这个的结论是只需要考虑坐标是整数或者是整数.5,比如(2.5,3),(4,3.5),(1.5,4.5)这样的时候.这个详细证明起来应该挺麻烦的.这里有一些讨论. probl ...