折腾了好久的地图缩放 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: ...
随机推荐
- 第一节 JavaScript概述
第一节 JavaScript概述 JavaScript:其实就是对HTML+CSS静态页面进行样式修改,使其实现各种动态效果. 编写JS脚本基本步骤: 1. HTML+CSS静态布局: 2. 确定要修 ...
- shell 冒号
: ${TEST_LOOP:='1'} 如果不在前面加上:(冒号)命令,那么就会把${TEST_LOOP:='1'}本身当做一个命令来执行,报错是肯定的. [root@node56 ~]# : abc ...
- JavaScript笔记 #07# 用js写算法
算法盒子初代(为了提高学习算法的热情...) 效果图: 所有代码放在单个html中: <!DOCTYPE html> <html> <head> <meta ...
- 获取微信access_token
/** * 获取微信access_token * @return mixed */function get_access_token() { $appId = C('APPID'); $secret ...
- Golang匿名函数
概念所谓匿名函数,就是没有名字的函数匿名函数的两种使用方式一.在定义匿名函数的时候就可以直接使用(这种方式只使用一次) package main import ( "fmt" ) ...
- P4172 [WC2006]水管局长(LCT)
P4172 [WC2006]水管局长 LCT维护最小生成树,边权化点权.类似 P2387 [NOI2014]魔法森林(LCT) 离线存储询问,倒序处理,删边改加边. #include<iostr ...
- android样式之按钮&&图片
在drawable-hdpi中添加xml文件 <?xml version="1.0" encoding="utf-8"?> <selector ...
- windows线程池之I/O完成端口(IOCP)
对于这个学习主要参考博客 http://blog.csdn.net/neicole/article/details/7549497
- day5 python
一.常量 在Python中没有一个专门的语法代表常量,程序员约定俗成用变量名全部大写代表常量.AGE_OF_OLFBOY=73二.基本运算符的补充1.算数运算符 print(10/3) print(1 ...
- 16 级高代 II 思考题九的七种解法
16 级高代 II 思考题九 设 $V$ 是数域 $\mathbb{K}$ 上的 $n$ 维线性空间, $\varphi$ 是 $V$ 上的线性变换, $f(\lambda),m(\lambda)$ ...