时间 2013-08-12 19:21:08
CSDN博客
相似文章 (0)
原文 http://blog.csdn.net/mydreamremindme/article/details/9933105
添加到推刊
当精灵在场景中移动的时候,不可能只限制在地图的那一部分内移动吧。。我们还需要看到地图更多的东西,这时就需要场景跟随着精灵移动。我们假设精灵在任何一点都需要场景的移动。
void HelloWorld::screenMove(CCPoint point) { float x=heroSprite->getPosition().x; float y=heroSprite->getPosition().y; x=MAX(x,screenSize.width/2); y=MAX(y,screenSize.height/2); x=MIN(x,mapSize.width*mapTileSize.width-screenSize.width/2); y=MIN(y,mapSize.height*mapTileSize.height-screenSize.height/2); CCPoint targetPosition=CCPoint(screenSize.width/2-x,screenSize.height/2-y); this->setPosition(targetPosition); }
当精灵在场景中移动的时候,不可能只限制在地图的那一部分内移动吧。。我们还需要看到地图更多的东西,这时就需要场景跟随着精灵移动。我们假设精灵在任何一点都需要场景的移动。
x=MAX(x,screenSize.width/2); y=MAX(y,screenSize.height/2);两层意思:如果精灵的任何一个方向(x,y)的位置的值大于屏幕的大小,那么就需要移动将屏幕中心移动到该点(这是我的这个游戏的设定,其他的也可以),如果精灵就是在地图的左下角那一部分(0,0)到(screenSize.width/2,screenSize.height/2),那么我们还是一样的想法,只不过这次是将屏幕中心移动原来的屏幕中心,实际上还是没有移动。
但是我们不能一直这么移动下去吧。。如果窗口显示出了不存在地图的那部分(黑色),那这游戏就是失败的。。
x=MIN(x,mapSize.width*mapTileSize.width-screenSize.width/2); y=MIN(y,mapSize.height*mapTileSize.height-screenSize.height/2);这就是限制我们的屏幕中心的方法,屏幕中心的范围是从 ( screenSize.width/2, screenSize.height/2 )到(mapSize.width*mapTileSize.width-screenSize.width/2,mapSize.height*mapTileSize.height-screenSize.height/2)
此时我们的(x,y)就是屏幕中心最终要到的地方,(书上说是精灵要到的地方,我觉得不太好理解,甚至感觉不是这样的,比如:精灵就在(0,0)到 ( screenSize.width/2, screenSize.height/2 )这部分之内,精灵实际的位置还是在x,y没改变之前的那个位置,因为测试x,y已经变成了 screenSize.width/2, screenSize.height/2。这是屏幕中心的位置啊!!我很费解。所以 擅自把它给 改了)。屏幕要移动到(x,y),那么就需要场景从(screenSize.width/2-x,screenSize.height/2-y)这个方向去移动,屏幕肯定不会移动了啦,移动的是场景。。
this->setPosition(targetPosition);
这就是场景移动的算法。这样写估计性能不是太好,但是简单吧。。
因为场景移动是每时每刻都要监测的,所以要放在update()中。。