1. 拖动地图
1.1 地图移动原理
地图tiledMap是CCLayer的child,把tiledMap的锚点设置成(0.5,0.5),然后setPosition到VisibleSize的中心,那么地图的中心就和屏幕的中心重合了。
拖动地图的原理是,移动tiledMap精灵的position,即实质是地图在移动,而看起来好像屏幕在移动。
1.2 得到划动向量
在ccTouchesBegan确定起始触摸点,然后在ccTouchesMoved确定触摸终止点,得到向量vec即划动屏幕时的一个短时段内的划动向量。
把这个划动向量加到tiledMap的getPosition上,即可划动地图。该向量的正负和因子(比如乘以0.3)根据个人习惯调整。
2. 主角跟随
当游戏的主角在地图上走动时,如何让他始终都在屏幕的中心:
2.1 确定地图的中心(a,b),确定主角的位置(x,y),得到地图中心到主角的向量vec=(x-a,y-b)。
2.2 每次主角移动时,同时把tiledMap从(a,b)一个偏移向量,代码如下:
CCPoint offset = mapCenterPos - rolePos;
CCPoint newMapPos = mapCenterPos +offset;
这个方法很简单,但是我当时想了很久。
3. 地图越界
当划动地图或者主角跟随时,可能会出现地图越界的情况,比如把整个地图划动到屏幕外边。解决方案如下代码:
// screenSize是visibleSize即屏幕的尺寸 // _mapContentSize是包裹地图的最小矩形的尺寸 _xRight = screenSize.width - _mapContentSize.width / 2; _xLeft = _mapContentSize.width / 2; _yUp = _mapContentSize.height / 2; _yDown = screenSize.height - _mapContentSize.height / 2; // newPos是计算出的地图将要移动到的位置 if(newPos.x < _xRight) newPos.x = _xRight; if(newPos.x > _xLeft) newPos.x = _xLeft; if(newPos.y > _yUp) newPos.y = _yUp; if(newPos.y < _yDown) newPos.y = _yDown;