展会信息港展会大全

COCOS2dx 实现地图缩放和拖动/拖动助力
来源:互联网   发布日期:2015-09-28 15:14:47   浏览:4345次  

导读: 下面是lua版本的具体代码 缩放算法大致和http://blog.csdn.net/somestill/article/details/10581277相同,做了一些优化 他的算法有bug c...

下面是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__)

赞助本站

人工智能实验室
AiLab云推荐
推荐内容
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港