zoukankan      html  css  js  c++  java
  • 使用cocos2d-x3.4结合cocos2.1.5制作小游戏《亲亲小熊》

    在最新的cocos集成环境中,CocosStudio已经集成到cocos中了,至于界面的制作和编辑器的基本使用在cocos官网有详细教程,

    这里就不细说,资源下载和详情请参看官网教程:http://cn.cocos2d-x.org/tutorial/show?id=1650

    接下来就是使用cocos2d-x3.4完成接下来的代码操作与打包,一步一步来。

    1、cocos2d-x3.4环境问题,cocos2d-x3.4对NDK的要求是最新的,这里我使用的是r10d。如果使用eclipse进行打包,需要

    eclipse版本在23以上,这里我是用的是2014年7月2号的版本(Eclipse IDE for Android Developers 23.0.2.1259578 )。

    相应的SDKcocos2d-x3.4项目默认是20,(2014年7月2号的版本的ADT里面集成的SDK就是20)请自行下载。另外Python

    和java请自行安装,并且配置好环境变量。建议新手直接下载cocosframeworks3.4进行安装,这样cocos相关的环境变量会自

    动配置好。

    2、使用eclipse进行android编译的还有一个重要的参数需要配置:NDK_MODULE_PATH,我嫌麻烦,直接配置在环境变量里。

    3.4的这三个目录分别是cocos引擎根目录,external目录,和cocos目录,例如我的配置:

    FrameWorksframeworkscocos2d-x-3.4rc1;D:CocosFrameWorksframeworkscocos2d-x-3.4rc1external;D:CocosFrameWorksframeworkscocos2d-x-3.4rc1cocos

    3、接下来就是工程的创建和代码编写了,这里我使用c++开发,编辑器使用vs2013update4。

    首先打开命令行窗口,使用cocos命令行创建工程:cocos new KissBear -p com.KissBear.cn -l cpp -d D:cocosProjects

    解释下命令参数:new是新建工程命令,-p是包名称,-l是开发语言,-d是工程存放目录

    4、将cocosStudio导出的资源文件全部拷贝到工程目录下的Resources目录下。嗯,先看下cocosStudio的效果图:

     
    每个窗口里面的小熊是不可见的,这样我们只需要在代码里面实现随机出现就可以了。
    5、接下来,分析下具体的逻辑实现,第一步:加载出来界面,然后九个窗子里的小熊随机出现,如果触摸判断到触点在小熊上面,
    那么分数往上加,很简单的。
    6、话不多说,分析下代码需求开整。首先我们需要一个函数用来产生一个随机编号,大小在1-9之间,用来决定哪个小熊显示出来,
    然后需要一个函数用来显示相对应的小熊,此外还此外还需要一个函数用来进行分数的显示。数据方面需要一个表用来存储所有的小熊,
    一个表示当前显示小熊的变量,还有点中小熊之后的嘴唇图片变量,一个分数变量。为了小熊的显示不会接连两次重复显示同一个,还
    需要一个变量存储上一次小熊的序号。
    7、上代码开始,创建创建新类BearMainScene,引入相关头文件,定义函数以及变量:
     1 /************************************************************************/
     2 /* 头文件:BearMainScene.h*/
     3 /************************************************************************/
     4 
     5 #ifndef __HELLOWORLD_SCENE_H__
     6 #define __HELLOWORLD_SCENE_H__
     7 
     8 #include "cocos2d.h"
     9 #include "ui/CocosGUI.h"
    10 USING_NS_CC;
    11 using namespace cocos2d::ui;
    12 
    13 class BearMainScene : public cocos2d::Layer
    14 {
    15 public:
    16     static cocos2d::Scene* createScene();
    17 
    18     virtual bool init();
    19     
    20   
    21     CREATE_FUNC(BearMainScene);
    22 
    23 public:
    24     int GetRandNum();
    25 
    26     void update(float delta); //帧循环
    27     void GetshowBear(); //获取要显示的小熊并且显示小熊
    28     void setScore(); //设置分数
    29     Vector<Node*> bearNodeArray; //存储所有的小熊列表
    30     Node *alivebear;    //当前显示的小熊
    31     Sprite *sp_kiss;  //嘴唇精灵
    32     Text *scoreText;  //分数控件
    33 
    34     static float beginclock;   //显示计时
    35     int preBearNum;    //上次显示的小熊编号
    36     static float difftime;     //显示时间差
    37     static int totalScore;   //总分数
    38 };
    39 
    40 #endif // __HELLOWORLD_SCENE_H__

    实现文件:

      1 #include "BearKissScene.h"
      2 #include "cocostudio/CocoStudio.h"
      3 #include "ui/CocosGUI.h"
      4 
      5 USING_NS_CC;
      6 
      7 float BearMainScene::difftime = 1.5;
      8 int BearMainScene::totalScore = 0;
      9 float BearMainScene::beginclock = 0.0;
     10 
     11 Scene* BearMainScene::createScene()
     12 {
     13     auto scene = Scene::create();
     14     auto layer = BearMainScene::create();
     15     scene->addChild(layer);
     16     return scene;
     17 }
     18 
     19 bool BearMainScene::init()
     20 {
     21     if ( !Layer::init() )
     22     {
     23         return false;
     24     }
     25 
     26     auto manilayer = CSLoader::createNode("MainScene.csb");
     27     this->addChild(manilayer);
     28 
     29     char index[4];
     30     for (int i = 1; i < 10; i++)
     31     {
     32         std::string nodename = "ProjectNode_";
     33         memset(index, 0, sizeof(char) * 4);
     34         sprintf(index, "%d", i);
     35         nodename = nodename.append(index);
     36         auto sp_w = manilayer->getChildByName(nodename);
     37         bearNodeArray.pushBack(sp_w);
     38     }
     39 
     40     scoreText = (Text*)manilayer->getChildByName("Text_Score");
     41     setScore();
     42        
     43     sp_kiss = Sprite::create("m.png");
     44     sp_kiss->setVisible(false);
     45     sp_kiss->setAnchorPoint(Vec2(0.5, 0.5));
     46     this->addChild(sp_kiss);
     47 
     48     GetshowBear();
     49 
     50          //拉姆达表达式做碰撞监听
     51     auto bearListener = EventListenerTouchOneByOne::create();
     52     bearListener->onTouchBegan = [&](Touch *touch, Event* event){
     53         auto bearrect = Rect(0, 0, alivebear->getContentSize().width, alivebear->getContentSize().height);
     54         auto startpos = alivebear->convertToNodeSpace(touch->getLocation());
     55 
     56         if (bearrect.containsPoint(startpos) && alivebear->isVisible())
     57         {
     58             sp_kiss->setVisible(false);
     59             sp_kiss->setPosition(touch->getLocation());
     60             sp_kiss->setVisible(true);
     61             totalScore += 100;
     62                         //如果显示时间间隔大于0.1秒,那么分数每增长1000分,时间差减去0.1,这样子,就会随着分数的提高难度增加
     63             if (difftime != 0.1)
     64             {
     65                 if (totalScore % 1000 == 0)
     66                 {
     67                     difftime -= 0.1;
     68                 }
     69             }
     70             
     71             setScore();
     72         }
     73 
     74         return true;
     75     };
     76 
     77     bearListener->onTouchMoved = [](Touch *touch, Event* event){
     78     };
     79 
     80     bearListener->onTouchEnded = [&](Touch *touch, Event* event){
     81 
     82     };
     83 
     84     _eventDispatcher->addEventListenerWithSceneGraphPriority(bearListener, alivebear);
     85     
     86     this->scheduleUpdate();
     87 
     88     return true;
     89 }
     90 
     91 int BearMainScene::GetRandNum()
     92 {
     93     int num = 0;
     94     while (1)
     95     {
     96         num = rand_0_1() * 10;
     97         if (num >= 0 && num < 9)
     98         {
     99             break;
    100         }
    101     }
    102     return num;
    103 }
    104 
    105 void BearMainScene::GetshowBear()
    106 {
    107     int idx = GetRandNum();
    108     while (idx == preBearNum)
    109     {
    110         idx = GetRandNum();
    111     }
    112     preBearNum = idx;
    113     std::string spritename = "Sp_bear";
    114     auto bearNode = bearNodeArray.at(idx);
    115     alivebear = bearNode->getChildByName(spritename);
    116     if (sp_kiss->isVisible())
    117     {
    118         sp_kiss->setVisible(false);
    119     }
    120     alivebear->setVisible(true);
    121 }
    122 
    123 void BearMainScene::update(float delta)
    124 {
    125     beginclock += delta;
    126     if (beginclock >= difftime)
    127     {
    128         beginclock = 0;
    129         alivebear->setVisible(false);
    130         GetshowBear();
    131     }
    132 }
    133 
    134 
    135 void BearMainScene::setScore()
    136 {
    137     char scorestr[10];
    138     memset(scorestr, 0, sizeof(scorestr));
    139     sprintf(scorestr, "%d", totalScore);
    140     scoreText->setString(scorestr);
    141 }            


    8、然后,修改appdelegate的glview属性:glview = GLViewImpl::createWithRect("MyKissBear", Rect(0, 0, 640, 960));

    这里需要注意,如果想要跑WP8的工程createWithRect这个函数是没有的,需要使用setFrameSize去设置大小。

    9、最后进入项目目录,打开命令行窗口:cocos run -p android -m release --ap-20 ,当然请把android手机连上电脑。这里需要

    注意,这里编译的是release版本,是需要签名的,如果嫌麻烦,将release改成debug或者直接去掉,因为默认是debug版本编译的。

    那么要签名的话,需要先生成签名文件,这里简单说下方法,同样进入项目目录,打开命令行窗口:keytool -genkey -alias demo.keystore -keyalg RSA -validity 3650 -keystore demo.keystore

    demo.keystore是签名文件名称,RSA是加密方式,3650是有效天数,-alias是别名,还有个keysize,这里就不设置,默认就好。

    签名文件生成之后,在执行前面的run命令,根据提示输入keystore路径,就好了。

    10、如果使用ecliose编译,相关路径一定要配置好,我遇到的问题就是提示c++空指针,原因是因为我在首次打开eclipse是NDK路径

    没有设置正确,即使NDK之后设置正确,打开也会报错,解决方法:删除android工程下的.cproject文件。

    最后,上一张手机上的效果图:

     

    好啦,到这里就结束了。

  • 相关阅读:
    springboot文件上传: 单个文件上传 和 多个文件上传
    Eclipse:很不错的插件-devStyle,将你的eclipse变成idea风格
    springboot项目搭建:结构和入门程序
    POJ 3169 Layout 差分约束系统
    POJ 3723 Conscription 最小生成树
    POJ 3255 Roadblocks 次短路
    UVA 11367 Full Tank? 最短路
    UVA 10269 Adventure of Super Mario 最短路
    UVA 10603 Fill 最短路
    POJ 2431 Expedition 优先队列
  • 原文地址:https://www.cnblogs.com/leisc/p/4378592.html
Copyright © 2011-2022 走看看