cocos2dx學習之常用控件的使用

看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控件的使用

這個控件是在場景中添加一個文本輸入框,但是添加文本輸入框之後,要想用鍵盤進行輸入還要去啓動輸入法。

// on "init" you need to initialize your instance
bool 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();										 //爲這個控件啓用輸入法
		}
		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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章