• 本文将基于cocos2dx来开发实现2048这款游戏开发环境 操作系统:win7 开发工具:Visual studio 2012 引擎版本:cocos2dx 3.6 游戏玩法 4*4的卡片布局,玩家通过手势上下左右滑动来累加卡片数值,...

    《2048》是一款在2014年意外窜红的数字游戏,玩法比较简单,而之后基于原版2048也衍生出了不少其他版本,火的一塌糊涂。本文将基于cocos2dx来开发实现2048这款游戏。

    这里写图片描述


    开发环境

    操作系统:win7
    开发工具:Visual studio 2012
    引擎版本:cocos2dx 3.6


    游戏玩法

    4*4的卡片布局,玩家通过手势上下左右滑动来累加卡片数值,直到累加到2048。为方便后面的开发上的逻辑更加清晰,具体玩法逻辑我们可以细分如下:

    • 开始时棋盘内随机出现两个数字,出现的数字仅可能为2或4
    • 玩家可以选择上下左右四个方向,若棋盘内的数字出现位移或合并,视为有效移动
    • 玩家选择的方向上若有相同的数字则合并,每次有效移动可以同时合并,但不可以连续合并
    • 合并所得的所有新生成数字想加即为该步的有效得分
    • 玩家选择的方向行或列前方有空格则出现位移
    • 每有效移动一步,棋盘的空位(无数字处)随机出现一个数字(依然可能为2或4)
    • 棋盘被数字填满,无法进行有效移动,判负,游戏结束
    • 棋盘上出现2048,判胜,游戏结束

    游戏实现

    了解了上述游戏玩法规则胡,接下来我们就基于cocos2dx来对游戏2048进行相关实现。

    1. 游戏场景创建

    根据我们对游戏的了解,主场景上主要显示信息有4*4的卡片布局矩阵,以及游戏分数的显示。因此我们创建GameScene类(Layer的子类),即游戏的主场景,负责游戏的基本信息的显示,同事还负责管理游戏的交互逻辑和分数更新。细分如下:

    • 游戏主要操作区卡片矩阵的创建显示;
    • 游戏交互处理(主要是Touch一类的操作);
    • 游戏结果更新、显示;
    • 其他(按钮控件、声音处理…)

    游戏主场景GameScene类的声明:

    #ifndef __GAME_SCENE_H__
    #define __GAME_SCENE_H__
    #include "cocos2d.h"
    #include "cardSprite.h"
    #include "MenuLayer.h"
    class GameScene :public cocos2d::Layer
    {
    public:
        static cocos2d::Scene* createScene();
        virtual bool init();
        CREATE_FUNC(GameScene);
    public:
        // Touch开始事件监听
        virtual bool onTouchBegan(cocos2d::Touch *pTouch, cocos2d::Event *pEvent);
        virtual void onTouchEnded(cocos2d::Touch *pTouch, cocos2d::Event *pEvent);
    
        // 上下左右四个方向的滑动操作处理
        bool moveLeft();
        bool moveRight();
        bool moveUp();
        bool moveDown();
        //创建4*4卡片矩阵
        void createCardMatrix (Size size);
        void randomCreateCard();
        //判断游戏赢输
        void checkGameWin();
        void checkGameOver();
    
        //重新开始游戏菜单项
        void restart(Ref *sender); 
    private:
        cocos2d::LabelTTF   *scoreLabel;
        LabelTTF            *restartBtn;                //重新开始的按钮
        LabelTTF            *isSoundBtn;                //声音切换按钮
        CardSprite          *cardArr[4][4];         //数字卡片矩阵
        CardSprite          *cardArrAction[4][4];   //用于动画的临时数字卡片矩阵
    
        MenuLayer           *menuLayer;             //菜单层
    
        Point               startPt;                    //触摸开始点
        int                 offsetX, offsetY;       //触摸水平和竖直方向偏移量
    
        int score;                                  //当前分数
        int bestScore;                              //最好分数
    
        bool sound;                                 //声音变量
    
        timeval tv;                                 //当前时间
    };
    #endif // __GAME_SCENE_H__

    :相关函数、变量在后续步骤中逐一说明。

    2. 卡片精灵CardSpirit

    卡片类是组成2048游戏的基础,4*4的方格的16个位置放置不同的卡片,每个位置为独立的一张卡片。每个卡片都有着各自的位置信息、数字信息、颜色信息等独特信息。因此,我们基于Sprite精灵类派生CarSprite类,封装实现卡片类。根据我们的分析,卡片类主要要实现的功能如下:

    • 卡片的创建及初始化;
    • 卡片属性更新(卡片数字、卡片背景颜色);

    卡片类CardSprite的声明:

    /** @class  GameMainScene
      * @brief  游戏主场景
      * @author 7-sevens
      * @date   2015/03/01
      */
    #ifndef __CARD_SPRITE_H__
    #define __CARD_SPRITE_H__
    #include "cocos2d.h"
    USING_NS_CC;
    class CardSprite :public Sprite
    {
    public:
        // 创建游戏卡
        static CardSprite* createCard(int num, int cardWidth, int cardHeight, float px, float py);
        virtual bool init();
        CREATE_FUNC(CardSprite);
        // 设置数字
        void setNumber(int num);
        // 获取数字
        int getNumber();
        LayerColor* getCardLayer();
    private:
        void cardInit(int num, int cardWidth, int cardHeight, float px, float py);
    
    private:
        LabelTTF    *cardLabel;     //卡片数字标签控件
        LayerColor  *cardBgColour;  //背景
    
        int number;
    };
    #endif // __CARD_SPRITE_H__

    我们可以从游戏中看到,每张卡片有背景颜色和一个数字,所以我们在头文件需要声明它这两个属性。

    卡片类CardSprite的相关实现:
    (1)卡片的创建初始化

    CardSprite* CardSprite::createCard(int num, int cardWidth, int cardHeight, float px, float py)
    {
        CardSprite *card = new CardSprite();
        if (!card->init())
        {
            CC_SAFE_RELEASE(card);
            return NULL;
        }
        card->autorelease();  //设置为自动回收
        card->cardInit(num, cardWidth, cardHeight, px, py);
        return card;
    }
    void CardSprite::cardInit(int num, int cardWidth, int cardHeight, float px, float py) 
    {
        number = num;
        cardBgColour = LayerColor::create(Color4B(200, 190, 180, 255), cardWidth - 5, cardHeight - 5);
        cardBgColour->setPosition(Point(px, py));
        if (number > 0) //如果有数字,则显示数字
        {
            cardLabel = LabelTTF::create(String::createWithFormat("%d", number)->getCString(), "Arial", 50);
            //因为是加入到父节点中,所以此处用相对坐标
            cardLabel->setPosition(cardBgColour->getContentSize().width / 2, cardBgColour->getContentSize().height / 2);
            cardBgColour->addChild(cardLabel); //将文字标签加入到卡片层
        }
        else    //否则则是空卡片
        {
            cardLabel = LabelTTF::create("", "Arial", 50);
            cardLabel->setPosition(cardBgColour->getContentSize().width / 2, cardBgColour->getContentSize().height / 2);
            cardBgColour->addChild(cardLabel);
        }
        //将卡片层加入到卡片精灵
        this->addChild(cardBgColour);  
    }

    每张卡片都有相同的宽和高,但数字和位置不同,数字是显示在背景中间的,所以在cardInit我们需要5个参数来初始化卡片的位置。

    (2)卡片属性设置

    void CardSprite::setNumber(int num)
    {
        number = num;
        //根据不同的数字范围显示不同的颜色
        if (number >= 0 && number < 16)
            cardLabel->setFontSize(50);
    
        if (number >= 16 && number < 128)
            cardLabel->setFontSize(40);
    
        if (number >= 128 && number < 1024)
            cardLabel->setFontSize(30);
    
        if (number >= 1024)
            cardLabel->setFontSize(20);
    
        if (number == 0)
            cardBgColour->setColor(Color3B(200, 190, 180));
    
        if (number == 2)
            cardBgColour->setColor(Color3B(240, 230, 220));
    
        if (number == 4)
            cardBgColour->setColor(Color3B(51, 153, 51));
    
        if (number == 8)
            cardBgColour->setColor(Color3B(255, 153, 102));
    
        if (number == 16)
            cardBgColour->setColor(Color3B(153, 204, 153));
    
        if (number == 32)
            cardBgColour->setColor(Color3B(153, 204, 255));
    
        if (number == 64)
            cardBgColour->setColor(Color3B(255, 204, 204));
    
        if (number == 128)
            cardBgColour->setColor(Color3B(204, 102, 0));
    
        if (number == 256)
    
            cardBgColour->setColor(Color3B(153, 204, 51));
    
        if (number == 512)
            cardBgColour->setColor(Color3B(255, 102, 102));
    
        if (number == 1024)
            cardBgColour->setColor(Color3B(204, 204, 255));
    
        if (number == 2048)
            cardBgColour->setColor(Color3B(255, 204, 00));
    
        if (number > 0)  //当数字大于0时才显示数字
            cardLabel->setString(String::createWithFormat("%d", number)->getCString());
        else  //否则显示空
            cardLabel->setString("");
    }
    //获得卡片数字
    int CardSprite::getNumber()
    {
        return number;
    }
    3. 添加卡片到游戏场景中

    卡片放置游戏主场景4*4矩形方阵中的不同位置,首先我们需要计算出每张卡片的宽高,然后计算每张卡片所在的位置,最后进行显示。

    在游戏主场景GameScene类中声明创建卡片的方法createCardMatrix:

    void GameScene::createCardMatrix (Size size)
    {
        int space = 5; //卡片间的间隔
        int cardSize = (size.width - 4 * space) / 4;
    
        //创建卡片矩阵
        for (int i = 0; i < 4; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                //最左边留白12,最下面留白size.height/6
                //坐标从左下角算起,右为正,上为正
                CardSprite *card = CardSprite::createCard(0, cardSize, cardSize, cardSize*i + 12, cardSize*j + 12 + size.height / 6);
                this->addChild(card);  //一定要把card添加到子节点才能渲染出来
                cardArr[i][j] = card;  //存到卡片矩阵
            }
        }
        //创建临时卡片矩阵,用于动画,每个动画卡片对应一个实际卡片的动画,
        //这是个技巧,并且动画层在卡片层之上,所以后加入,也可以设置addchild层次
        for (int i = 0; i < 4; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                //最左边留白12,最下面留白size.height/6
                CardSprite *card = CardSprite::createCard(0, cardSize, cardSize, cardSize*i + 12, cardSize*j + 12 + size.height / 6);
                this->addChild(card);
                cardArrAction[i][j] = card;
                //一开始把这层全部因此
                auto hide = Hide::create();
                cardArrAction[i][j]->getCardLayer()->runAction(hide);
            }
        }
    }

    随机生成卡片:

    void GameScene::randomCreateCard()
    {
        //在随机位置生成卡片
        int row = CCRANDOM_0_1() * 4;
        int col = CCRANDOM_0_1() * 4;
        if (cardArr[row][col]->getNumber() > 0)  //如果有数字,则递归调用
            randomCreateCard();
        else
        {
            cardArr[row][col]->setNumber(CCRANDOM_0_1() * 10 < 1 ? 4 : 2); //有10%的几率生成4
            //用动画效果生成
            auto action = Sequence::createWithTwoActions(ScaleTo::create(0, 0), ScaleTo::create(0.3f, 1)); //在0.3秒内从小缩放到大
            cardArr[row][col]->getCardLayer()->runAction(action);  //用卡片的层而不是卡片精灵本身做动作是为了使用局部坐标缩放
        }
    }

    游戏每一关操作时,初始的两张卡片位置需要随机生成。

    4. 游戏操作

    基于前面三步操作,游戏的基本场景框架已经搭建完成,所需信息也已经基本可以显示出来了。而接下来,就是我们需要实现的游戏交换操作。玩家在玩2048游戏时,手势是最频繁的操作,因此我们需要对手势所产生的事件进行监听。

    在游戏主场景GameScene类中声明监听事件:

    /**
    * Touch开始事件监听
    * @param[in] room_id 消息所属房间号
    * @param[in] result 消息内容及其他相关信息
    * @return bool
    */
    virtual bool onTouchBegan(cocos2d::Touch *pTouch, cocos2d::Event *pEvent);
    
    /**
    * Touch结束事件监听
    * @param[in] room_id 消息所属房间号
    * @param[in] result 消息内容及其他相关信息
    * @return void  无返回值
    */
    virtual void onTouchEnded(cocos2d::Touch *pTouch, cocos2d::Event *pEvent);

    一个是触摸开始的事件,一个是触摸结束的事件。

    然后再游戏主场景GameScene类的实现文件中实现这两个方法:
    (1) onTouchBegan事件

    bool GameScene::onTouchBegan(Touch *touch, Event *event)
    {
        // 记录当前时间
        gettimeofday(&tv, NULL); 
        // 保存开始触摸点
        startPt = touch->getLocation(); 
        // 判断如果触摸点在restart按钮区域内则重新开始
        if (restartBtn->getBoundingBox().containsPoint(restartBtn->convertToNodeSpace(touch->getLocation())))
            Director::getInstance()->replaceScene(TransitionFade::create(0.7f, GameScene::createScene()));
    
        // 声音开关
        if (isSoundBtn->getBoundingBox().containsPoint(isSoundBtn->convertToNodeSpace(touch->getLocation())))
        {
            sound = !sound;
            UserDefault::getInstance()->setBoolForKey("SOUND", sound);
            if (sound)
                isSoundBtn->setString("Sound On");
            else
                isSoundBtn->setString("Sound Off");
        }
        return true;
    }

    (2) onTouchEnded事件

    void GameScene::onTouchEnded(Touch *touch, Event *event)
    {
        timeval tv_end;
        gettimeofday(&tv_end, NULL);
        if (tv_end.tv_sec - tv.tv_sec > 3)
        {
            //开个后门,用来测试游戏赢了
            cardArr[0][3]->setNumber(2048);
            checkGameWin();
        }
        auto endPt = touch->getLocation();  //获得触摸结束点
        offsetX = endPt.x - startPt.x;      //计算偏移
        offsetY = endPt.y - startPt.y;
        bool isTouch = false; 
        if (abs(offsetX) > abs(offsetY))    //判断为方向
        {
            if (offsetX < -5)
                isTouch = moveLeft();
            else if (offsetX > 5)
                isTouch = moveRight();
        }
        else
        {
            if (offsetY > 5)   // 注意这里的纵向坐标别弄反
                isTouch = moveDown();
            else if (offsetY<-5)
                isTouch = moveUp();
        }
        if (isTouch)  // 如果滑动成功则判断
        {
            scoreLabel->setString(String::createWithFormat("%d", score)->getCString());
    
            // 这三个的顺序不能乱
            checkGameWin();
            randomCreateCard();
            checkGameOver();
        }
    }

    在GameScene的init方法中设置监听器的这两个方法的监听回调:

    // 创建监听器
    auto listener = EventListenerTouchOneByOne::create();
    listener->onTouchBegan = CC_CALLBACK_2(GameScene::onTouchBegan, this);
    listener->onTouchEnded = CC_CALLBACK_2(GameScene::onTouchEnded, this);
    // 添加事件监听
    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);

    在Touch监听中根据计算开始位置到结束位置X轴和Y轴的移动距离来判断是向左、向右、向上还是向下的方向,根据方向调用不同的处理函数,在头文件中声明四个方向的方法:

    /**
    * 上下左右四个方向的滑动操作处理
    * @return bool  true-滑动,false-未滑动   
    */
    bool moveLeft();
    bool moveRight();
    bool moveUp();
    bool moveDown();

    然后对其进行实现。这四个方法的逻辑实现具体参考代码。

    5. 游戏结束

    游戏结束后,2048中需要对分数进行统计并显示给玩家,所以一开始我们在GameScene.h文件中声明分数和显示分数的控件:

    int score;      //当前分数
    int bestScore;      //最好分数

    并且在GameScene类的初始化init中进行相关初始化。

    //加入游戏分数  
    auto slabel = LabelTTF::create("Score", "Arial", 30);
    slabel->setPosition(Point(visibleSize.width / 5, visibleSize.height - 150));
    this->addChild(slabel);
    score = 0;
    scoreLabel = LabelTTF::create("0", "Arial", 30);
    scoreLabel->setColor(Color3B(0, 255, 37));
    scoreLabel->setPosition(Point(visibleSize.width / 2+30, visibleSize.height - 150));
    this->addChild(scoreLabel);
    bestScore = UserDefault::getInstance()->getIntegerForKey("BEST");

    游戏结束判断规则:

    • 棋盘被数字填满,无法进行有效移动,判负,游戏结束
    • 棋盘上出现2048,判胜,游戏结束
    void GameScene::checkGameOver()
    {
        bool isGameOver = true;
        //以下情况则游戏继续
        for (int j = 0; j < 4; j++)
        {
            for (int i = 0; i < 4; i++)
            {
                if ((cardArr[i][j]->getNumber()==0)||
                    (i>0 && cardArr[i][j]->getNumber() == cardArr[i - 1][j]->getNumber()) ||
                    (i<3 && cardArr[i][j]->getNumber() == cardArr[i + 1][j]->getNumber()) ||
                    (j>0 && cardArr[i][j]->getNumber() == cardArr[i][j - 1]->getNumber()) ||
                    (j<3 && cardArr[i][j]->getNumber() == cardArr[i][j + 1]->getNumber()))
                {
                    isGameOver = false;
                }
            }
        }
        //否则游戏结束
        if (isGameOver)
        {
            if (sound)
                SimpleAudioEngine::getInstance()->playEffect("gameover.mp3");
            /*初始化菜单层*/
            menuLayer = MenuLayer::create(Color4B(0, 0, 0, 100));
            this->addChild(menuLayer);
            auto menuSize = menuLayer->getContentSize();
            //添加标题
            auto menuTitle = LabelTTF::create("GAME OVER", "Arial", 30);
            menuTitle->setPosition(menuSize.width / 2, menuSize.height / 2 + 50);
            menuLayer->addChild(menuTitle);
            //添加当前分数
            auto menuscoreLabel = LabelTTF::create(String::createWithFormat("current: %d", score)->getCString(), "Arial", 20);
            menuscoreLabel->setPosition(menuSize.width / 2, menuSize.height / 2);
            menuLayer->addChild(menuscoreLabel);
            //添加最好分数
            bestScore = UserDefault::getInstance()->getIntegerForKey("BEST");
            if (score > bestScore)
            {
                bestScore = score;
                UserDefault::getInstance()->setIntegerForKey("BEST", bestScore);
            }
            auto menuBestscoreLabel = LabelTTF::create(String::createWithFormat("best: %d", bestScore)->getCString(), "Arial", 20);
            menuBestscoreLabel->setPosition(menuSize.width / 2, menuSize.height / 2 - 30);
            menuLayer->addChild(menuBestscoreLabel);
            MenuItemFont::setFontName("Arial");
            MenuItemFont::setFontSize(25);
            auto menuItemRestart = MenuItemFont::create("Restart", this, menu_selector(GameScene::restart));
            menuItemRestart->setColor(Color3B(255, 255, 0));
            auto menu = Menu::create(menuItemRestart, NULL);
            menuLayer->addChild(menu);
            menu->setPosition(Point(menuSize.width / 2, menuSize.height / 2 - 80));
        }   
    }

    总结说明

    本文只是对游戏基本的开发思路,逻辑处理做了简单的说明整理,因篇幅及代码显示关系,仅对主要部分进行了列出说明。

    展开全文
  • 由CSDN知名博客讲师火云红孩儿创建的火云开发课堂正式开始讲授新的Cocos2d-x v3.7版本中的3D引擎功能模块!
  • 本课程将利用《从零开始掌握Cocos2d-x 3.0(基于3.0正式版) 》中讲解的知识开发一款射击类游戏:星空大战(与打飞机游戏类似)。从这个项目中可学习到如何利用Cocos2d-x 3.0的相关知识开发一款完整的射击类游戏
  • 15款Cocos2d-x游戏源码

    2017-11-30 17:52:12
    (1)用cocos2d-x开发的中国象棋游戏源码 使用Cocos2d-X2.2.3开发的一款中国象棋游戏游戏中可以实现、新局面、悔棋、游戏音乐、胜利后会显示游戏结果。 源码下载:http://www.okbase.net/file/item/27881 ...

    (1)用cocos2d-x开发的中国象棋游戏源码
    使用Cocos2d-X2.2.3开发的一款中国象棋游戏,游戏中可以实现、新局面、悔棋、游戏音乐、胜利后会显示游戏结果。


    源码下载:http://www.okbase.net/file/item/27881

     

    (2)Cocos2dx开发的一个横版过关游戏Demo源码
    来自游戏开发基友群听雨分享的例子,一个横版过关游戏,有带简单ai的敌人,有横版的地图,有操控摇杆,主角的攻击效果,有很多新鲜的东 
    西。


    源码下载:http://www.okbase.net/file/item/27882

     

    (3)Cocos2d-x游戏《忍者飞镖打幽灵》源码
    初次接触Cocos2d-x的学习demo,发射飞镖击中飞过来的幽灵,可以作为初学参考。
    环境: cocos2dx2.2+vs2012


    源码下载:http://www.okbase.net/file/item/27890

     

    (4)Cocos2dx 跑酷类游戏源代码《萝莉快跑》
    跑酷类游戏,画面精美,如果Cocos2dx使用2.2版本,可能需要修改加载声音资源类。十分简单。


    源码下载:http://www.okbase.net/file/item/27892

     

    (5)MoonWarriors雷电战神传说Cocos2d-X游戏源代码
    因为最近在研究cocos2d-x,前几日看到cocos2d-html5中有款飞机游戏MoonWarriors,想着能不能用cocos2d-x来做重构,一方面可以练习一下 
    这种飞行游戏的编程思路,另一方面也可以加深对cocos2d-x的了解。


    源码下载:http://www.okbase.net/file/item/27071

     

    (6)Cocos2d-x 3.x编写的3D跑酷游戏源码
    这是一个Cocos2d-x 3.3制作的3d跑酷demo,大家可以学习下Cocos2d-x 3.3 提供对Sprite3D的支持,包含教程。
    教程主要是通过分析一个跑酷的Demo,来向大家简单的介绍一下Cocos2d-x 3.3 里对3D游戏开发提供的一些功能,并介绍一下他们的使用方法。


    源码下载:http://www.okbase.net/file/item/27893

     

    (7)开心泡泡猫Cocos2d-x源码
    开心泡泡猫是一款一群喵星人闯入了风靡全球的泡泡龙游戏,游戏将将弹珠台的概念结合至传统泡泡类游戏之中,Cocos2D-X开发。

    源码下载:http://www.okbase.net/file/item/27900

     

    (8)Cocos2dx仿《王者之剑》游戏源码
    《王者之剑》作为国内首款横版即时格斗类手机网游,以欧洲圆桌骑士、亚瑟王的故事为背景,以精美细腻的美漫暗黑画风,再现了这段传奇史 
    诗。本代码是仿《王者之剑》,仅供学习参考。


    源码下载:http://www.okbase.net/file/item/27936

     

    (9)Cocos2dx手绘搞怪类游戏《奇怪大冒险》源码
    Cocos2dx 2.2游戏源码:奇怪大冒险,(原作熊同学) 质量很好,使用vs2013和cocos2dx 2.2打开即可编译运行。


    源码下载:http://www.okbase.net/file/item/27942

     

    (10)Cocos2dx游戏《喵汪大战》源码
    类似打飞机的猫狗大战游戏。
    开发环境:vs2012,cocos2dx2.2


    源码下载:http://www.okbase.net/file/item/27943

     

    (11)山寨版FlappyBird游戏源代码(cocos2dx)
    这是仿制的FlappyBird游戏,作者为xiaohexuehe。
    包括两个版本的代码:Unity版和cocos2dx版。
    FlappyBird不用多说了,一款极其简单,但是又很火的游戏。我在得知这款疯狂的游戏后,就有一种把它重现的冲动,然后花了我4个多小时, 
    产生出了一个可以玩的版本,分享给大家。

    源码下载:http://www.okbase.net/file/item/25707

     

    (12)三国策略战争游戏cocos2d-x源码
    利用 cocos2d-x 实现一个三国战争游戏。 

    作者说:搜到一个开源的半成品游戏代码(游戏主体部分没有),但最高兴的是有不错的资源(没有美工引发头疼问题)。游戏虽小,地图只有 
    一张,可玩,还会完善,希望做成个dota风格,外加塔防玩法的游戏。

    源码下载:http://www.okbase.net/file/item/27070

     

    (13)Cocos2d-x手机单机斗地主源码
    利用cocos2d-x实现手机单机斗地主游戏。 
    完成了斗地主的基本游戏规则,洗牌-发牌-出牌-压牌-判断胜负(计分)。


    源码下载:http://www.okbase.net/file/item/26919

     

    (14)cocos2d-x 多平台高仿微信打飞机源代码
    利用 cocos2d-x 实现多平台高仿微信打飞机游戏。目的是学习 Cocos2d-x 如何支持多平台开发。


    源码下载:http://www.okbase.net/file/item/24078

     

    (15)cocos2d-x俄罗斯方块游戏源代码
    基于cocos2d-x开发的俄罗斯方块游戏,是本人在学习cocos2d-x引擎时,在win7下使用vs2010的C++做的。
    附上完整的源代码。请根据自己的cocos2d-x安装路径更改vs工程项目的属性设置,即可调试运行。该代码仅供cocos2d-x游戏开发爱好者研究学习。

    源码下载:http://www.okbase.net/file/item/27944

    展开全文
  • 第一部分cocos2d-x 第1章 cocos2d-x简介与安装 1.1cocos2d-x引擎介绍 1.2cocos2d-x引擎下载与项目模板安装 1.3本章小结 第2章hello,cocos2dx 2.1创建第一个cocos2d-x项目 2.2cocos2d-x项目结构 2.3...
  • cocos2d-x游戏开发基础与实战 经典视频教程 cocos2d-x游戏开发工资高吗? 精通C/C++,熟练掌握Cocos2d-x引擎及其Cocos2d-x引擎周边开发工具,了解游戏开发常用的工具和软件,精通Socket网络编程和HTTP协议,能高效的...

    cocos2d-x游戏开发基础与实战 经典视频教程

    cocos2d-x游戏开发工资高吗?
    精通C/C++,熟练掌握Cocos2d-x引擎及其Cocos2d-x引擎周边开发工具,了解游戏开发常用的工具和软件,精通Socket网络编程和HTTP协议,能高效的处理各种数据.
    开发过一款以上的知名商业化移动游戏产品的话,工资月薪起码在3万以上!

    cocos2d-x游戏开发需要学什么?
    第一部分cocos2d-x游戏开发基础

    第1章 HelloCocos2d—x
    1.1 引擎简介
    1.2 搭建开发环境
    1.3 HelloWorld
    1.4 HelloWorld分析
    1.5 测试样例简介
    1.6 小结

    第2章 在游戏开始之前
    2.1 基本概念
    2.1.1 场景与流程控制
    2.1.2 层
    2.1.3 精灵
    2.1.4 节点与渲染树
    2.1.5 动作与动画
    2.2 Cocos2d—x代码风格
    2.2.1 命名空间与类名称
    2.2.2 构造函数与初始化
    2.2.3 选择器
    2.2.4 属性
    2.2.5 单例
    2.3 C++中的Cocos2d—x内存管理
    2.3.1 复杂的内存管理
    2.3.2 现有的智能内存管理技术
    2.3.3 Cocos2d—x的内存管理机制
    2.3.4 工厂方法
    2.3.5 关于对象传值
    2.3.6 释放:release()还是autorelease()?
    2.3.7 容器
    2.3.8 相关辅助宏
    2.3.9 Cocos2d—x内存管理原则
    2.4 生命周期分析
    2.5 小结

    第3章 游戏的基本元素
    3.1 CCDirector:大总管
    3.2 CCScene:场景
    3.3 CCLayer:层
    3.4 CCSprite:精灵
    3.4.1 纹理
    3.4.2 创建精灵
    3.4.3 设置精灵的属性
    3.4.4 向层中添加精灵
    3.4.5 常用成员
    3.5 CCNode与坐标系
    3.5.1 坐标系与绘图属性
    3.5.2 节点的组织
    3.5.3 定时器事件
    3.5.4 其他事件
    3.6 Cocos2d—x内置的常用层
    3.7 Cocos2d—x调度原理
    3.7.1 游戏主循环
    3.7.2 定时调度器
    3.8 小结

    第4章 动作
    4.1 基本概念
    4.2 瞬时动作
    4.3 持续性动作
    4.3.1 位置变化动作
    4.3.2 属性变化动作
    4.3.3 视觉特效动作
    4.3.4 控制动作
    4.4 复合动作
    4.5 变速动作
    4.6 使鱼动起来
    4.7 创建自定义动作
    4.7.1 一点简单的物理知识
    4.7.2 创建自定义动作
    4.8 让动作更平滑流畅
    4.9 Cocos2d—x动作原理
    4.9.1 动作类的结构
    4.9.2 动作的更新
    4.9.3 CCActionManager的工作原理
    4.10 小结

    第5章 动画与场景特效
    5.1 动画
    5.1.1 概述
    5.1.2 使用动画
    5.2 场景特效
    5.3 小结

    第6章 音乐与音效
    6.1 使用音效引擎
    6.2 支持格式
    6.3 播放音乐与音效
    6.3.1 预加载
    6.3.2 播放与停止
    6.3.3 暂停与恢复播放
    6.3.4 其他成员
    6.4 小结

    第7章 用户输入
    7.1 触摸输入
    7.1.1 使用CCLayer响应触摸事件
    7.1.2 两种Cocos2d—x触摸事件
    7.2 触摸分发器原理
    7.3 触摸中的陷阱
    7.4 使用触摸事件
    7.4.1 使炮台动起来
    7.4.2 识别简单的手势
    7.5 加速度计
    7.6 文字输入
    7.7 小结

    第二部分 引擎进阶

    第8章 粒子效果
    8.1 Cocos2d—x中的粒子系统
    8.2 粒子效果编辑器
    8.2.1 界面介绍
    8.2.2 制作火焰特效
    8.3 小结

    第9章 大型地图
    9.1 瓦片地图
    9.2 编辑器
    9.2.1 TiledMapEditor简介
    9.2.2 创建水底世界
    9.3 导入游戏
    9.4 实现层次感
    9.5 预定义属性
    9.6 小结

    第10章 Cocos2d—x绘图原理及优化
    10.1 OpenGL基础
    10.1.1 OpenGL简介
    10.1.2 绘图
    10.1.3 矩阵与变换
    10.2 Cocos2d—x绘图原理
    10.2.1 精灵的绘制
    10.2.2 渲染树的绘制
    10.2.3 坐标变换
    10.3 TexturePacker与优化
    10.3.1 绘图瓶颈
    10.3.2 碎图压缩与精灵框帧
    10.3.3 批量渲染
    10.3.4 色彩深度优化
    10.4 小结

    第11章 OpenGL绘图技巧
    11.1 自定义绘图
    11.2 遮罩层
    11.3 数据交流
    11.4 可编程管线
    11.4.1 可编程着色器
    11.4.2 CCGLProgram
    11.4.3 变量传递
    11.5 水纹效果
    11.5.1 着色器程序
    11.5.2 ShaderNode类
    11.5.3 uniform变量准备
    11.5.4 绘制
    11.5.5 添加到场景
    11.6 CCGrid3D
    11.7 再议效率
    11.8 小结

    第12章 物理引擎
    12.1 新的超级武器
    12.2 Box2D引擎简介
    12.3 接入Box2D
    12.4 更新状态
    12.5 调试绘图
    12.6 碰撞检测
    12.7 弹射
    12.8 精确碰撞
    12.9 小结

    第三部分 游戏开发进阶

    第13章 数据持久化
    13.1 CCUserDefault
    13.2 格式化存储
    13.3 本地文件存储
    13.4 XML与JSON
    13.5 加密与解密
    13.6 SQLite
    13.7 小结

    第14章 网络
    14.1 网络传输架构
    14.2 CURL
    14.3 简单传输
    14.4 非阻塞传输
    14.5 用户记录
    14.6 多人对战与同步问题
    14.6.1 时间同步
    14.6.2 鱼群同步
    14.7 校验
    14.8 小结

    第15章 缓存与池
    15.1 移动设备昂贵的CPU与内存
    15.2 缓存机制:预加载与重复使用
    15.3 Cocos2d—x中的缓存
    15.3.1 CCTextureCache
    15.3.2 CCSpriteFrameCache
    15.3.3 CCAnimationCache
    15.4 对象池机制:可回收与重复使用
    15.5 对象池实现
    15.6 落实到工厂方法
    15.7 一个简单的性能测试
    15.8 使用时机
    15.9 小结

    第16章 并发编程
    16.1 单线程的尴尬
    16.2 pthread
    16.3 线程安全
    16.4 线程间任务安排
    16.5 并发编程辅助
    16.6 小结

    第四部分 多平台

    第17章 多平台下的Cocos2d
    17.1 Windows8
    17.2 WindowsPhone平台
    17.3 Cocos2d—HTML5
    17.4 移植
    17.5 小结

    第18章 可视化开发
    18.1 CocosBuilder可视化开发
    18.2 使用CocosBuilder创建场景
    18.3 在Cocos2d—x项目中使用场景
    18.4 小结

    第19章 Cocos2d—HTML5
    19.1 概述
    19.2 开发流程
    19.2.1 开发环境介绍
    19.2.2 搭建开发环境
    19.2.3 开始开发
    19.3 代码安全
    19.4 小结

    第20章 移植
    20.1 命名原则
    20.1.1 类名称
    20.1.2 类函数
    20.1.3 属性
    20.1.4 选择器
    20.1.5 全局变量、函数与宏
    20.2 跨语言移植
    20.2.1 第一阶段:代码移植
    20.2.2 第二阶段:消除平台差异
    20.2.3 第三阶段:优化
    20.3 小结

    第五部分cocos2d-x游戏开发基础实战

    第21章 实战演练——开发自己的《捕鱼达人》
    21.1 开发前的准备
    21.1.1 视图
    21.1.2 模型
    21.1.3 控制器
    21.2 开始开发
    21.2.1 第一轮迭代
    21.2.2 第二轮迭代
    21.2.3 第三轮迭代

    cocos2d-x教程百度网盘下载地址:
    http://www.xuexiluxian.net/cocos2dx-shizhan.html

    展开全文
  • Cocos2d-x 游戏开发详解

    2019-12-26 10:31:24
    本课程通过20章125节课详细讲述了Cocos2d-x开发的详细过程,内容包括:基础编程:开发环境搭建、核心类、标签、菜单、精灵、事件处理、动作、定时器、GUI、数据结构;高级开发:音效、网络编程、数据存储、Tiled Map...
  • 使用cocos2d开发游戏

    2013-03-08 14:52:41
  • 本课程将帮助广大Cocos2d-x学员了解如何使用Cocos2d-x开发一款相对简单的射击类游戏。学员将会了解开发一款完整游戏的基本步骤,并学会如何将《从零开始掌握Cocos2d-x 3.x》中的知识转化为实际的游戏。学员将从这款...
  • 本站文章均为 李华明Himi 原创,转载务必在明显处注明:转载自【黑米GameDev街区】 ... -昨天刚写了如何搭建Cocos2d-X开发环境,这一篇就开始总结了。。。。。 不得不说要说总结,因为Cocos2d-X的代码和Cocos2d-ipho

    本站文章均为 李华明Himi 原创,转载务必在明显处注明:
    转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2dx/603.html


     

          可能很多童鞋有点疑惑-。 -昨天刚写了如何搭建Cocos2d-X开发环境,这一篇就开始总结了。。。。。可怜

          不得不说要说总结,因为Cocos2d-X的代码和Cocos2d-iphone两个引擎除了语言不同外(Cocos2d-X使用C++,Cocos2d-iphone使用Object-C)可以说没有其他差异=。 =

          下面Himi举例对比几段代码来说明吧:

           创建添加一个精灵代码对比:

                  使用Cocos2d-X:

    	//---------Cocos2d-X代码部分--
        //创建一个精灵
        CCSprite *spriteTemp =CCSprite::spriteWithFile("icon.png");
        //设置精灵的坐标
        spriteTemp->setPosition(ccp(size.width*0.5,size.height*0.5));
        //将精灵添加到layer中
        this->addChild(spriteTemp,1);

                使用Cocos2d-iphone:    

            //---------Cocos2d-iphone代码部分--
            //创建一个精灵
            CCSprite *spriteTemp =[CCSprite spriteWithFile:@"icon.png"];
            //设置精灵的坐标
            spriteTemp.position=ccp(size.width*0.5,size.height*0.5);
            //将精灵添加到layer中
            [self addChild:spriteTemp z:0 tag:1];



            添加一个粒子代码对比:

            使用Cocos2d-X: 

    	//---------Cocos2d-X代码部分-- 
        CCParticleSystem *tempSystem =ARCH_OPTIMAL_PARTICLE_SYSTEM::particleWithFile("himi.plist");   
        tempSystem->setPosition(ccp(100,100));    
        this->addChild(tempSystem);

           使用Cocos2d-iphone:

            //---------Cocos2d-iphone代码部分--
            CCParticleSystem *tempSystem =[ARCH_OPTIMAL_PARTICLE_SYSTEM particleWithFile:@"himi.plist"];   
            tempSystem.position=ccp(100,100);    
            [self addChild:tempSystem];


          OK,不在举例了,通过以上随便举例的两段代码童鞋们很清楚的看出来,基本上没有差异。。So~这也是Himi没有在更新Cocos2d-X博文的必要,以后主要会继续更新Cocos2d(Cocos2d-iphone)博文的,以后童鞋们不管是做Cocos2d-X还是做Cocos2d-iphone都可以看我的【iOS-Cocos2d游戏开发系列博文的】谁让它们通用呢 =。  =

          这里还有三点要说下:

     

         第一:现在很多游戏公司都趋向于Cocos2d-X引擎开发游戏的趋势,不得不说Cocos2d-X多平台平移确实很诱惑人,而且通过网龙《91部落》手机网游的成功发布,不得不说Cocos2d-X已成熟!

        第二:不少童鞋肯定会很想知道Cocos2d-X能多平台平移,那么平移稳定性如何?

            通过Himi的了解,Cocos2d-X开发都会使用统一的C++语言开发,例如在iOS开发中使用Xcode+cocos2d-X,在Android上一般使用Eclipse+Android NDK+ADT....

            其实总结一句,Cocos2d-iphone并不像很多童鞋认为的只要的一人开发就可打包多平台包这样子~ 如果说用一句话更贴切的形容Cocos2d-X,Himi会用“Cocos2d-X代码通用”来形容;

            从CC(CocoChina)上我看到王哲walzer(cocos2d-x 游戏引擎作者)在回复一童鞋问题时候这么说的:

           问:关于如何打包cocos2d-x程序的问题   本人新手,想请教一下如何将Cocos2d-x win32的程序打包成iphone能够运行的程序,请各位大大不吝赐教!谢谢!

          王哲walzer 答:win32上只是让你调试方便,要发布到appstore上,你还是得有个mac机,装好cocos2d-x template,新建工程,然后把win32上代码拷过来,手工地加入xcode工程里面,编译运行

          从上面的对话可以证实Himi所说的Cocos2d-X是代码通用! OK,不多说了,大概就说这几点吧,继续忙了~

     

     

    展开全文
  • Cocos2d-android游戏引擎

    2016-11-18 10:44:08
    什么是游戏引擎游戏引擎是指一些已编写好的可编辑游戏系统或者一些交互式...Cocos2d家族cocos2d是一个开源的游戏开发框架,利用它可以非常容易的开发2D游戏。 包括以下成员 Cocos2d-x Cocos2d-iphone Cocos2d-android
  • cocos2d-x游戏开发编程入门到实战视频教程 cocos2d-x刚开始的初衷就不是给企业用来开发大型游戏的,一个开源引擎后边又没有大牛支着,可以说它作为一个广大游戏爱好者用来研究娱乐的作用远大于其商业价值。 而14年...
  • 游戏引擎Cocos2D2.图形引擎Cocos2D Graphic3.实践一4.Cocos2D的坐标体系5.CCNode6.实践二7.CCAction8.实践三9.CCAnimate10.实践四11.总结 1.游戏引擎Cocos2D 游戏引擎是指一些已编写好的可编辑游戏系统或者一些交互...
  • 精通Cocos2d-x游戏开发(进阶卷)源代码 精通Cocos2d-x游戏开发(进阶卷)源代码 精通Cocos2d-x游戏开发(进阶卷)源代码
  • 百度了下大概了解到目前最流行的应该是Cocos2d-X和Unity3D,Unity3D可视化开发方便但是不开源还要money,Cocos2d-X开源并且有成熟的社区,市面上已经有N多款游戏开发的。于是决定学习一下Cocos2d-X,网上找了...
  • 精通COCOS2D-X游戏开发【进阶卷+基础卷】 《精通Cocos2d-x游戏开发(基础卷)》共31章,分为4篇。第1篇为《入门篇》,第2篇为《基础框架篇》,第3篇为《UI与交互篇》,第4篇为《CocoStudio工具链篇》。 《精通Cocos2d-...
  • 本书适合使用Cocos2d-x进行游戏开发的中高级读者阅读,尤其适合在使用Cocos2d-x开发过程中碰到问题的程序员,以及希望学习一些实用技术,从而丰富自身经验的程序员。对于大中专院校的学生和社会培训班的学员,本书也...
  • cocos2d-x游戏开发系列教程-编译运行我们的第一个cocos2d-x游戏程序
  • 用cocos2d开发普通应用

    2019-11-15 15:44:05
    http://cocos2d-x.org/filedown/cocos2d-x-3.16.zip ...E:\cocos2d-x-3.16\tools\cocos2d-console\bin 将环境变量中 COCOS_CONSOLE_ROOT 的 变量值复制path python cocos.py new ProjectName -p com.mygam...
  • cocos-2d 游戏开发

    2017-10-25 22:44:39
    利用cocos-2d游戏引擎进行简单的游戏开发levelLayer.javapackage Layer;import android.graphics.Point; import android.util.Log; import android.view.MotionEvent;import org.cocos2d.actions.CCScheduler; ...
1 2 3 4 5 ... 20
收藏数 25,360
精华内容 10,144