折腾了好久的地图缩放 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: ...
随机推荐
- hihoCoder #1037 : 数字三角形 (动态规划)
题目链接:https://hihocoder.com/problemset/problem/1037# 问题描述 小Hi和小Ho在经历了螃蟹先生的任务之后被奖励了一次出国旅游的机会,于是他们来到了大洋 ...
- Django后端项目----restful framework 认证源码流程
一.请求到来之后,都要先执行dispatch方法,dispatch方法方法根据请求方式的不同触发get/post/put/delete等方法 注意,APIView中的dispatch方法有很多的功能 ...
- Action的编写方式
四.Action 的编写方式 : 三种 第一种 创建普通类 不继承任何类,不实现任何接口 Public class HelloAction{ } 第二种 创建类,实现接口action Public ...
- MyEclipse非正常关闭问题
问题:电脑突然断电,myeclipse非正常关闭,“Package Explorer”非正常显示,出现错误“Could not create the view: An unexpected excep ...
- Linux sed 命令字符串替换使用方法详解
1. sed替换的基本语法 sed 's/原字符串/替换字符串/' 单引号里面,s表示替换,三根斜线中间是替换的样式,特殊字符需要使用反斜线”\”进行转义.2. 单引号” ‘ ’”是没有办法用反斜线” ...
- self asyncio
import asyncio from threading import Thread import time print('main start:',time.time()) async def d ...
- Failed to connect to MySQL server as DBD::mysql module is not installed 问题的解决
部署PXC ,卸了旧的MySQL perl-DBD-MySQL-4.013-3.el6.x86_64 这个包已经安装了,innobackup时一直在报错: Failed to connect to M ...
- zabbix 监控Nginx和PHP
原理 Nginx和PHP(5.3及以上版本)都自带了一个状态页,默认没有开启,通过开启这个状态页即可获取实时的工作状态. Nginx状态获取 Nginx的配置默认是拒绝通过IP来访问,我们可以再默认虚 ...
- Web前端学习笔记之离线安装npm
0x00 概述 这段时间的工作主题就是Linux 下的“离线部署”,包括mongo.mysql.postgresql.nodejs.nginx等软件的离线部署.平常在服务器上借助apt-get就能轻松 ...
- Prometheus监控学习笔记之Prometheus存储
0x00 概述 Prometheus之于kubernetes(监控领域),如kubernetes之于容器编排.随着heapster不再开发和维护以及influxdb 集群方案不再开源,heapster ...