做一款像素游戏,需要确定地图的边界,保证人物的位置位于屏幕中央,到达地图左边界,地图位置不变,人向左走,到达右边界,地步位置不变,人向右走
如:地图左边,右边,上边空出的边界,还有下方留出操作按钮
这种游戏一般情况下地图会大于窗口大小,人物要保持在屏幕(或窗口)中央,设置地图的位置,地图的位置应该是[win_size.width– Map_SpaceX –map_size.width,left_space],上下和左右原理相同
Map_SpaceX 地图左右留出空间一般情况下相等
Map_SpaceTop 地图上方空间
Map_SpaceBottom 地图下方空间(留出按钮大小)
Size map_size 地图大小
Size win_size 窗口大小(可以是一个view大小,也可以是窗口)
左边界:
右边界:
- /**
- * @brief adjustMapPos 调整地图的位置,保证人物在屏幕中央(左右边界特殊处理),人物在地图坐标系内
- * @param map 地图节点
- * @param map_origin_size 地图原始大小(没有缩放)
- */
- void adjustMapPos(cocos2d::Node *map, const cocos2d::Size &map_origin_size)
- {
- // 外界我们可以将地图放大mViewScale倍, 效果等效于将视图窗口缩小mViewScale倍
- cocos2d::Size win_size = mViewSize / mViewScale;
- cocos2d::Size map_size = map_origin_size;
- cocos2d::Point ptRole = mTargetPos;
- int MAP_SPACE_X = Configure::Map_SpaceX;
- int MAP_SPACE_BOTTOM = Configure::Map_SpaceBottom;
- int MAP_SPACE_TOP = Configure::Map_SpaceTop;
- float x = 0.f;
- float y = 0.f;
- if (map_size.width >= win_size.width - MAP_SPACE_X * 2) {
- if (MAP_SPACE_X + ptRole.x <= win_size.width/2) {
- x = MAP_SPACE_X;
- } else if (map_size.width - ptRole.x + MAP_SPACE_X <= win_size.width/2 ) {
- x = (win_size.width - MAP_SPACE_X) - map_size.width;
- } else {
- x = win_size.width/2 - ptRole.x ;
- }
- } else {
- x = (win_size.width - map_size.width)/2;
- }
- if (map_size.height >= win_size.height - MAP_SPACE_TOP - MAP_SPACE_BOTTOM) {
- if (ptRole.y + MAP_SPACE_BOTTOM <= win_size.height/2) {
- y = MAP_SPACE_BOTTOM;
- } else if (map_size.height - ptRole.y + MAP_SPACE_TOP <= win_size.height/2) {
- y = win_size.height - MAP_SPACE_TOP - map_size.height;
- } else {
- y = win_size.height/2 - (ptRole.y);
- }
- } else {
- y = MAP_SPACE_BOTTOM;
- }
- map->setPosition(x, y );
- }
这种根据地图放大比例来缩小视图比例的做法可以保证在一个控件窗口内预览一个场景