內容介紹: 自定義事件需要注意: //必須把t的座標點轉成節點座標點 if(e->getCurrentTarget()->getBoundingBox().containsPoint(e->getCurrentTarget()->convertToNodeSpace(t->getLocation()))){ SimpleAudioEngine::getInstance()->playEffect("eat.wav"); Director::getInstance()->replaceScene(MainScene::createScene()); } 預加載: std::vector<std::string> searchPath; searchPath.push_back("height_864"); CCFileUtils::getInstance()->setSearchPaths(searchPath);//設置項目資源目錄 SimpleAudioEngine::getInstance()->preloadBackgroundMusic(FileUtils::getInstance()->fullPathForFilename("sound/music.mp3").c_str() );//預加載背景音樂 SimpleAudioEngine::getInstance()->preloadEffect(FileUtils::getInstance()->fullPathForFilename("sound/dead.wav" ).c_str());//預加載音效 Director::getInstance()->getTextureCache()->addImageAsync("playbg.png", CC_CALLBACK_1(LoadingResScene::loadingCallBack, this));//預先加載紋理圖片到緩存中 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Play.plist");//加載plist文件到精靈緩存中 FileUtils::getInstance()->fullPathForFilename("sound/tip.wav").c_str() //組裝成完整的路勁再返回 菜單容器添加: Vector<MenuItem*> menuItemVector; auto item = MenuItemImage::create( "card_1.png", "card_2.png", "card_3.png", CC_CALLBACK_1(LevelSelectPage::menuStartCallback, this)); menuItemVector.pushBack( item ); auto levelMenu = Menu::createWithArray(menuItemVector); menu->alignItemsHorizontally();//菜單水平對齊 ValueMap: ValueMap dict = FileUtils::getInstance()->getValueMapFromFile("a.plist");//把plist文件轉成ValueMap resources = dict["resources"].asValueMap(); levelInfo = dict["levelInfo"].asValueMap(); 靜態變量一定要賦初值: A* A::a = NULL; 【tiled地圖使用2:】 auto map = TMXTiledMap::create("a.tmx"); TMXLayer * layer = map->getLayer("bg"); TMXObjectGroup * objects = map->getObjectGroup("obj"); ValueMap point = objects->getObject(std::to_string(0)); map->getMapSize()是地圖有幾個塊, map->getTileSize()是每一塊的大小 layer->getTileGIDAt(Point(1,2));//獲得該點上面的GID auto tileTemp = map->getPropertiesForGID(gid).asValueMap();//獲得對應GID上的屬性字典 【cocos2dx-把觸點座標轉換成TieldMap座標】 cocos2d::CCPoint HelloWorld::covertPointToTiledCoord(cocos2d::CCPoint p) { int x = p.x / mMap->getTileSize().width; int y = ((mMap->getMapSize().height * mMap->getTileSize().height) - p.y) / mMap->getTileSize().height; return ccp(x, y); } 【計算2點之間的距離】 double distance = this->getPosition().getDistance(enemy->sprite->getPosition()); 【使塔跟着敵人旋轉】 auto rotateVector = nearestEnemy->sprite->getPosition() - this->getPosition(); auto rotateRadians = rotateVector.getAngle(); //獲得弧度 auto rotateDegrees = CC_RADIANS_TO_DEGREES(-1 * rotateRadians); //獲得角度 auto speed = 0.5 / M_PI;//獲得速度 auto rotateDuration = fabs(rotateRadians * speed); //獲得時間 rotateArrow->runAction( Sequence::create(RotateTo::create(rotateDuration, rotateDegrees), CallFunc::create(CC_CALLBACK_0(ArrowTower::shoot, this)), NULL)); 【移除、清除操作】 tips->runAction(Sequence::create(DelayTime::create(0.8f), CallFunc::create(CC_CALLBACK_0(Sprite::removeFromParent, tips)), NULL));//執行完動作後移除自己 this->removeFromParentAndCleanup(true);//在這個節點上所有的動作和回調都會被刪除 //移除怪物 nowEnemy->unscheduleAllSelectors(); //不調度所有的調度過的選擇器 nowEnemy->stopAllActions(); //停止並且刪除所有的動作從活動動作列表中 nowEnemy->removeFromParentAndCleanup(true); GameScene::allEnemy.erase(j); //移除爆炸效果 sp->runAction(Sequence::create( Animate::create(a), CallFuncN::create([](Node * obj){ obj->getParent()->removeFromParentAndCleanup(true); }), NULL)); //加載下一關的操作 levelinf.clear(); //ValueMap allPoint.clear(); //Vector allEnemy.clear(); //Vector allTD.clear(); //Vector GameScene::allBullet.clear();//Vector this->removeAllChildrenWithCleanup(true);//從容器中刪除所有的孩子, 取決於cleanup參數同時會清除所有的活動的動作 【總結】 tiled地圖文件 引用的圖塊儘量要用同級目錄下的圖片,不然移植安卓會出現閃退,找不到文件 【項目總結】 定義個函數類型的變量:(可以用於參數傳遞) std::function<void ()> callback; 調用的時候callback(); 遊戲思想: 1、當精靈向上或者向下移動的時候,在地圖檢測碰撞的時候,可以取精靈的最上端或者最下端的點來進行驗證。 2、設置爆炸效果的時候,動畫執行完了,在移除: auto sequence = RepeatForever::create(Sequence::create(animate,CallFunc::create([this,s](){_mapLayer->removeChild(s,true);}),NULL)); s->runAction(sequence); 【cocostudio】 項目使用方法: 添加現有項目: cocos2dextensionsproj.win32 cocos2dcocosuiproj.win32 cocos2dcocoseditor-supportcocostudioproj.win32 然後選中項目右鍵,添加引用到項目中。 然後選中項目右鍵屬性,選中c++ 添加附加目錄:cocos2dcocos的目錄和cocos2d #include "cocos2d.h" #include "extensions/cocos-ext.h" #include "ui/CocosGUI.h" USING_NS_CC; using namespace ui; UI 【Button的使用:】 Button * button = Button::create("默認狀態的圖片","點擊的時候的圖片"); button->setPosition(ccp(100,100)); this->addChild(button); button->addTouchEventListener(this,toucheventselector(HelloWorld::touchEvent(); button->setPressedActionEnabled(true);//點擊的時候放大 void HelloWord::touchEvent(Ref *pSender,TouchEventType type){ switch(type) { case TOUCH_EVENT_BEGAN: break; case TOUCH_EVENT_MOVED: break; case TOUCH_EVENT_ENDED: break; case TOUCH_EVENT_CANCELED: //點擊後在外面取消觸發 break; default: break; } } 【CheckBox 複選框使用:】 CheckBox *checkBox = CheckBox::create("缺省情況下圖","被按下的圖","被激活的圖","缺省禁用的狀態","缺省禁用激活狀態"); this->addChild(checkBox); checkBox->addEventListenerCheckBox(this,checkboxselectedeventselector(Helloworld::selectEvent)); void HelloWorld::selectedEvent(Ref * pSender,CheckBoxEventType type){ switch(type){ case CHECKBOX_STATE_EVENT_SELECTED: //選中狀態下 break; case CHECKBOX_STATE_EVENT_UNSELECTED: //取消狀態下 break; } } 【Slider滑塊組件:】 Slider *slider = Slider::create(); slider->loadBarTexture("背景"); slider->loadSlidBallTextures("缺省狀態下控制圖片","缺省狀態下激活狀態的圖片"); slider->loadProgressBarTexture("進度的圖片"); slider->setPosition(ccp(100,100)); slider->addEventListenerSlider(this,slidepercentchangedselector(Helloworld::sliderEvent)); void Helloworld::slideEvent(Ref *s,SliderEventType type){ if(type == SLIDER_PRECENTCHANGED){ Slider * slider = (Slider *)s; int p = slider->getPercent();//獲得滑塊的數值 } } 【ImageView圖像組件:】 ImageView *img = ImageView::create("圖片"); this->addChild(img); img->setPosition(Point(100,100)); img->setScale9Enabled(true);//啓動縮放 img->setSize(Size(300,60));//可以設置圖片寬高 【LoadingBar 進度條:】 LoadingBar *l = LoadingBar::create("進度的圖片"); l->setPosition(Point(100,100)); this->addChild(l); l->setDirection(LoadingBarTypeRight);//讓進度條向右遞增 count = 0; this->schedule(schedule_selector(Helloworld::loadings),0.1); void Helloworld::loadings(float f){ LoadingBar * load = (LoadingBar *)this->getChildByTag(100); count ++; if(count>=100){count = 0;} load->setPercent(count); } 【添加圖片文字】 TextAtlas *t = TextAtlas::create("顯示的文字","紋理文字圖片","裁剪的寬度","裁剪的高度","從哪裏開始 如0"); t->setPosition(Point(100,100)); this->addChild(t); Text *text = Text::create("文本內容","字體",32); this->addChild(text); text->setSize(Size(200,300));//設置文本狂大小 text->ignoreContentAdaptWithSize(false);//設置自動換行 text->setTextHorisontalAlignment(TextHAlignment::CENTER);//設置文本居中 TextBMFont *mb = TextBMFont::create("顯示的內容","aaa.fnt"); mb->setPosition(Point(100,100)); 【文本輸入框】 TextField * t = TextField::create("請輸入文字","黑體",20); t->sePosition(Point(100,100)); this->addChild(t); t->setMaxLengthEnabeld(true); t->setMaxLength(3);//設置最多輸入的長度 t->getStringValue();//獲取輸入的字符信息 t->setPasswordEnabled(true);//設置密碼框 t->setPasswordStyleText("*");//設置密碼字符 t->addEventListenerTextField(this,textfieldeventselector(Hello::textFiledEvent)); void Hello::textFiledEvent(Ref *r,TextFiledEventType type){ switch(type){ case TEXTFIELD_EVENT_ATTACH_WITH_IME: break; ... } } 【Layout佈局組件】 Layout *l = Layout::create(); l->setSize(Size(200,200)); l->setBackGroundColorType(LAYOUT_COLOR_GRADIENT);// 背景漸變 l->setBackGroundColor(Color3B::GREEN);//背景顏色 l->setBackGroundImage("背景圖片"); l->setLayoutType(LAYOUT_LINBAR_VERTICAL);//垂直對其 在Layout中添加組件 Button *b = Button::create(); l->addChild(b); 【scrollView滾動視圖】 ScrollView * scrollView = ScrollView::create(); scrollView->setSize(Size(280.0f,150.f)); scrollView->setPosition(100,100); this->addChild(scrollView); scrollView->setInnerContainerSize(Size(280,1000)); scrollView->addChild(button);//添加一個button到視圖中 scrollView->setBounceEnabled(true);//反彈 scrollView->setBackGroundImage("xxx.png");//設置背景圖 scrollView->setDirection(SCROLLVIEW_DIR_BOTH);// 【pageView頁面翻轉】 PageView * p = PageView::create(); p->setSize(Size(100,300)); for(int i = 0; i < 3; i++){ Layout * layout = Layout::create(); layout->setSize(Size(200,130)); ImageView *img = ImageView::create("xxxx.png"); img->setSize(Size(200,130)); layout->addChild(img); p->addPage(layout); } pageView->addEventListenerPageView(this,pagevieweventselector(Hello::pageTest)); void Hello::pageTest(Ref *s,PageViewEventType type){ switch(type){ case PAGEVIEW_EVENT_TURNING: { PageView * p = (PageView *)(s); int page = p->getCurPageIndex()+1;//獲得當前的頁碼 } } } 【listView列表視圖】 ListView *l = ListView::create(); l->setDirection(SCROLLVIEW_DIR_VERTICAL); l->setTouchEnabled(true);//可以觸摸 l->setBounceEnabled(true);//可以反彈 l->setBackGroundImage("xxx.png");//設置背景圖 l->setSize(Size(200,100)); l->setPosition(100,100); l->addEventLisenerListView(this,listvieweventselector(Hello::listtest)); Layout *default_item = Layout::create(); Button * button = Button::create("",""); default_item ->addChild(button); l->setItemModel(default_item);//設置一個默認模型 for(int i = 0; i <5 ; i ++){ l->pushBackDefaultImte();//把模型放到listView 顯示5行默認模型 } for(int i = 0; i <5 ; i ++){ l->insetDefaultImte();//把模型放到listView 顯示5行默認模型 } l->removeLastItem(); l->removeItem(1); l->addEventListenerListView(this,listvieweventselector(Hello:listviewtest)); void Hello:listviewtest(Ref *s,ListViewEventType type){ switch(type){ case LISTVIEW_ONSELECTEDITEM_START: ListView *l = (ListView *)s; l->getCurSelectedIndex();//獲得當前選中的條目 break; } } 【RichText 覆文本,包含圖片 文本 動畫】 RichTest *t = RichText::create(); t->ignoreContentAdapWithSize(false);//自動換行 t->setSize(Size(100,100)); RichElementText *r1 = RichElementText::create(1,Color3B::WHITE,255,"This color is white","Helventica",10); RichElementText *r2 = RichElementText::create(1,Color3B::WHITE,255,"This color is white","Helventica",10); RichElementImage *img = RichElementImage::create(6,Color::WHITE,255,"fdfsd.png"); t->pushBackElement(r1); t->pushBackElement(r2); t->pushBackElement(img); this->addChild(t); 【用cocostadio ui編輯器】 #include "cocos2d.h" #include "uiCocosGUI.h" #include "cocostudio/Cocostudio.h" USING_NS_CC; using namespace ui; //加載UI編輯器編輯的UI佈局 Layout *l = static_cast<Layout *>(cocostudio::GUIReader::getInstance()->widgetFromJsonFile("NewUi_1.json")); this->addChild(l); //獲取佈局中的對象 Button *button1 = static_cast<Button *>(Helper::seekWidgetByName(l,"btn01"));//通過按鈕的名稱獲得按鈕 button1->addTouchEventListener(this,toucheventselector(HelloWorld::menuCloseCallback));//添加事件監聽 void HelloWorld::menuCloseCallback(Ref* sender,TouchEventType type) { switch(type) { case Widget::TouchEventType::ENDED: log(">>>"); } } 【box2d】 世界: 剛體:靜態剛體,動態剛體,平行剛體(像電梯,一直運動下去),由形狀和夾具組成的 形狀:圓形、多邊形 夾具:像人的各個部位都是一個傢俱,組成的形狀物體 關節: 線關節: 菱鏡關節: 旋轉的關節: 滑輪關節: 齒輪關節: 鼠標關節: 碰撞點: //獲得所有body對象 for(b2Body *b = m_world->getBodyList();b;b=b->getNext()) { //千萬不要在這裏直接刪除b指向的body對象,完成循環再刪除 } //獲得所有夾具 for(b2Join *j = m_world->getJoinList();j;j=j->getNext()) { //千萬不要在這裏直接刪除j指向的夾具對象,完成循環再刪除 } //獲得所有碰撞點 for(b2Join *j = m_world->getContactList();j;j=j->getNext()) { //千萬不要在這裏直接刪除j指向的碰撞點對象,完成循環再刪除 } CCSpriteBatchNode * batch = CCSpriteBatchNode::create("batch.png"); Texture2D *bs = batch->getTextture(); CCSprite* testIcon = CCSprite::createWithTexture( bs); batch->addChild(testIcon); addChild(batch); getPhysicsBody()->setDynamic(false);//設置成不是動態物體,不受力影響 getPhysicsBody()->setRotationEnable(false);//設置成不在旋轉 getPhysicsBody()->setVelocity(Vec2(0,100));//設置速度 編譯成功鏈接失敗: 1沒有重寫需要重寫的方法 2有的方法沒有實現,只是定義
cocos2dx 適合初學者的學習筆記【四】
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.