zoukankan      html  css  js  c++  java
  • Cocos2d-X开发中国象棋《三》開始场景的实现

    在前面两节(第一节第二节)中介绍了中国象棋的功能和project文件。在这篇博客中将介绍中国象棋的開始场景的实现

    在写代码前先理清一下实现開始场景的思路:

    1、打开游戏后进入開始场景,场景上显示一个红色的帅和黑色的将。而且两个棋子在同一条直线上(两个棋子的y坐标同样)

    2、当玩家单击红色后,红色的帅一边向右移动一边依照顺时针方向旋转,黑色的将一边向左移动一边依照逆时针方向旋转

    3、当玩家单击黑色后,红色的帅一边向右移动一边依照顺时针方向旋转。黑色的将一边向左移动一边依照逆时针方向旋转

    4、当两个棋子相撞后进入游戏场景(两个棋子的距离小于或者等于棋子的直径)

    5、假设玩家单击的是红色的帅,玩家的棋子为红色

    6、假设玩家单击的是黑色的将,玩家的棋子为黑色


    SceneStart.h和SceneStart.cpp用于实现開始场景

    实现代码:

    SceneStart.h中的代码

    #ifndef  _SceneStart_H_
    #define _SceneStart_H_
    
    #include "cocos2d.h"
    USING_NS_CC;
    
    class SceneStart : public CCLayer
    {
    public:
        static CCScene* scene();
    
        bool init();
    
        CREATE_FUNC(SceneStart);
    
        bool ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent);
        void ccTouchEnded(CCTouch* pTouch, CCEvent* pEvent);
    
        CCSprite* _red;
        CCSprite* _black;
    
        void update(float);
    
        //标记是否选中了红色棋子
         bool _selected;
    };
    
    #endif
    


    SceneStart.cpp中的代码

    #include "SceneStart.h"
    #include "SceneGame.h"
    
    
    CCScene* SceneStart::scene()
    {
        CCScene* scene = CCScene::create();
    
        SceneStart* layer = SceneStart::create();
    
        scene->addChild(layer);
    
        return scene;
    }
    
    
    bool SceneStart::init()
    {
        CCLayer::init();
    
        CCSize winSize = CCDirector::sharedDirector()->getWinSize();
    
        CCSprite* bkr = CCSprite::create("bkg2.png");
        addChild(bkr);
    
        CCSprite* bkb = CCSprite::create("bkg1.png");
        addChild(bkb);
    
        bkr->setPosition(ccp(winSize.width / 2 - 100, winSize.height / 2));
        bkb->setPosition(ccp(winSize.width / 2 + 100, winSize.height / 2));
    
        _red = bkr;
        _black = bkb;
    
        //注冊触摸事件
        setTouchEnabled(true);
        setTouchMode(kCCTouchesOneByOne);
       
        return true;
    }
    
    
    bool SceneStart::ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent)
    {
        return true;
    }
    
    
    void SceneStart::ccTouchEnded(CCTouch* pTouch, CCEvent* pEvent)
    {
         CCSize winSize = CCDirector::sharedDirector()->getWinSize();
    
        //获得触摸点的位置(坐标)
        CCPoint ptClick = pTouch->getLocation();
    
        //用于推断是否点中了棋子
        bool bClickStone = false;
    
        //当点中红色的棋子的时候(触摸点的位置在红色的棋子所在的范围内)
        if(_red->boundingBox().containsPoint(ptClick))
        {
            //点中了红色的棋子
            this->_selected = true;
    
            //点中了棋子
            bClickStone = true;
        }
        //当点中黑色棋子的时候(触摸点的位置在黑色棋子所在的范围内)
        else if(_black->boundingBox().containsPoint(ptClick))
        {
            //没点中红色棋子
            this->_selected = false;
    
            //点中了棋子
            bClickStone = true;
        }
    
        //当点中了棋子的时候
        if(bClickStone)
        {
            //移动棋子
            CCMoveTo* moveTo1 = CCMoveTo::create(1, ccp(winSize.width / 2, winSize.height / 2));
            CCMoveTo* moveTo2 = CCMoveTo::create(1, ccp(winSize.width / 2, winSize.height / 2));
        
            //旋转棋子
            CCRotateBy* rotate1 =  CCRotateBy::create(1, 360);
            CCRotateBy* rotate2 =  CCRotateBy::create(1, -360);
    
            //旋转和移动同一时候运行
            CCSpawn* spawn1 = CCSpawn::create(moveTo1, rotate1, NULL);
            CCSpawn* spawn2 = CCSpawn::create(moveTo2, rotate2, NULL);
    
            //运行行动作
            _red->runAction(spawn1);
            _black->runAction(spawn2);
    
            //启动定时器
             scheduleUpdate();
        }
    }
    
    
    void SceneStart::update(float)
    {
        //获取两个棋子的x坐标
        float x1 = _red->getPositionX();
        float x2 = _black->getPositionX();
    
        //当红色的棋子和黑色的棋子碰撞后
        //两个棋子的距离小于或等于棋子的直径
        //getContentSize().width获得棋子的宽度(棋子的直径)
        if(abs(x1 - x2) <= _red->getContentSize().width)
        {
            //进入游戏
            CCDirector::sharedDirector()->replaceScene(SceneGame::scene(this->_selected));
        }
    }

    运行结果:

    

  • 相关阅读:
    罗辑思维 140 认钱不认人(刚需是扯淡,一切都是稀缺,人生全是选择)——理性永远都是最珍贵的
    程序最多能new多少内存(2G内存里要放程序的5大区,HeapAlloc比new要快多了,而且超过2G的时候会告诉你)
    Qt中使用ActiveX(3篇)
    windows下的socket网络编程(入门级)
    网络数据包发送工具PacketSender中文源码
    avalon.js实现一个简易日历
    avalonJS入门(一)
    JS中的模块规范(CommonJS,AMD,CMD)
    程序员必看的书
    简单的语音聊天室
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6908020.html
Copyright © 2011-2022 走看看