横版游戏的场景移动可以采用人物和主角所在的layer移动的方式来完成,背景不需要移动,这样能比较方便的实现缩放,固定粒子等效果,原理是cocos2d的父节点移动不会使子节点位置发生变动,不过需要注意的是触摸响应区的位置是以游戏窗口的相对位置来计算的,即使游戏元素的坐标没有跟着父节点改变,响应区的位置始终是固定的。
玩家超过屏幕一半位置后修正摄像机位置代码:
void GameLayer::setviewPointCenter(Point position) { Size winsize = Director::getInstance()->getWinSize(); int x = MAX(position.x, winsize.width / 2); int y = MAX(position.y, winsize.height / 2); x = MIN(x, (_tileMap->getMapSize().width * _tileMap->getTileSize().width) - winsize.width / 2); y = MIN(y, (_tileMap->getMapSize().height * _tileMap->getTileSize().height) - winsize.height / 2); Point actualPosition = ccp(x, y); Point centerOfView = ccp(winsize.width / 2, winsize.height / 2); Point viewPoint = ccpSub(centerOfView, actualPosition); this->setPosition(viewPoint); }
玩家人物移动代码:(getDesirePosition()为角色的每帧目标位置, 统一由gamelayer的updateSchedule函数调用(包括NPC的移动,摄像机的移动),深度排序等)
float posX = MIN(_tileMap->getMapSize().width * _tileMap->getTileSize().width - _hero->getCenterToSides(), MAX(_hero->getCenterToSides(), _hero->getDesirePosition().x)); float posY = MIN(3 * _tileMap->getTileSize().height + _hero->getCenterToBottom() , MAX(_hero->getCenterToBottom(), _hero->getDesirePosition().y)); _hero->setPosition(ccp(posX, posY));
cocos2d 3.0修改了以前版本的触摸响应方式,个人认为更科学了,也方便管理,给个例子代码:(_eventDispatcher为Node类的成员变量)
EventListenerTouchAllAtOnce *listener = EventListenerTouchAllAtOnce::create(); listener->onTouchesBegan = CC_CALLBACK_2(GameLayer::myTouchBegin, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
深度排序代码(_actors为SpriteBatchNode类的实例,测试代码中主角跟敌人都在一张纹理贴图中,所以能这么干>.<)
for (int i = 0; i < _actors->getChildren().size(); i++) { Node *node = _actors->getChildren().at(i); ActionSprite *as = (ActionSprite*)node; _actors->reorderChild(as, (_tileMap->getMapSize().height * _tileMap->getTileSize().height) - as->getPositionY()); }
PS: 3.0版本目前声音引擎的音效设置音量还未添加实现。。。 。。。
cocos2d-x 3.0笔记,布布扣,bubuko.com
原文:http://www.cnblogs.com/tiduswj/p/3585526.html