• 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));
        }
    }

    运行结果:

    

  • 相关阅读:
    VS2012 for SharePoint2013 Tool安装
    SharePoint 2013网站管理网站策略(关闭和删除策略)
    呼风唤雨的公交
    ASP、Access、80040e14、保留关键字、INSERT INTO 语句的语法错误
    表格边框设置
    DotNet开发中关于SQLServer连接的两种方法之比较
    SQL语句集锦
    动态网页设计笔记
    SQL SERVER中日期 where 问题的解决
    配置你的ASP.NET运行环境
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6908020.html
Copyright © 2020-2023  润新知