Cocos2d-x學習筆記(一)HelloWorld,cocos2dx學習筆記
原創文章,轉載請註明出處:http://blog.csdn.net/sfh366958228/article/details/38656755
前言
正式來公司實習已有一月,前一月主要是看了《C++ Primer》給Cocos2d-x的學習打下基礎。
之前在學校曾用Cocos2d-x開發過簡單的飛機大戰,對於Cocos2d-x的基本控制項有簡單瞭解,這一次希望通過進一步的學習,並加以撰寫學習筆記的形式,能夠對Cocos2d-x有更深理解。
由於目前公司使用的Cocos2d-x版本是2.0,故此次學習也是基於2.0版本進行。
HelloWorld
記得之前看過一個冷笑話說,平常中國人見面都喜歡問對方吃了嗎?但是程式員卻不會這樣,因為他們會問今天你HelloWorld了嗎?
感覺總是這樣在網上被黑,程式員大多都習慣了吧,但是還是說出了HelloWorld對於程式員們的重要性。
囉嗦了白天,該進入正題了。開啟項目後可以看到AppDelegate.h/.cpp和HelloWorldScene.h/.cpp四個檔案,比一般初學編程看到的HelloWorld要稍顯複雜。
#include "AppDelegate.h"#include "HelloWorldScene.h"USING_NS_CC;AppDelegate::AppDelegate() {}AppDelegate::~AppDelegate() {}bool AppDelegate::applicationDidFinishLaunching() { // 初始化CCDirector對象 CCDirector* pDirector = CCDirector::sharedDirector(); // 初始化CCEGLView對象,CCEGLView是顯示視窗,負責視窗層級的功能管理和實現,包括座標和縮放管理、畫圖工具、按鍵事件 CCEGLView* pEGLView = CCEGLView::sharedOpenGLView(); // 將pEGLView傳遞給pDirector pDirector->setOpenGLView(pEGLView); // 開啟狀態顯示,包括FPS等 pDirector->setDisplayStats(true); // 設定FPS,每秒重新整理多少幀畫面,預設是1秒60幀,幀數越高畫面越流暢,但也越耗電 pDirector->setAnimationInterval(1.0 / 60); // 建立一個HelloWorld情境,能夠自動釋放 CCScene *pScene = HelloWorld::scene(); // 運行HelloWorld情境 pDirector->runWithScene(pScene); return true;}// 來電或者應用進入手機後台將調用此方法void AppDelegate::applicationDidEnterBackground() { // 停止所有動畫 CCDirector::sharedDirector()->stopAnimation(); // 如果使用了SimpleAudioEngine(控制背景音樂等),在此處調用暫停 // SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();}// 當應用從後台恢複至前台將調用此方法void AppDelegate::applicationWillEnterForeground() { // 恢複所有動畫 CCDirector::sharedDirector()->startAnimation(); // 在此處調用SimpleAudioEngine的恢複 // SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();}
AppDelegate對Cocos2d-x引擎進行了初始化,並對進行一些全域性的設定。
但是在這個裡面並沒有看到具體的介面實現,因為介面實現都在HelloWorldScene中。
#include "HelloWorldScene.h"USING_NS_CC;CCScene* HelloWorld::scene(){ // 建立一個Scene CCScene *scene = CCScene::create(); // 建立一個HelloWorld的圖層(HelloWorld繼承自CCLayer) HelloWorld *layer = HelloWorld::create(); // 將建立的HelloWorld圖層添加至之前建立的情境中 scene->addChild(layer); // 返回建立的情境 return scene;}// on "init" you need to initialize your instancebool HelloWorld::init(){ ///////////////////////////// // 1. 調用父類的初始化,如果初始化失敗,則不會繼續往下執行 if ( !CCLayer::init() ) { // 返回false表示初始化失敗 return false; } //擷取可顯示地區大小 CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); //擷取可顯示地區座標起點 CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin(); ///////////////////////////// // 2. 添加一個可點擊的功能表按鈕,點擊後關閉程式 // 建立一個圖片菜單選項 CCMenuItemImage *pCloseItem = CCMenuItemImage::create(// 調用建立方法 "CloseNormal.png",// 設定未點擊時菜單圖片 "CloseSelected.png",// 設定點擊時候菜單圖片 this,// ?這個參數是什麼 menu_selector(HelloWorld::menuCloseCallback));// 設定菜單點擊時間的回調監聽 // 設定菜單的位置座標,pCloseItem->getContentSize()用來擷取菜單選項大小 pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 , origin.y + pCloseItem->getContentSize().height/2)); // 建立菜單(菜單選項需要添加到菜單裡才能使用),create函數中可以添加多個菜單選項,以NULL結束添加 CCMenu* pMenu = CCMenu::create(pCloseItem, NULL); // 設定菜單的座標(CCPointZero是座標(0,0)) pMenu->setPosition(CCPointZero); // 將菜單添加至HelloWorld圖層中,1是菜單在HelloWorld圖層中Z軸位置,數值越大,顯示的層級越高,不易被遮擋 this->addChild(pMenu, 1); ///////////////////////////// // 3. 添加文字控制項和背景圖片 // 建立一個檔案控制項,create函數中參數分別是“控制項需要顯示的文字”,“控制項文字字型”,“控制項文字字型大小” CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", 24); // 設定檔案控制項位置(此公式計算的位置為螢幕中央) pLabel->setPosition(ccp(origin.x + visibleSize.width/2, origin.y + visibleSize.height - pLabel->getContentSize().height)); // 將文字控制項添加至HelloWorld圖層中 this->addChild(pLabel, 1); // 建立一個精靈(後續將介紹精靈的具體用處,這裡精靈是背景圖片的載體) CCSprite* pSprite = CCSprite::create("HelloWorld.png"); // 設定背景圖片位置(此公式計算的位置為螢幕中央) pSprite->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y)); // 將背景圖片添加至HelloWorld圖層中,並設定Z軸為0,置於菜單和文字之下 this->addChild(pSprite, 0); // 返回true表示初始化成功 return true;}// 關閉按鈕的回呼函數,pSender傳遞的是調用了該函數的對象void HelloWorld::menuCloseCallback(CCObject* pSender){// 宏定義,判斷是否是WinRT或者WP8裝置#if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)// 彈出對話方塊,提示文字資訊CCMessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");#else // 調用CCDirector的end()函數,結束遊戲 CCDirector::sharedDirector()->end();// 宏定義,判斷是否是IOS裝置#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) // 直接調用exit(0)結束遊戲 exit(0);#endif#endif}
HelloWorldScene檔案是整個HelloWorld工程的核心,從代碼中我們不難發現,在Cocos2d-x的座標系計算中,預設將螢幕左下角設定為座標原點,向上方和右方遞增Y軸X軸。而設定控制項位置的時候,是以控制項的中心為錨點,當然,錨點是可以通過代碼改變的,這裡我們需要調用setAnchorPoint()函數。
好了,這一章就寫到這,下一節將繼續一起學習Cocos2d-x整體架構。
對於初學cocos2d-x編程時對代碼的一點疑問
MyHelloWorldScene::表示 這是在 class MyHelloWorldScene這個類得範圍中,是.h中CCScene*
scene()得實現,c++一般都是在 .h中聲明函數 然後再.cpp中進行實現,函數傳回值 classname::functionname(){}這樣的形式
教,cocos2d-x的Helloworld執行個體顯示不出文字,這是為何?有什解決方案?
重裝下顯卡驅動就行了,用舊版本就行了。