环境:VC2010+COCOX2.1.4。
效果:见图中6幅小图。
功能:实现精灵上下左右移动。
精灵在地图上移动,如果地图比当前屏幕尺寸要多,那么在移动时地图要跟精灵的移动方向相反。拿精灵上移来说,精灵整个上移过程中,positionY在增大,而地图则是向下在移动。让人视觉产生一种错觉,误以为是地图没动,只是精灵一直在往地图上方移动。这个上移过程中要注意2点:一是地图下移过程中要判断是否已经超出屏幕(如果超出屏幕,屏幕则一片黑,影响用户体验),地图上下左右应该是要铺满屏幕或理解为包裹住屏幕;二是地图不能再下移了(再下移就会出现多移的那部分会让屏幕变黑,影响用户体验),而精灵还能上移,则应该继续让精灵上移。
上代码之上移:
if (_map->getContentSize().height + _map->getPositionY() > _size.height + MAP_TILE_SIZE) { _map->setPosition(ccp(_map->getPositionX(), _map->getPositionY() - MAP_TILE_SIZE)); _spriteNpc->setPosition(ccp(_spriteNpc->getPositionX(), _spriteNpc->getPositionY() + MAP_TILE_SIZE)); } else if (_spriteNpc->getPositionY() < _map->getContentSize().height - MAP_TILE_SIZE - 25) {// 地图范围之内就可移动 _spriteNpc->setPosition(ccp(_spriteNpc->getPositionX(), _spriteNpc->getPositionY() + MAP_TILE_SIZE)); }IF判断中可理解为地图的左上角positionY要大于屏幕高度+地图块大小的高33(块大小宽高都设置成了33)。
ELSE IF判断中则是判断精灵positionY的坐标小于地图的高 - 33 - 25,即还在地图的有效范围之内。
上代码之左移:
if (_map->getPositionX() < 0) { _map->setPosition(ccp(_map->getPositionX() + MAP_TILE_SIZE, _map->getPositionY())); _spriteNpc->setPosition(ccp(_spriteNpc->getPositionX() - MAP_TILE_SIZE, _spriteNpc->getPositionY())); } else if (_spriteNpc->getPositionX() > _map->getPositionX() + MAP_TILE_SIZE) { _spriteNpc->setPosition(ccp(_spriteNpc->getPositionX() - MAP_TILE_SIZE, _spriteNpc->getPositionY())); }
if判断中地图的positionX要小于屏幕的positionX,大于就是屏幕在地图的左边了,超出那部分变黑,影响用户体验。
else if中是判断精灵是否还能继续向左移动。假如精灵在C点,此时地图不能再向右移动了,而C点还能继续向左移动,就就判断C点的positionX是否大于A点+33或者这样写也行:
} else if (_spriteNpc->getPositionX() > MAP_TILE_SIZE) {方便理解。