cocos2dx 3.x 拼图小游戏

cocos2dx 3.x 拼图小游戏

.h

#define IMAGE_MAX 2     //图片的个数..

//图片结构体 属性
struct IMAGE_DATA
{
    cocos2d::Sprite *m_pImage;
    bool m_bOpen;
    int m_iId;
};

    bool onTouchBegan(cocos2d::Touch *pTouch, cocos2d::Event *pEvent);
    void onTouchMoved(cocos2d::Touch *pTouch, cocos2d::Event *pEvent);
    void onTouchEnded(cocos2d::Touch *pTouch, cocos2d::Event *pEvent);

    //返回精灵的碰撞矩形
    cocos2d::Rect GetBackRect( cocos2d::Sprite *spr );
    //添加图片
    void AddImage(std::string name, cocos2d::Vec2 pos, int id);
    //添加背景
    void AddBack(std::string name, cocos2d::Vec2 pos, int id);
    //图片数组
    std::vector< IMAGE_DATA > m_vSpr;
    //背景数组
    std::vector< IMAGE_DATA > m_vBack;
    //通关判断
    bool m_bWin;
    //图片显示最上层
    int m_iOrder;
    //定时器
    void update(float dt);


.cpp

    //注册触摸
    EventListenerTouchOneByOne *listener = EventListenerTouchOneByOne::create();
    listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan,this);
    listener->onTouchMoved = CC_CALLBACK_2(HelloWorld::onTouchMoved,this);
    listener->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded,this);
    listener->setSwallowTouches(true);

    Size size = Director::getInstance()->getWinSize();
    m_bWin = false;
    m_iOrder = 0;
    //图片素材
    std::string image_name[] = {"HelloWorld.png", "white.png"};

    //图片随机出现位置
    srand((unsigned int)time(0));//随机种子
    std::vector< Vec2 > image_pos;
    for (int i = 0; i < IMAGE_MAX; i++)
    {
        float x = rand() %  ((int)size.width / 4);
        float y = rand() %  ((int)size.height / 2);
        image_pos.push_back(Vec2( x + size.width / 8, y + size.height / 4 ));
        log("x ==  %f, y == %f, x1 === %f, y1 === %f", image_pos[i].x, image_pos[i].y, x, y);
    }

    //需要拼接的背景以及位置
    std::string back_name[] = {"red.png", "blue.png"};
    Vec2 back_pos[] = {Vec2(size.width * .75f, size.height * .25f), Vec2(size.width * .75f, size.height * .75f)};

    for (int i = 0; i < IMAGE_MAX; i++)
    {
        //添加
        AddImage(image_name[i], image_pos[i], i + 1);
        AddBack(back_name[i], back_pos[i], i + 1);
    }
    
    //注册精灵监听
    for (int i = 0 ; i < m_vSpr.size(); i++)
    {
        if (i == 0)
            _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, m_vSpr[i].m_pImage); 
        else
            _eventDispatcher->addEventListenerWithSceneGraphPriority(listener->clone(), m_vSpr[i].m_pImage);  
    }
    //开启定时器
    scheduleUpdate();

 

void HelloWorld::AddImage(std::string name, Vec2 pos, int id){
    //新建图片
    IMAGE_DATA image;
    image.m_pImage = Sprite::create(name.c_str());
    image.m_pImage->setPosition(pos);
    addChild(image.m_pImage);
    image.m_bOpen = true;
    image.m_iId = id;
    m_vSpr.push_back(image);
}

 

void HelloWorld::AddBack(std::string name, Vec2 pos, int id){
    //新建背景图片
    IMAGE_DATA image;
    image.m_pImage = Sprite::create(name.c_str());
    image.m_pImage->setPosition(pos);
    addChild(image.m_pImage, -1);
    image.m_iId = id;
    m_vBack.push_back(image);
}

 

bool HelloWorld::onTouchBegan(cocos2d::Touch *pTouch, cocos2d::Event *pEvent){
    
    //获取当前点击的精灵
    Sprite* target = static_cast<Sprite*>(pEvent->getCurrentTarget());

    if (target->getBoundingBox().containsPoint(pTouch->getLocation()))
    {
        for(int i = 0; i< m_vSpr.size(); i++)
        {
            //点击的精灵触摸关闭 返回false
            if(target == m_vSpr[i].m_pImage && !m_vSpr[i].m_bOpen)
                return false;
        }

        m_iOrder++;
        //当前点击的精灵放到最上层
        target->setLocalZOrder(m_iOrder);
        return true;
    }

    return false;
}

 

void HelloWorld::onTouchMoved(cocos2d::Touch *pTouch, cocos2d::Event *pEvent){
    
    Sprite* target = static_cast<Sprite*>(pEvent->getCurrentTarget());
    
    for (int i = 0; i < m_vSpr.size(); i++)
    {
        //点击的精灵触摸关闭 退出
        if(target == m_vSpr[i].m_pImage && !m_vSpr[i].m_bOpen)
            return;
        
        for (int j = 0; j < m_vBack.size(); j++)
        {
            //判断图片是否碰撞到背景 ID是否相等 触摸是否关闭
            if (GetBackRect( m_vBack[j].m_pImage ).containsPoint(m_vSpr[i].m_pImage->getPosition()) && m_vBack[j].m_iId == m_vSpr[i].m_iId && m_vSpr[i].m_bOpen)
            {
                //碰撞到 把图片移动到背景上 触摸关闭
                m_vSpr[i].m_pImage->setPosition(m_vBack[j].m_pImage->getPosition());
                m_vSpr[i].m_bOpen = false;
                return;
            }
        }
    }

    //触摸的图片移动
    target->setPosition(target->getPosition() + pTouch->getDelta());
}

 

void HelloWorld::update(float dt){
    
    if (!m_bWin)
    {
        //全部触摸关闭..代表通关
        m_bWin = true;
        for (int i = 0; i < m_vSpr.size(); i++)
        {
            if(m_vSpr[i].m_bOpen == true){
                m_bWin = false;
            }
        }
    }

    if (m_bWin)
    {
        //过关
        log("cheng gong");
        unscheduleUpdate();
    }
    
} 

 

Rect HelloWorld::GetBackRect( Sprite *spr ){
  //返回精灵的碰撞矩形
Vec2 origin
= spr->getPosition(); Size size = spr->getContentSize(); return Rect( origin.x - size.width * .1f, origin.y - size.height * .1f, size.width * .1f, size.height * .1f ); }

 

posted @ 2017-03-03 14:58 HaoK 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值