内容介绍: 自定义事件需要注意: //必须把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; autoitem=MenuItemImage::create( "card_1.png","card_2.png","card_3.png",CC_CALLBACK_1(LevelSelectPage::menuStartCallback,this)); menuItemVector.pushBack(item); autolevelMenu=Menu::createWithArray(menuItemVector); menu->alignItemsHorizontally();//菜单水平对齐 ValueMap: ValueMapdict=FileUtils::getInstance()->getValueMapFromFile("a.plist");//把plist文件转成ValueMap resources=dict["resources"].asValueMap(); levelInfo=dict["levelInfo"].asValueMap(); 静态变量一定要赋初值: A*A::a=NULL; 【tiled地图使用2:】 automap=TMXTiledMap::create("a.tmx"); TMXLayer*layer=map->getLayer("bg"); TMXObjectGroup*objects=map->getObjectGroup("obj"); ValueMappoint=objects->getObject(std::to_string(0)); map->getMapSize()是地图有几个块,map->getTileSize()是每一块的大小 layer->getTileGIDAt(Point(1,2));//获得该点上面的GID autotileTemp=map->getPropertiesForGID(gid).asValueMap();//获得对应GID上的属性字典 【cocos2dx-把触点坐标转换成TieldMap坐标】 cocos2d::CCPointHelloWorld::covertPointToTiledCoord(cocos2d::CCPointp) { intx=p.x/mMap->getTileSize().width; inty=((mMap->getMapSize().height*mMap->getTileSize().height)-p.y)/mMap->getTileSize().height; returnccp(x,y); } 【计算2点之间的距离】 doubledistance=this->getPosition().getDistance(enemy->sprite->getPosition()); 【使塔跟着敌人旋转】 autorotateVector=nearestEnemy->sprite->getPosition()-this->getPosition(); autorotateRadians=rotateVector.getAngle(); //获得弧度 autorotateDegrees=CC_RADIANS_TO_DEGREES(-1*rotateRadians); //获得角度 autospeed=0.5/M_PI;//获得速度 autorotateDuration=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、设置爆炸效果的时候,动画执行完了,在移除: autosequence=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; usingnamespaceui; UI【Button的使用:】 Button*button=Button::create("默认状态的图片","点击的时候的图片"); button->setPosition(ccp(100,100)); this->addChild(button); button->addTouchEventListener(this,toucheventselector(HelloWorld::touchEvent(); button->setPressedActionEnabled(true);//点击的时候放大 voidHelloWord::touchEvent(Ref*pSender,TouchEventTypetype){ switch(type) { caseTOUCH_EVENT_BEGAN: break; caseTOUCH_EVENT_MOVED: break; caseTOUCH_EVENT_ENDED: break; caseTOUCH_EVENT_CANCELED://点击后在外面取消触发 break; default: break; } } 【CheckBox复选框使用:】 CheckBox*checkBox=CheckBox::create("缺省情况下图","被按下的图","被激活的图","缺省禁用的状态","缺省禁用激活状态"); this->addChild(checkBox); checkBox->addEventListenerCheckBox(this,checkBoxselectedeventselector(Helloworld::selectEvent)); voidHelloWorld::selectedEvent(Ref*pSender,CheckBoxEventTypetype){ switch(type){ caseCHECKBox_STATE_EVENT_SELECTED: //选中状态下 break; caseCHECKBox_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)); voidHelloworld::slideEvent(Ref*s,SliderEventTypetype){ if(type==SLIDER_PRECENTCHANGED){ Slider*slider=(Slider*)s; intp=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); voidHelloworld::loadings(floatf){ 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)); voidHello::textFiledEvent(Ref*r,TextFiledEventTypetype){ switch(type){ caseTEXTFIELD_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(inti=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)); voidHello::pageTest(Ref*s,PageViewEventTypetype){ switch(type){ casePAGEVIEW_EVENT_TURNING: { PageView*p=(PageView*)(s); intpage=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(inti=0;i<5;i++){ l->pushBackDefaultImte();//把模型放到listView显示5行默认模型 } for(inti=0;i<5;i++){ l->insetDefaultImte();//把模型放到listView显示5行默认模型 } l->removeLastItem(); l->removeItem(1); l->addEventListenerListView(this,listvieweventselector(Hello:listviewtest)); voidHello:listviewtest(Ref*s,ListViewEventTypetype){ switch(type){ caseLISTVIEW_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,"Thiscoloriswhite","Helventica",10); RichElementText*r2=RichElementText::create(1,10); RichElementImage*img=RichElementImage::create(6,Color::WHITE,"fdfsd.png"); t->pushBackElement(r1); t->pushBackElement(r2); t->pushBackElement(img); this->addChild(t); 【用cocostadioui编辑器】 #include"cocos2d.h" #include"uiCocosGUI.h" #include"cocostudio/Cocostudio.h" USING_NS_CC; usingnamespaceui; //加载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));//添加事件监听 voidHelloWorld::menuCloseCallback(Ref*sender,TouchEventTypetype) { switch(type) { caseWidget::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有的方法没有实现,只是定义