加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cocos2dx 适合初学者的学习笔记【四】

发布时间:2020-12-14 21:10:26 所属栏目:百科 来源:网络整理
导读:内容介绍:自定义事件需要注意://必须把t的坐标点转成节点坐标点if(e-getCurrentTarget()-getBoundingBox().containsPoint(e-getCurrentTarget()-convertToNodeSpace(t-getLocation()))){SimpleAudioEngine::getInstance()-playEffect("eat.wav");Director:
内容介绍:
自定义事件需要注意:
//必须把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有的方法没有实现,只是定义

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读