Tiled之跑酷游戏地图设计(金币 + 地图滚动 )

来源:互联网 发布:淘宝卖家中心联系电话 编辑:程序博客网 时间:2024/06/08 19:44

<1>数据成员。

public:void mapScroll(CCPoint touchPoint); //地图滚动void update(float dt); //更新void itTiled(); //初始化地图bool isExistTiled(CCPoint position);  //得到点击点所对应的砖块位置是否有砖块void testCrashHeroWithCoin(); //英雄和金币碰撞检测public:CC_SYNTHESIZE(CCTMXTiledMap*, _map, Map); //地图CC_SYNTHESIZE(CCTMXLayer*, _crashLayer, CrashLayer); //碰撞检测层CC_SYNTHESIZE(CCPoint, _viewPoint, ViewPoint);  //地图视图坐标点CC_SYNTHESIZE(CCSprite*, _hero, Hero); //英雄主角CC_SYNTHESIZE(CCArray*, _coinArray, CoinArray); //金币数据存储

<2>实现。

bool HelloWorld::init(){    //////////////////////////////    // 1. super init first    if ( !CCLayer::init() )    {        return false;    }    CCSize size = CCDirector::sharedDirector()->getWinSize();_map = CCTMXTiledMap::create("MyTiaoTest.tmx");addChild(_map);   _crashLayer = getMap()->layerNamed("crashLayer");    _viewPoint = ccp(size.width/2, size.height/2);_hero = CCSprite::create("noodledie.png");_hero->setAnchorPoint(ccp(0.5f, 0));_hero->setPosition(ccp(20, 360));addChild(_hero);_hero->setScale(0.5f);_coinArray = CCArray::create();_coinArray->retain();itTiled();scheduleUpdate();    return true;}void HelloWorld::mapScroll(CCPoint touchPoint) //地图的滚动。{ CCSize winSize=CCDirector::sharedDirector()->getWinSize();int x=MAX(touchPoint.x, winSize.width/2);int y=MAX(touchPoint.y, winSize.height/2);x=MIN(x,(this->getMap()->getMapSize().width*this->getMap()->getTileSize().width)-winSize.width/2);y=MIN(y,(this->getMap()->getMapSize().height*this->getMap()->getTileSize().height)-winSize.height/2);CCPoint actualPosition=ccp(x,y);CCPoint centerOfView=ccp(winSize.width/2,winSize.height/2);CCPoint viewPoint=ccpSub(centerOfView,actualPosition);  //v1 - v2 也就是第一个减去第二个this->setPosition(viewPoint);}void HelloWorld::update(float dt){_viewPoint = ccpAdd(_viewPoint, ccp(5, 0));getHero()->setPosition(ccpAdd(getHero()->getPosition(), ccp(5, 0)));mapScroll(_viewPoint);if(getHero()->getPositionY() > 0 && !isExistTiled(getHero()->getPosition())){getHero()->setPosition(ccpSub(getHero()->getPosition(), ccp(0, 5)));}else if(getHero()->getPositionY() == 0){getHero()->setPosition(ccpAdd(getHero()->getPosition(), ccp(0, 300)));}if(getHero()->getPositionX() >= getMap()->getContentSize().width - getHero()->getContentSize().width/2){unscheduleUpdate();}testCrashHeroWithCoin();}void HelloWorld::itTiled() //{CCTMXObjectGroup* group = getMap()->objectGroupNamed("coinLayer");  //对象层,比如金币什么的。CCArray* array = group->getObjects();CCObject* obj = NULL;CCARRAY_FOREACH(array, obj){CCDictionary* dic = dynamic_cast<CCDictionary*>(obj);float x = dic->valueForKey("x")->floatValue();float y = dic->valueForKey("y")->floatValue();CCSprite* sp = CCSprite::create("coin.png");sp->setPosition(ccpAdd(ccp(x, y), ccp(getMap()->getTileSize().width/2, getMap()->getTileSize().height/2)));addChild(sp);getCoinArray()->addObject(sp);}}bool HelloWorld::isExistTiled(CCPoint position)  //一个普通的图层,里面可以用资源画上一些砖块{   int x = position.x / getMap()->getTileSize().width;  int y = (getMap()->getContentSize().height - position.y) / getMap()->getTileSize().height;  int flag =  getCrashLayer()->tileGIDAt(CCPointMake(x, y));return flag != 0 ? true : false; }  void HelloWorld::testCrashHeroWithCoin(){/*第一种方法/CCObject* obj = NULL;CCARRAY_FOREACH(getCoinArray(), obj){CCSprite* coin = dynamic_cast<CCSprite*>(obj);if(coin->boundingBox().intersectsRect(getHero()->boundingBox()))coin->removeFromParent();}//*///*/CCArray* coinDeleteArray = CCArray::create();CCObject* obj = NULL;CCARRAY_FOREACH(getCoinArray(), obj){CCSprite* coin = dynamic_cast<CCSprite*>(obj);if(coin->boundingBox().intersectsRect(getHero()->boundingBox()))coinDeleteArray->addObject(coin);}//*第二种方法/CCARRAY_FOREACH(coinDeleteArray, obj){CCSprite* coin = dynamic_cast<CCSprite*>(obj);getCoinArray()->removeObject(coin);coin->removeFromParent();}//*/}
总结:金币在对象层coinLayer,而碰撞检测是在一个普通的图层crashLayer。

0 0