COCOS2dx 实现地图缩放和拖动/拖动助力

下面是lua版本的具体代码

缩放算法大致和http://blog.csdn.net/somestill/article/details/10581277相同,做了一些优化 他的算法有bug

cc.FileUtils:getInstance():addSearchPath("src")
cc.FileUtils:getInstance():addSearchPath("res")

require "game.EngineDefault"

local _layer = nil;
local _scene = nil;
local _tileMap = nil;
local _grassTileLayer = nil;
local _treeTileLayer = nil;
local _player = nil;

local distance;
local deltaX;
local deltaY;
local mscale = 1;
local firsttouch = true;

--滑动助力
local lastMove = nil;
local DIS_MIN = 5;

local function autoMoveMap()
    print("autoMoveMap",lastMove.x,lastMove.y);
    if(math.abs(lastMove.x) <= 2 and math.abs(lastMove.y) <= 2)then
        local px,py = _tileMap:getPosition();
        _tileMap:setPosition(cc.p(px + lastMove.x,py + lastMove.y));
        _layer:unscheduleUpdate();
        lastMove = nil;
        return;
    end

    local px,py = _tileMap:getPosition();
    local moveX = lastMove.x / 1.2;
    local moveY = lastMove.y / 1.2;
    _tileMap:setPosition(cc.p(px + moveX,py + moveY));

    lastMove.x = moveX;
    lastMove.y = moveY;
end

local function onTouchBegin(touch,event)
    firsttouch = true;
    _layer:unscheduleUpdate();
    return true;
end

local function onTouchMove(touch,event)
    if(#touch == 1)then --single touch
        --重置标志位 防止开始用户使用2个手指缩放
        --松开一个手指拖动 再用2个手指缩放 不会触发 onTouchBegin 的问题
        firsttouch = true;
        local d = touch[1]:getDelta();
        local scale = _layer:getScale();
        --这里要按照缩放比例来决定滑动的距离 不然在scale较小的情况下会出来 "滑不动"
        d = cc.p(d.x /scale ,d.y/ scale);
        local px,py = _tileMap:getPosition();
        _tileMap:setPosition(cc.p(px + d.x,py + d.y));
        lastMove = d;
    else --multi touch
        lastMove = nil

        local p1 = touch[1]:getLocation();
        local p2 = touch[2]:getLocation();
        local pMid = cc.pMidpoint(p1,p2);

        if(firsttouch)then
            firsttouch = false;
            distance = cc.pGetDistance(p1,p2);
            deltaX = pMid.x - _layer:getPositionX();
            deltaY = pMid.y - _layer:getPositionY();
            return ;
        end

        local mdistance = cc.pGetDistance(p1,p2);
        mscale = mdistance/distance * mscale;
        distance = mdistance;
        _layer:setScale(mscale);

        --这个因子是为了解决这个算法 中点飘得问题 当缩放比例较小时 缩放中心点 会比较怪
        local factor = math.min(1,_layer:getScale());
        local x = (pMid.x - deltaX) * factor;
        local y = (pMid.y - deltaY) * factor;
        _layer:setPosition(cc.p(x,y));
        deltaX = pMid.x - _layer:getPositionX();
        deltaY = pMid.y - _layer:getPositionY();

    end

    --
end

local function onTouchEnd(touch,event)
    if(#touch == 1)then --single touch

        if(lastMove)then
            --lastMove = cc.pMul(lastMove,5);
            if(math.abs(lastMove.x) <= DIS_MIN and math.abs(lastMove.y) <= DIS_MIN)then
                return;
            end
            _layer:scheduleUpdate(autoMoveMap);
        else
            return;
        end

    else --multi touch
    end
end

local function loadTileMap()
    _tileMap = ccexp.TMXTiledMap:create("map.tmx");
    _treeTileLayer = _tileMap:getLayer("trees");
    _grassTileLayer = _tileMap:getLayer("grass");
    _tileMap:setScale(2);
    return _tileMap;
end

local function createLayer()
    _layer = cc.Layer:create();
    _layer:addChild(loadTileMap());
    _layer:setTouchEnabled(true);

    local listener = cc.EventListenerTouchAllAtOnce:create();
    listener:registerScriptHandler(onTouchBegin,cc.Handler.EVENT_TOUCHES_BEGAN);
    listener:registerScriptHandler(onTouchMove,cc.Handler.EVENT_TOUCHES_MOVED);
    listener:registerScriptHandler(onTouchEnd,cc.Handler.EVENT_TOUCHES_ENDED);

    _layer:getEventDispatcher():addEventListenerWithSceneGraphPriority(listener,_layer);
    return _layer;
end

local function createScene()
    _scene = cc.Scene:create();
    _scene:addChild(createLayer());
    return _scene;
end

local function main()
    cc.Director:getInstance():runWithScene(createScene());
end

xpcall(main, __G__TRACKBACK__)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-18 14:05:37

COCOS2dx 实现地图缩放和拖动/拖动助力的相关文章

js实现移动端图片预览:手势缩放, 手势拖动,双击放大...

.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > .katex-html { display: block; } .katex-display > .katex > .katex-html > .tag { position: absolute; right: 0px; } .katex { font-style: normal; font

地图缩放后Marker偏移的问题

最近在做地图开发,遇到一个小坑,记录在这里. 按照高德地图的文档,初始化Marker(图标)并将其放置到地图上,示例如下: var marker = new AMap.Marker({ icon: "http://www.easyicon.net/api/resizeApi.php?id=1185658&size=32", position: [120.1, 30.1] }); 本以为就可以这样简简单单地完成了,结果却发现当地图缩放的时候,图标会有一个偏移.例如当地图缩放比例很

Cocos2d-x Tiled地图编辑器(二)精灵走动起来、碰撞检测

图: 程序代码: 头文件声明函数及变量 void registerWithTouchDispatcher(void); bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); void setViewpointCenter(CCPoint position) ; void setSpritePoint(CCPoint position) ;

Cocos2d-x Tiled地图编辑器(一)基本使用

8.2 模板 String模块包含一个用途广泛的类,此类为最终用户的编辑提供了简单的语法支持.这让用户不修改应用程序的前提下实现他们应用程序的定制. 这种格式使用$加有效的python标识符(数字.字母和下划线)形式的占位符名称.通过在占位符两侧使用大括号便可以不用空格分隔在其后面跟随更多的字母和数字字符.使用$$来创建一个单独$转码字符. >>> from string import Template >>> t = Template('${village}folk 

openLayers地图缩放的回调

//设置地图最小缩放级别为17级 map.events.register("zoomend", this, function (e) { //每次地图缩放时就会进入到这 if (map.getZoom() < 17) { //map.zoomTo(17); map.setCenter(map.getCenter(),17); } }); 原文地址:https://www.cnblogs.com/1rookie/p/8485454.html

图片居中按比例显示、鼠标滚动缩放、鼠标拖动平移

1.为了居中显示,考虑到div不好设置,用table做边框 缩放原理:调整图片宽高.定位left.top: 平移:鼠标事件位置.定位left.top. 目前贴出实现代码,具体研究内容再做补充 下面是源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <h

监听Echarts 里的地图缩放事件

 // 获取百度地图实例,使用百度地图自带的控件     var bmap = myChart.getModel().getComponent('bmap').getBMap();     bmap.setMapStyle({style:'normal'});     bmap.addControl(new BMap.MapTypeControl());     bmap.addControl(new BMap.ScaleControl());      bmap.addControl(new 

【Android】高德地图 缩放级别及像素以及地图上的点转化成屏幕上的点

/** * 调节地图到正好放置查询范围的所有点 * @param centerLatLng 中心点 * @param range 查询范围(米) */  private void adjustCamera(LatLng centerLatLng,int range) {  //http://www.eoeandroid.com/blog-1107295-47621.html //当前缩放级别下的比例尺  //"每像素代表" + scale + "米" float s

Android自定义百度地图缩放图标

自定义实现Android百度地图的缩放图标,需要自定义一个缩放控件,实现效果如下: 这里的缩放效果,实现了点击按钮可以对地图的放大缩小,通过手势放大与缩小也控制缩放图标的可用状态.具体实现如下: 首先是drawable目录下的两个xml配置文件: zoom_selector_in.xml <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schem