標籤:cocos2dx 遊戲 python vs application
看CSAPP看的頭大,做個小遊戲娛樂娛樂。
1、一個cocos2dx項目的執行流程
由於cocos2dx和Python是一路貨色,搞不到他們的版本更迭這麼快並且還非常不相容,不知道這些設計者是怎麼想的,總之是會給大家造成一些個不必要的麻煩。我是用的是cocos2dx3.1的版本,建立好項目之後,在pro.win32裡面開啟VS的工程。因為任何C++程式,不管是多大的項目,這個程式運行起來和作業系統的介面都是由一個Main函數來完成的。
而且,要注意一點的就是我們要運行一個程式,他裡面調用的 自訂的函數和你的main函數並不一定要放在一起。我可以寫一個main.c裡面存放main函數,然後寫另一個檔案裡面有要在main函數裡面調用的函數,在最後用編譯器進行編譯成一個可執行檔的時候可以通過連接器的作用去串連兩個檔案。形成最終的程式。
建立了項目之後,在main.c裡面可以看見main函數,雖然這個main函數可能是有點和我們所看到的不一樣 ,但是道理上是一樣的。可以看到他執行了一個應用的初始化函數,getinstance這個函數返回的應該是一個Application對象,然後接著調用run函數來運行。
轉到run函數看一下便可以知道,代碼的注釋上已經給了你提示,初始化一個應用執行個體,劃紅線出的那個函數,應該就是一個初始化的函數了,如果初始化失敗的話,那麼整個程式就會立即退出。
轉到這個函數之後就可以看出,裡面都是一些 初始化函數,劃紅線的代碼是建立一個情境,我的理解就是建立了一個大的架構的東西。轉到這個函數的定義一看,執行的便是bool HelloWorld::init()這個函數。這個函數內部包括了一些,插入圖片,插入文字等等的一些代碼也就是說,我們執行一個cocos2dx程式一開始看到的東西,都是由這個函數裡面的代碼來實現的。所以只要我們 重寫這個方法,就能夠按照我們的想法去初始化這個視窗。
2、如何使用sprite控制項
這個控制項是和2D映像有關的。建立一個 這樣的對象是用以下函數
利用下面這個函數建立一個sprite精靈對象,就可以在情境中添加一個2d映像,但是之後要用addchild方法,添加進去。
| static Sprite* create |
( |
const std::string & |
filename |
) |
|
|
static |
指定影像檔名建立Sprite
建立之後,Sprite的尺寸大小與映像相同,且位移被置為(0,0)。
-
參數
-
| filename |
包含路徑的影像檔名,比如"scene1/monster.png" |
-
返回
-
自動釋放的Sprite對象
之後運行程式,雖然可以看到圖片顯示了,但是明顯位置不對。這就又提到了一個概念,叫做錨點。錨點就是一個類似於錨點的概念。每一個通過addchild方法添加進來的一個節點都會有一個錨點,這個錨點預設情況下(0.5,0.5)
可以通過一個叫做s->setAnchorPoint(Point(0,0));的方法去設定錨點,具體的用法可以去查一下官方的API
http://cn.cocos2d-x.org/doc/cocos2d-x-3.0/d8/de9/group__sprite__nodes.html#gac1be6ca229d92a1a145fda8a7eece771
2、
Cocos2d-x之Director、Scene、Layer
在上面的圖片我們可以看出,我們一開始初始化了一些變數,第一行就是初始化一個director,這個director,也可以說是導演。在Cocos2d-x-3.0x引擎中,採用節點樹形結構來管理遊戲對象,一個遊戲可以劃分為不同的情境,一個情境又可以分為不同的層,一個層又可以擁有任意個可見的遊戲節點。Director是整個引擎的核心,他管理著遊戲情境的轉換,遊戲的暫停等等,某種意義上來說,真的就像是一個導演一樣。整個一個項目只有一個director對象,用getinstance來進行初始化建立。
而Scene則是一個遊戲 的 情境,也是通過一個初始化的函數來建立,但是在建立情境的函數裡面,createScene,會包含建立一個層,也就是layer。上述三個對象是有著密切的邏輯關係的。
當你想做一個 遊戲的時候,首先的話,你要建立一個導演對象,把我整個遊戲的各種設定,之後,你要為你的遊戲建立不同的情境,也就是一個大的背景,平台,在此基礎上要建立層這個對象,然後把我們 所需要的遊戲元素,也就是addchild方法添加的那些節點放在層上。
3、COCOS2dx是如何呈現圖形的
就按照 剛才上面的 順序,因為之前說過applicationDidFinishLaunching()是程式的入口,那麼在這裡,項目會 自動產生一些建立情境的代碼。現在,為了能夠真正的瞭解cocos2dx是如何呈現圖形了,把它自動 產生的程式碼注釋一下,自己寫一個。
bool AppDelegate::applicationDidFinishLaunching() { // initialize director auto director = Director::getInstance(); auto glview = director->getOpenGLView(); if(!glview) { glview = GLView::create("My Game"); director->setOpenGLView(glview); } // turn on display FPS director->setDisplayStats(true); // set FPS. the default value is 1.0/60 if you don't call this director->setAnimationInterval(1.0 / 60); // create a scene. it's an autorelease object //auto scene = HelloWorld::createScene();Scene *scene = Scene::create(); //建立一個情境Layer *layer = Layer::create(); //建立一個層scene->addChild(layer); //在層情境裡面添加一個層Sprite *s = Sprite::create("dota2.jpg"); //建立一個2d映像元素s->setAnchorPoint(Point(0,0));//設定錨點layer->addChild(s);//將節點加入層中 // run director->runWithScene(scene); return true;}
具體的功能我都給了注釋。
4、LOG控制項
這個控制項類似於printf函數,是一個輸出資訊的API。
5、MessageBox控制項和MFC裡面的功能基本一樣,都是一個彈窗。顯示一些資訊,具體的可以去官網的文檔看
PS:
Size size = Director::getInstance()->getVisibleSize(); //擷取螢幕可見地區的大小
這句話還是比較有用的,是擷取當前螢幕可見地區的大小尺寸
6、LabelTTF文字標籤控制項
和使用其他標籤的步驟基本 是一樣的,再次不多說了,貼上代碼,應該很好理解
bool HelloWorld::init(){ ////////////////////////////// // 1. super init first if ( !Layer::init() ) { return false; } Size size = Director::getInstance()->getVisibleSize(); //擷取螢幕可見地區的大小LabelTTF *label = LabelTTF::create();label->setString("hello xuran"); //設定文字標籤內容label->setFontSize(36);//設定文字大小label->setPosition(size.width/2, size.height/2);//設定位置addChild(label); return true;}
7.TextFiledTTF控制項的使用
這個控制項是在情境中添加一個文本輸入框,但是添加文本輸入框之後,要想用鍵盤進行輸入還要去啟動IME。
// on "init" you need to initialize your instancebool HelloWorld::init(){ ////////////////////////////// // 1. super init first if ( !Layer::init() ) { return false; }Size size = Director::getInstance()->getVisibleSize(); //擷取螢幕可見地區的大小TextFieldTTF *tf = TextFieldTTF::textFieldWithPlaceHolder("Please input words","宋體",36); //根據各項參數建立一個文本編輯框tf->setPosition(size.width/2, size.height/2);//設定其位置在螢幕 中間addChild(tf);auto listener = EventListenerTouchOneByOne::create();//設立一個事件監聽器listener->onTouchBegan = [tf](Touch *t, Event *event){if(tf->getBoundingBox().containsPoint(t->getLocation())) //擷取觸摸點並且觸摸點是否包含在在文本編輯框內{tf->attachWithIME(); //為這個控制項啟用IME}else{tf->detachWithIME();}return false;};Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, tf); //利用導演添加一個對事件的監聽器 return true;}
8、自訂一個類
如果我想添加一個2D映像在介面中,但是又不想用之前的方式在init函數裡面進行添加,使用sprite,我想自己定義,然後 實現一些自訂的功能。這樣就需要自訂一個類。由於我們相用自己建立的類來添加一個2d映像的節點在情境中,那麼我們還是需要繼承sprite因為這個類裡面畢竟提供了太多的功能讓我們使用。
建立一個ball的類然後建立一個init的虛函數,重新實現這個函數。並且用initwithfile方法根據圖片建立一個小球的節點。
之後再自己重新 實現一個create的靜態方法,以便於建立一個小球的元素。
之後再情境的類的init函數中,建立一個ball的對象。並且把它添加到情境中,就可以看到這樣通過自己自訂的一個類完全可以實現之前用sprite的功能,並且還可以再次基礎多做擴充。
#pragma once#include<iostream>#include"cocos2d.h"using namespace cocos2d;class ball:public Sprite{public:virtual bool init();static ball* create(){ball* b = new ball();b->init();b->autorelease();return b;}};
#include "ball.h"bool ball::init(){initWithFile("ball.png");return true;}
auto b = ball::create();b->setPosition(200,200);addChild(b);
9、Menu控制項的使用
Menu是菜單控制項,menuitem是功能表項目,菜單就是很多功能表項目的一個集合。可以建立文字版的功能表項目或者圖片的。但是Menu這個集合只接受menuitem做為孩子。
auto menu = Menu::create(MenuItemImage::create("5.png", "6.png",[](Object *obj) //建立一個菜單控制項,並且利用MenuItemImage::create來建立一個圖片的功能表項目,指定選擇功能表項目前後的圖片,並且指定選中功能表項目之後的回呼函數{log("menu item touched");}),NULL);addChild(menu);