Cocos2d-X 瓦片地图使用的实例项目(包含碰撞检测,移动)

(1)头文件中

#include <iostream>

#include "cocos2d.h"

using namespace cocos2d;


class AA:public CCLayer

{

public:

    virtual bool init();

    static CCScene *scene();

    CREATE_FUNC(AA);

  

     CCSprite *_player;

    int count;

    bool mode;

    

    CCArray *bulletArray;

    CCArray *enemyArray;

    CCTMXTiledMap *_tileMap;

    CCTMXTiledMap *_titleMap;

    CCTMXLayer *wall,*foreground;

    CCPoint mapPoint,heroPoint,beginPoint;

     CCLabelTTF *label;

    //碰撞检测

    void detection();

    bool iscallision(CCSprite *mysprite,CCSprite *testsprite);

    CCRect getRect(CCSprite *sprite);


    //触摸事件

    virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);

    virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);

    virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);

    virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);

    

   

    void goon(CCNode *pSender);

    void toggleGame(CCObject *pSender);

    void targetFinish(CCNode *pSender);

};

(2)实现文件中

//

//  AA.cpp

//  date10

//

//  Created by Student on 14-9-22.

//

//


#include "AA.h"


CCScene *AA::scene()

{

    CCScene *s=CCScene::create();

    AA *layer=AA::create();

    s->addChild(layer);

    return s;

}


bool AA::init()

{

    if(!CCLayer::init())

    {

        return false;

    }

    mode=true;

    //初始化数组

    bulletArray = CCArray::create();

    bulletArray->retain();

    enemyArray = CCArray::create();

    enemyArray->retain();

    //加载瓦片地图

    _tileMap=CCTMXTiledMap::create("ThefirstTiled1.tmx");

    _tileMap->setPosition(mapPoint);

    addChild(_tileMap);

    //读取瓦片地图中的层和对象

    wall=_tileMap->layerNamed("wall");

    foreground=_tileMap->layerNamed("water");

    CCTMXObjectGroup *objects=_tileMap->objectGroupNamed("hero");

    CCDictionary  *spawnPoint=objects->objectNamed("pa");

    heroPoint.x=spawnPoint->valueForKey("x")->floatValue();

    heroPoint.y=spawnPoint->valueForKey("y")->floatValue();

    CCLog("x=%f,y=%f",heroPoint.x,heroPoint.y);

    //加载英雄到界面

    _player=CCSprite::create("www.png");

    _player->setAnchorPoint(CCPoint(0,0));

    _player->setPosition(heroPoint);

    _tileMap->addChild(_player,0);

    //加载敌人到界面

    for(int i=0;i<int(objects->getObjects()->count());i++) //得到敌人的数量

    {

        CCDictionary *enemy=(CCDictionary *)objects->getObjects()->objectAtIndex(i);

        if(enemy->valueForKey("n")->intValue()==1)

        {

            CCSprite *s=CCSprite::create("enemy1.png");

            float x=enemy->valueForKey("x")->floatValue();

            float y=enemy->valueForKey("y")->floatValue();

            s->setPosition(ccp(x,y));

            s->setAnchorPoint(CCPoint(0,0));

            _tileMap->addChild(s,4);

            enemyArray->addObject(s);

            CCActionInterval *move=CCMoveBy::create(0.5,CCPoint(_player->getPosition().x-s->getPosition().x>0?10:-10,_player->getPosition().y-s->getPosition().y>0?10:-10));

            //goon 表示不断的移动

            CCFiniteTimeAction *func=CCCallFuncN::create(this,callfuncN_selector(AA::goon));

            s->runAction(CCSequence::create(move,func,NULL));

        }

    }

    //加载开关选项

    CCMenuItem *oon,*ooff;

    oon=CCMenuItemImage::create("projectile-button-on.png","projectile-button-on.png");

    ooff=CCMenuItemImage::create("projectile-button-off.png","projectile-button-off.png");

    CCMenuItemToggle *toggle=CCMenuItemToggle::createWithTarget(this,

                                                                menu_selector(AA::toggleGame),

                                                                ooff,oon,NULL);

    CCMenu *menu=CCMenu::create(toggle,NULL);

    menu->setPosition(ccp(oon->getContentSize().width/2,oon->getContentSize().height/2));

    addChild(menu);

    //加入触摸的单例

   CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 1, true);

    //碰撞检测的调用

    this->schedule(schedule_selector(AA::detection), 0.2);

    

    

    label=CCLabelTTF::create("0","Arial",20);

    label->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width-label->getContentSize().width/2,label->getContentSize().height/2));

    addChild(label,10);

    return true;

}

//表示敌人不断移动的距离

void AA::goon(CCNode *pSender)

{

    CCLOG("goon");

CCSprite *s=(CCSprite *)pSender;

    CCActionInterval *move=CCMoveBy::create(0.5,CCPoint(_player->getPosition().x-s->getPosition().x>0?10:-10,_player->getPosition().y-s->getPosition().y>0?10:-10));

    CCFiniteTimeAction *func=CCCallFuncN::create(this,callfuncN_selector(AA::goon));

    s->runAction(CCSequence::create(move,func,NULL));

}


void AA::toggleGame(CCObject *pSender)

{

    mode=mode?false:true;

}


bool AA::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)

{

    beginPoint=pTouch->getLocation();

    return true;

}


void AA::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)

{

    /*

    if(mode)

    {

        //得到先前的坐标(0,0)

        CCPoint PP=pTouch->getPreviousLocation();

        //得到当前的坐标

        CCPoint np=pTouch->getLocation();

        //两坐标相减

        CCPoint dp=ccpSub(np, PP);

        //向左为负 右侧为正

        if(_titleMap->getPosition().x+dp.x>-480 &&  _titleMap->getPosition().x+dp.x<0)

        {

            mapPoint=ccp(_titleMap->getPosition().x+dp.x,0);

            _titleMap->setPosition(mapPoint);

        }

    }

     */

    if(mode)

{

        CCPoint pp=pTouch->getPreviousLocation();

        CCPoint np=pTouch->getLocation();

        CCPoint dp=ccpSub(np,pp);

        

        if(_tileMap->getPosition().x+dp.x>-480&&_tileMap->getPosition().x+dp.x<0)

        {

            mapPoint=ccp(_tileMap->getPosition().x+dp.x,0);

            _tileMap->setPosition(mapPoint);

        }

}

}

void AA::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)

{

    /*

     //地图里的坐标(0,0)是从左上角开始的

    步骤:

    1、判断是否点击

    2、判断点击的位置与英雄的位置的X,Y的差值     比较DX与DY的大小

    3、判断英雄的X做标要大于点击的X坐标  才能向左

    4、判断移动时是否撞击墙和移出地图外

     */

   //获得点击的位置

   

    /*

    CCPoint pp=pTouch->getLocation();

    if(mode)

    {

         //是点击不是滑动  在原地点击下又点击离开

        if(beginPoint.x==pp.x && beginPoint.y==pp.y)//beginPoint是开始触摸的位置

        {

            //—player的位置

            CCPoint pt=_player->getPosition();

           //判断是否 x>y

            if(fabs(pt.x-(pp.x-mapPoint.x))>=fabs( pt.y-(pp.y-mapPoint.y))    )

            {

               点击点向左移动   英雄的X做标要大于点击的X坐标  才能向左

                if(pt.x>=pp.x-mapPoint.x)

                {

                    

                    if(9-_player->getPosition().y/32<10 && 9-_player->getPosition().y/32>=0&&

                       _player->getPosition().x/32-1<50&&_player->getPosition().x/32-1>=0&&

                       !(wall->tileGIDAt(ccp(_player->getPosition().x/32-1,9-_player->getPosition().y/32))))//判断是否是地图外面,或者是不是墙

                    {

                        _player->setPosition(ccp(_player->getPosition().x-32,_player->getPosition().y));

                        if(foreground->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32)))

                        {

                            foreground->removeTileAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32));

                            count++;

                            CCString *temp=CCString::createWithFormat("%d",count);

                            label->setString(temp->getCString());

                        }

                    }

                    

                }

                else

                {

                    if(9-_player->getPosition().y/32<10&&9-_player->getPosition().y/32>=0&&_player->getPosition().x/32+1<50&&_player->getPosition().x/32+1>=0&&!(wall->tileGIDAt(ccp(_player->getPosition().x/32+1,9-_player->getPosition().y/32))))

                    {

                        _player->setPosition(ccp(_player->getPosition().x+32,_player->getPosition().y));

                        if(foreground->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32)))

                        {

                            foreground->removeTileAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32));

count++;

                            CCString *temp=CCString::createWithFormat("%d",count);

                            label->setString(temp->getCString());

                        }

                    }

                    

                }

            }

            else

            {

                if(pt.y>=pp.y-mapPoint.y)

                {

                    if(9-_player->getPosition().y/32+1<10&&9-_player->getPosition().y/32+1>=0&&_player->getPosition().x/32<50&&_player->getPosition().x/32>=0&&!(wall->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32+1))))

                    {

                        _player->setPosition(ccp(_player->getPosition().x,_player->getPosition().y-32));

                        if(foreground->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32)))

                        {

                            foreground->removeTileAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32));

count++;

                            CCString *temp=CCString::createWithFormat("%d",count);

                            label->setString(temp->getCString());

                        }

                    }

                }

                else

                {

                    if(9-_player->getPosition().y/32-1<10&&9-_player->getPosition().y/32-1>=0&&_player->getPosition().x/32<50&&_player->getPosition().x/32>=0&&!(wall->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32-1))))

                    {

                        _player->setPosition(ccp(_player->getPosition().x,_player->getPosition().y+32));

                        if(foreground->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32)))

                        {

                            foreground->removeTileAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32));

count++;

                            CCString *temp=CCString::createWithFormat("%d",count);

                            label->setString(temp->getCString());

                        }

                    }

                    

                }

            }

            

        }

}

    else

{

CCSprite *s=CCSprite::create("Projectile.png");

s->setPosition(_player->getPosition());

_tileMap->addChild(s,4);

        bulletArray->addObject(s);

float dx=pp.x-_player->getPosition().x;

float dy=pp.y-_player->getPosition().y;

if(dx>0)

{

float lx=32*30-_player->getPosition().x;

float ly=dy/dx*lx;

CCActionInterval *move=CCMoveBy::create(3,ccp(lx+s->getContentSize().width,ly));

CCFiniteTimeAction *ff=CCCallFuncN::create(this,callfuncN_selector(AA::targetFinish));

s->runAction(CCSequence::create(move,ff,NULL));

}

else

{

float lx=0-_player->getPosition().x;

float ly=dy/dx*lx;

CCActionInterval *move=CCMoveBy::create(3,ccp(lx-s->getContentSize().width,ly));

CCFiniteTimeAction *ff=CCCallFuncN::create(this,callfuncN_selector(AA::targetFinish));

s->runAction(CCSequence::create(move,ff,NULL));

}

}

    */

    

   CCPoint pp=pTouch->getLocation();

if(mode)//移动

{

        if(beginPoint.x==pp.x&&beginPoint.y==pp.y)

        {

            cocos2d::CCPoint pt=_player->getPosition();

            //dx>dy

            if(fabs(pt.x-(pp.x-mapPoint.x))>=fabs(pt.y-(pp.y-mapPoint.y)))

            {

                //左移

                if(pt.x>=pp.x-mapPoint.x)

                {

                    if(9-_player->getPosition().y/32<10&&9-_player->getPosition().y/32>=0&&

                       _player->getPosition().x/32-1<50&&_player->getPosition().x/32-1>=0&&

                       !(wall->tileGIDAt(ccp(_player->getPosition().x/32-1,9-_player->getPosition().y/32))))//判断是否是地图外面,或者是不是墙  //tileGIDAt表示有没有的意思

                    {

                        //32表示32个像素  表示向左挪动了1个单位

                        _player->setPosition(ccp(_player->getPosition().x-32,_player->getPosition().y));

                         //判断西瓜的和_player相撞

                        if(foreground->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32)))

                        {

                            //西瓜的位置消失

                            foreground->removeTileAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32));

                            count++;

                            CCString *temp=CCString::createWithFormat("%d",count);

                            label->setString(temp->getCString());

                        }

                    }

                }

                //右移

                else

                {

                    if(9-_player->getPosition().y/32<10&&9-_player->getPosition().y/32>=0&&_player->getPosition().x/32+1<50&&_player->getPosition().x/32+1>=0&&!(wall->tileGIDAt(ccp(_player->getPosition().x/32+1,9-_player->getPosition().y/32))))

                    {

                        _player->setPosition(ccp(_player->getPosition().x+32,_player->getPosition().y));

                        if(foreground->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32)))

                        {

                            foreground->removeTileAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32));

count++;

                            CCString *temp=CCString::createWithFormat("%d",count);

                            label->setString(temp->getCString());

                        }

                    }

                    

                }

            }

             //dx<dy

            else

            {

                //下移

                if(pt.y>=pp.y-mapPoint.y)

                {

                    if(9-_player->getPosition().y/32+1<10&&9-_player->getPosition().y/32+1>=0&&_player->getPosition().x/32<50&&_player->getPosition().x/32>=0&&!(wall->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32+1))))

                    {

                        _player->setPosition(ccp(_player->getPosition().x,_player->getPosition().y-32));

                        if(foreground->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32)))

                        {

                            foreground->removeTileAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32));

count++;

                            CCString *temp=CCString::createWithFormat("%d",count);

                            label->setString(temp->getCString());

                        }

                    }

                }

                 //上移

                else

                {

                    if(9-_player->getPosition().y/32-1<10&&9-_player->getPosition().y/32-1>=0&&_player->getPosition().x/32<50&&_player->getPosition().x/32>=0&&!(wall->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32-1))))

                    {

                        _player->setPosition(ccp(_player->getPosition().x,_player->getPosition().y+32));

                        if(foreground->tileGIDAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32)))

                        {

                            foreground->removeTileAt(ccp(_player->getPosition().x/32,9-_player->getPosition().y/32));

count++;

                            CCString *temp=CCString::createWithFormat("%d",count);

                            label->setString(temp->getCString());

                        }

                    }

                    

                }

            }

            

        }

}

    //英雄发射子弹

else

{

CCSprite *s=CCSprite::create("Projectile.png");

s->setPosition(_player->getPosition());

_tileMap->addChild(s,4);

        bulletArray->addObject(s);

float dx=pp.x-_player->getPosition().x;

float dy=pp.y-_player->getPosition().y;

if(dx>0)

{

float lx=32*30-_player->getPosition().x;

float ly=dy/dx*lx;

CCActionInterval *move=CCMoveBy::create(3,ccp(lx+s->getContentSize().width,ly));

CCFiniteTimeAction *ff=CCCallFuncN::create(this,callfuncN_selector(AA::targetFinish));

s->runAction(CCSequence::create(move,ff,NULL));

}

else

{

float lx=0-_player->getPosition().x;

float ly=dy/dx*lx;

CCActionInterval *move=CCMoveBy::create(3,ccp(lx-s->getContentSize().width,ly));

CCFiniteTimeAction *ff=CCCallFuncN::create(this,callfuncN_selector(AA::targetFinish));

s->runAction(CCSequence::create(move,ff,NULL));

}

}

}


void AA::targetFinish(CCNode *pSender)

{

    pSender->removeFromParent();

}

void AA::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent)

{


}

//碰撞检测

void AA::detection()

{

    /*

     1、英雄与敌人碰撞

     2、子弹与敌人碰撞

     */

    //遍历敌人

    for(int i=0;i<enemyArray->count();i++)

    {

        CCSprite *s=(CCSprite *)enemyArray->objectAtIndex(i);

        //判断英雄是否和敌人碰撞

        if(iscallision(_player, s))

        {

            CCLog("--------aaaaaaaa-------------");

        }

    }

    //创建临时的数组

    CCArray *bulletA=CCArray::create();

    CCArray *enemyA=CCArray::create();

    //遍历子弹

    for(int i=0;i<bulletArray->count();i++)

    {

        CCSprite *bullet=(CCSprite *)bulletArray->objectAtIndex(i);

        //遍历敌人

        for(int j=0;j<enemyArray->count();j++)

        {

            CCSprite *enemy=(CCSprite *)enemyArray->objectAtIndex(i);

            //判断子弹是否和敌人相撞

            if(iscallision(bullet, enemy))

            {

                //这里移除后应该加入数组  否则会崩溃

                enemy->removeFromParent();

                bullet->removeFromParent();

                bulletA->addObject(bullet);

                enemyA->addObject(enemy);

            }

        }

    }

    //从数组中移除子弹

    for(int i=0;i<bulletA->count();i++)

    {

        CCSprite *bullet = (CCSprite *) bulletA->objectAtIndex(i);

        bulletArray->removeObject(bullet);

    }

     //从数组中移除敌人

    for(int i=0;i<enemyA->count();i++)

    {

        CCSprite *enemy = (CCSprite *) enemyA->objectAtIndex(i);

        enemyArray->removeObject(enemy);

    }

}

//碰撞检测

bool AA::iscallision(CCSprite *mysprite,CCSprite *testsprite)

{

    CCRect myrect=mysprite->boundingBox();

    CCRect testrect=testsprite->boundingBox();

    return myrect.intersectsRect(testrect);

}










  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值