cocos2dx 適合初學者的學習筆記【四】

內容介紹:
自定義事件需要注意:
//必須把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有的方法沒有實現,只是定義


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