本文是在参考多人的博客文章后自己做练习的代码片段,如对原文感兴趣,可移步小满博客。
1、地图根据玩家位置的移动而移动
void MapScene::update(float dt){
//更改player的位置
CCPoint playerPos = m_player->getPosition();
playerPos.x += 1 * vmove;
m_player->setPosition(playerPos);
//根据player的位置动态移动map的位置
CCTMXTiledMap* map = (CCTMXTiledMap*)this->getChildByTag(kTagTileMap);
CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
int mapWidth = map->getMapSize().width * map->getTileSize().width;
int mapHeight = map->getMapSize().height * map->getTileSize().height;
float moveX = playerPos.x - visibleSize.width/2;
float moveY = playerPos.y - visibleSize.height/2;
//左右移动方向的控制
if (moveX < 0)
{
moveX = 0;
}
if (moveX > mapWidth - visibleSize.width)
{
moveX = mapWidth - visibleSize.width;
}
//上下移动方向的控制
if (moveY < 0)
{
moveY = 0;
}
if (moveY > mapHeight - visibleSize.height)
{
moveY = mapHeight - visibleSize.height;
}
map->setPosition(ccp(-moveX, -moveY));
}
(2)触摸效果
实现点击player的左边,player向左移动,点击右边向右移动,点击player停止移动。这里有一点需要注意,已在代码里标识。
bool MapScene::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent){
CCPoint m_beginPos = pTouch->getLocationInView();
m_beginPos = CCDirector::sharedDirector()->convertToGL(m_beginPos);
CCPoint playerPos = m_player->getPosition();
CCSize playerSize = m_player->getContentSize();
/*
在获得主角在屏幕中位置时要获得主角的绝对坐标,要加上地图的坐标,
因为我们设置主角的位置时,是设置在地图上的,所以主角的位置是相对与地图坐标的
*/
CCTMXTiledMap* map = (CCTMXTiledMap*)this->getChildByTag(kTagTileMap);
CCPoint mapPos = map->getPosition();
if(m_beginPos.x < playerPos.x - playerSize.width/2 + mapPos.x){
hmove = -1;
}else if (m_beginPos.x > playerPos.x + playerSize.width/2 + mapPos.x){
hmove = 1;
}else{
hmove = 0;
}
return true;
}