使用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目錄,例如我的配置:

FrameWorks\frameworks\cocos2d-x-3.4rc1;D:\CocosFrameWorks\frameworks\cocos2d-x-3.4rc1\external;D:\CocosFrameWorks\frameworks\cocos2d-x-3.4rc1\cocos

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文件。

 

最后,上一張手機上的效果圖:

 

好啦,到這里就結束了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM