在横版游戏中,实现屏幕随精灵移动而移动,要实现这个,首先要明白这个问题中的变与不变:
不变:地图位置;
变:精灵的位置、屏幕(或理解为所在图层)的位置;
故,说是滚动地图,其实是图层滚动;
从不变入手,首先要知道地图(CCTMXTileMap)的两个方法:
1、map->getMapSize():地图的图块数
2、map->getTileSize():每一个图块的宽高
再而分析变:
精灵先移动,屏幕根据精灵移动的坐标去调整;
总体分析前,先计算如下几个数值:
地图宽度:tw=tilemap->getMapSize().width*tilemap->getTileSize().width;
地图高度:th=tilemap->getMapSize().height*tilemap->getTileSize().height;
屏幕宽度:ww=winsize.width;
屏幕高度:wh=winsize.height;
精灵坐标:x,y;
总体分析:首先准确判定精灵移动后的坐标,因为我们大部分游戏中的精灵都是一个图片,不是一个点,精灵的坐标到其图片的左右边和上下边是有距离的,分别为上图(此图出自时空猎人,其代码实现与本文无关)中的A边和B边,所以,整个精灵的水平坐标显示是有范围的(A<=x<=tw-A),而精灵的垂直坐标是同理的。这时,精灵坐标是能确定的,接下来是屏幕滚动了。屏幕滚动显然有以下三种情况:1、x<=ww/2;
2、ww/2<x<=tw-ww/2;3、tw-ww/2<x;在1情况,屏幕位置为(ww/2,wh/2);在2中,屏幕位置为(x,wh/2);在3中,屏幕位置为(tw-ww/2,wh/2);有很多人可能已经发现,屏幕垂直坐标是不用去改变的,因为横版游戏在垂直上是没有滚动的(屏幕高度=地图高度,当然这里是指大部分)。最后,将屏幕中点(ww/2,wh/2)减去上面三种情况的屏幕位置点,得出滚动的距离,将距离值以坐标形式代入setPosition()中。
完整代码如下:
void GameLayer::update(float dt) { this->_hero->updateDesiredPosition(dt); //设置英雄位置 float posX=MIN(this->_tilemp->getMapSize().width*this->_tilemp->getTileSize().width-this->_hero->_centerToSides,MAX(this->_hero->_centerToSides,this->_hero->_desiredPosition.x)); float posY=MIN(3*this->_tilemp->getTileSize().height+this->_hero->_centerToBottom,MAX(_hero->_centerToBottom,_hero->_desiredPosition.y)); this->_hero->setPosition(ccp(posX,posY)); //地图滚动 CCSize winSize=CCDirector::sharedDirector()->getWinSize(); int x=MAX(_hero->getPositionX(),winSize.width/2); int y=MAX(_hero->getPositionY(),winSize.height/2); x=MIN(x,(this->_tilemp->getMapSize().width*this->_tilemp->getTileSize().width)-winSize.width/2); CCPoint actualPosition=ccp(x,y); CCPoint centerOfView=ccp(winSize.width/2,winSize.height/2); CCPoint viewPoint=ccpSub(centerOfView,actualPosition); this->setPosition(viewPoint); } }