现在的位置: 首页 > 综合 > 正文

cocos2dx 实现横版游戏中屏幕随精灵移动

2014年08月29日 ⁄ 综合 ⁄ 共 1811字 ⁄ 字号 评论关闭

       在横版游戏中,实现屏幕随精灵移动而移动,要实现这个,首先要明白这个问题中的变与不变:

              不变:地图位置;

              变:精灵的位置、屏幕(或理解为所在图层)的位置;

       故,说是滚动地图,其实是图层滚动;


       从不变入手,首先要知道地图(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);
	}
}

抱歉!评论已关闭.