cocos creator地图缩放与拖动

文章来源  https://blog.csdn.net/centor/article/details/98869051


cocos creator中

map为Canvas子节点,Canvas锚点为(0.5,0.5),map原锚点为(0.5,0.5)

下面写的是以双指中心为锚点进行map缩放、拖动,以及map变化之后的边界适配

当然也可以给适配写一个动画实现弹回边界效果这里就没有加了


//地图控制类

const {ccclass, property} = cc._decorator;

@ccclass

export default class mapCtrl extends cc.Component {

    @property(cc.Node)

    mapContent:cc.Node = null;    //接收触摸事件的node

    @property(cc.Sprite)

    target: cc.Sprite = null;  //map图片

    // LIFE-CYCLE CALLBACKS:

    moveToPos = cc.v2(0, 0);

    isMoving = false;

    followSpeed = 400;

    _map_size = new cc.Vec2(2048,2048);

    onLoad () {

        let windowSize=cc.view.getVisibleSize();

        let minScale = Math.ceil(windowSize.height/2048);

        var self = this, parent = this.node.parent;

        self.mapContent.on(cc.Node.EventType.TOUCH_START, function (event) {

            var touches = event.getTouches();

            var touchLoc = touches[0].getLocation();

            self.isMoving = true;

            self.moveToPos = self.target.node.parent.convertToNodeSpaceAR(touchLoc);

        }, self.node);

        self.mapContent.on(cc.Node.EventType.TOUCH_MOVE, function (event) {

            var touches = event.getTouches();

            if (touches.length >= 2) {  //缩放

                //获取双指移动数据

                var touch1 = touches[0], touch2 = touches[1];

                var delta1 = touch1.getDelta(), delta2 = touch2.getDelta();

                //坐标转换为map坐标系

                var touchPoint1 = parent.convertToNodeSpaceAR(touch1.getLocation());

                var touchPoint2 = parent.convertToNodeSpaceAR(touch2.getLocation());

                //记录当前锚点

                let anchorPoint_before = self.target.node.getAnchorPoint();

                //新锚点距离map左、下边界距离

                let dis_left = self._map_size.x*anchorPoint_before.x*self.target.node.scale-self.target.node.x+(touchPoint1.x-touchPoint2.x)/2;  //减平均值(防溢出写法)

                let dis_bottom = self._map_size.y*anchorPoint_before.y*self.target.node.scale-self.target.node.y+(touchPoint1.y-touchPoint2.y)/2;

                //以两点中心为新的锚点

                let anchorPoint_after = cc.v2(dis_left/(self.target.node.scale*self._map_size.x), dis_bottom/(self.target.node.scale*self._map_size.y));

                self.target.node.setAnchorPoint(anchorPoint_after);

                //距离差

                let dis_X = self._map_size.x*(anchorPoint_before.x-anchorPoint_after.x)*self.target.node.scale;

                let dis_Y = self._map_size.y*(anchorPoint_before.y-anchorPoint_after.y)*self.target.node.scale;

                //位置纠正

                self.target.node.setPosition(self.target.node.x-dis_X, self.target.node.y-dis_Y);

                //缩放,手指移动距离的0.6倍

                var distance = touchPoint1.sub(touchPoint2);

                var delta = delta1.sub(delta2);

                var scale = 1;

                if (Math.abs(distance.x) > Math.abs(distance.y)) {

                    scale = (distance.x + delta.x*0.6) / distance.x * self.target.node.scale;

                }

                else {

                    scale = (distance.y + delta.y*0.6) / distance.y * self.target.node.scale;

                }

                let windowSize=cc.view.getVisibleSize();

                var minScale = windowSize.height/2048;

                if (self.target.node.scale>1) {

                    self.target.node.scale =1;

                }

                else if(self.target.node.scale<minScale){

                    self.target.node.scale = minScale;

                }

                else{

                    self.target.node.scale = scale;

                }

                // 防止出界 移动补位

                self.goboundary();

            }

            else if(touches.length == 1){    //拖动

                var delta=event.getDelta();

                let scale = self.target.node.scale;

                let anchorX = self.target.node.getAnchorPoint().x;

                let anchorY = self.target.node.getAnchorPoint().y;

                if (windowSize.width/2-(self._map_size.x*anchorX*scale-self.target.node.getPosition().x)<=0 &&

                    windowSize.width/2-(self._map_size.x*(1-anchorX)*scale+self.target.node.getPosition().x)<=0) {

                    self.target.node.x+=delta.x;

                }

                if (windowSize.height/2-(self._map_size.y*anchorY*scale-self.target.node.getPosition().y)<=0 &&

                    windowSize.height/2-(self._map_size.y*(1-anchorY)*scale+self.target.node.getPosition().y)<=0) {

                    self.target.node.y+=delta.y;

                }

            }

        }, self.node);

        self.mapContent.on(cc.Node.EventType.TOUCH_END, function (event) {

            self.isMoving = false; // when touch ended, stop moving

            // 防止出界 移动补位

            self.goboundary();

            //self.target.node.scale = 1;

        }, self.node);

    }

    goboundary(){

        let self = this;

        let windowSize=cc.view.getVisibleSize();

        let minScale = Math.ceil(windowSize.height/2048);

        let _map_scale = self.target.node.scale;

        let anchorPoint_after = self.target.node.getAnchorPoint();

        var posX_left = windowSize.width/2-(self._map_size.x*anchorPoint_after.x*_map_scale-self.target.node.getPosition().x);

        if(posX_left > 0){

            let posx = (self._map_size.x*anchorPoint_after.x*_map_scale)-windowSize.width/2;

            self.target.node.setPosition(posx,self.target.node.y);

        }

        // 下侧空白距离

        var posX_bottom = windowSize.height/2-(self._map_size.y*anchorPoint_after.y*_map_scale-self.target.node.getPosition().y);

        if (posX_bottom > 0){

            let posy = (self._map_size.y*anchorPoint_after.y*_map_scale)-windowSize.height/2;

            self.target.node.setPosition(self.target.node.x,posy);

        }

        // 右侧空白距离

        var posX_right = windowSize.width/2-(self._map_size.x*(1-anchorPoint_after.x)*_map_scale+self.target.node.getPosition().x);

        if (posX_right > 0){

            let posx = windowSize.width/2-(self._map_size.x*(1-anchorPoint_after.x)*_map_scale);

            self.target.node.setPosition(posx,self.target.node.y);

        }

        // 上侧空白距离

        var posX_top = windowSize.height/2-(self._map_size.y*(1-anchorPoint_after.y)*_map_scale+self.target.node.getPosition().y);

        if (posX_top > 0){

            let posy = windowSize.height/2-(self._map_size.y*(1-anchorPoint_after.y)*_map_scale);

            self.target.node.setPosition(self.target.node.x,posy);

        }

    }

    start () {

    }

    update (dt) {

    }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,928评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,748评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,282评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,065评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,101评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,855评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,521评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,414评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,931评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,053评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,191评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,873评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,529评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,074评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,188评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,491评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,173评论 2 357

推荐阅读更多精彩内容