cocos2dx

cocos

网络通信

  • libcurl集成和使用

CURL *easy_handle = curl_easy_init(); // 初始化curl句柄接口
curl_easy_setopt(easy_handle, CURLOPT_URL, *str); // 该函数设置easy_handle访问网站的链接,str中写url
size_t write_data(void *buffer, size_t size, size_t nmemb, void* userp); // 
curl_easy_setopt(easy_handle, CURLOPT_WRITEUNCTION, write_data); // 设置请求的回调函数
curl_easy_setopt(easy_handle, CURLOPT_WRITEDATA, &internal_struct); // 回调函数自定义数据传递
success = curl_easy_perform(easy_handle); // 指定curl句柄,success判断是否成功
size_t read_funtion(char *bufptr, size_t size, size_t nitemes, void *userp); // 上传数据回调函数
curl_easy_setopt(easy_handle, CURLOPT_READFUCTION, read_funtion); // 绑定回调函数
curl_easy_setopt(easy_handle, CURLOPT_READDATA, &filedata); // 设置回调函数的形参
curl_easy_setopt(easy_handle, CURLOPT_UPLOAD, 1L); // 声明上传的是文件
curl_easy_setopt(easy_handle, CURLOPT_INFILESIZE_LARGE, file_size); // 配合上面的函数,指定上传文件的大小
curl_easy_setopt(easy_handle, CURLOPT_POSTFIELDS, *str); // str中存放post请求参数
curl_easy_setopt(easy_handle, CURLOPT_POSTFIELDSIZE, sizeof(str)); // post参数的大小
curl_easy_setopt(easy_handle, CURLOPT_HTTPGET, 1L); // 回到原生状态
int progress_callback(void* clientp, double dltotal, double dlnow, double ultotal, double ulnow); // 进度的回调函数
	CURLOPT_PROGRESSFUNCION, CURLOPT_NOPREOCESS:使用这个宏来设置进度的回调函数


static size_t write_data(void *buffer, size_t size, void *userp) {
	log("%s", (char *)buffer);
	FILE *file = (FILE *)userp; // 输出网页返回的数据
	return size; // 返回处理后的数据的长度
}

static size_t read_function(void *buffer, size_t size, void *userp) {
	
}

bool HelloWorld::init()
{
    if ( !Scene::init() )
    {
        return false;
    }

    auto visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();


	curl_global_init(CURL_GLOBAL_ALL); // 初始化

	log("star");
	do
	{
		CURL *easy_handle = curl_easy_init();
		curl_easy_setopt(easy_handle, CURLOPT_URL, "http://120.79.249.199:8080/RoseProj/seachPerson/theYear?minyear=1990&maxyear=1999");
		curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, write_data);
		FILE *file ;
		curl_easy_setopt(easy_handle, CURLOPT_WRITEDATA, &file); // 该函数传入的file就是write_data函数的userp形参
		
		CURLcode success = curl_easy_perform(easy_handle);
		if (success == CURLE_OK)
		{

		}

		curl_easy_setopt(easy_handle, CURLOPT_READFUNCTION, read_function);
		FILE *file2;
		curl_easy_setopt(easy_handle, CURLOPT_READDATA, &file2); // 与上述CURLOPT_WRITEDATA相似,file2作为read_function函数的userp形参
		// curl_easy_setopt(easy_handle, CURLOPT_UPLOAD, 1L); // 如果是要上传文件,需要使用这个函数来声明
		// curl_easy_setopt(easy_handle, CURLOPT_INFILESIZE_LARGE, file_size); // 配合上面的函数,指定上传文件的大小
		success = curl_easy_perform(easy_handle); // 完成数据上传操作
		curl_easy_setopt(easy_handle, CURLOPT_POSTFIELDS, "name=username&pwd=123"); // str中存放post请求参数
		curl_easy_setopt(easy_handle, CURLOPT_POSTFIELDSIZE, sizeof("name=username&pwd=123")); // post参数的大小
	} while (0);
	log("fin");
    return true;
}

void HelloWorld::initNet()
{
}

void HelloWorld::onExit()
{
	Scene::onExit(); // 执行父类的onExit
	curl_global_cleanup(); // 清除,有初始就要清除
}

  • 复杂类型的句柄:multi_handle

    • 异步执行,上面的curl_easy_perform是单步的执行的会造成堵塞
  • cocos2d的http请求

    • HttpRequest
    • HttpClient


void HttpClientTest::onHttpRequestCompleted(HttpClient *sender, HttpResponse *response) // 回调函数
{
    if (!response)
    {
        return;
    }
    
    if (0 != strlen(response->getHttpRequest()->getTag())) 
    {
        log("%s completed", response->getHttpRequest()->getTag());
    }
    
    long statusCode = response->getResponseCode();
    char statusString[64] = {};
    sprintf(statusString, "HTTP Status Code: %ld, tag = %s", statusCode, response->getHttpRequest()->getTag());
    _labelStatusCode->setString(statusString);
    log("response code: %ld", statusCode);
    
    if (!response->isSucceed())  // 请求失败
    {
        log("response failed");
        log("error buffer: %s", response->getErrorBuffer());
        return;
    }
    
    std::vector<char> *buffer = response->getResponseData(); // 获取返回数据
    log("Http Test, dump data: ");
    for (unsigned int i = 0; i < buffer->size(); i++)
    {
        log("%c", (*buffer)[i]);
    }
    log("\n");
    if (response->getHttpRequest()->getReferenceCount() != 2)
    {
        log("request ref count not 2, is %d", response->getHttpRequest()->getReferenceCount());
    }
}

void HttpClientTest::onMenuPostBinaryTestClicked(cocos2d::Ref *sender, bool isImmediate)
{
    HttpRequest* request = new (std::nothrow) HttpRequest(); // 新建request请求对象
    request->setUrl("http://httpbin.org/post"); // 设置url
    request->setRequestType(HttpRequest::Type::POST); // 设置请求方式
    request->setResponseCallback(CC_CALLBACK_2(HttpClientTest::onHttpRequestCompleted, this)); // 设置回调函数
    
    // write the post data
    char postData[22] = "binary=hello\0\0cocos2d";  // including \0, the strings after \0 should not be cut in response
    request->setRequestData(postData, 22);  
    if (isImmediate)
    {
        request->setTag("POST Binary immediate test");
        HttpClient::getInstance()->sendImmediate(request); // 发送请求
    }else
    {
        request->setTag("POST Binary test");
        HttpClient::getInstance()->send(request); // 发送请求
    }
    request->release();// 释放request资源
    
    // waiting
    _labelStatusCode->setString("waiting...");
}

多线程

  • pthread
  • std::thread

数据存储

  • FileUtils:文件工具
    • getFileData:文件数据
    • getFileDataFromZip:从压缩包中获取文件数据
    • getWritablePath:获得可写的路径
    • FileUtils::sharedFileUtils()->getWritablePath();单例模式
  • UsreDefault:存取数据公式(轻量级数据)
    • 单例模式
  • FILE:存取文件的方式(比UserDefault重一点的数据)
  • 更重量级的数据建议使用数据库

网络数据处理

  • xml

    1. tinyxml2,tinyxml2::XMLDocument
    2. Dictionary::createWithContentsOfFile("****.xml"); ((String *)strings->objectForKey(“welcome”))->getCString();
  • json : rapidjson::Document

  • plist : FileUtils::getInstance()->getValueMapFromFile(FIleUtils::getInstance()->getWritablePath() + “***.plist”));

  • 处理中文:ICONV或者xml文件

增量更新

  • AssetsManagerEx(常用,更强大稳定)
  • AssetsManager

音频

  • SimpleAudioEngine
  • AudioEngine
// 引入 头文件
#include "audio/include/AudioEngine.h"

using namespace experimental;

// 播放一个2d的sound

int _audioID = AudioEngine::play2d("background.mp3", _loopEnabled, _volume);

// 停止一个2d在sound

AudioEngine::stop(_audioID);

// 暂停一个2d在sound

AudioEngine::pause(_audioID);

AudioEngine::resume(_audioID);

// 设置sound是否循环

AudioEngine::setLoop(_audioID, _loopEnabled);

// 设置音量

AudioEngine::setVolume(_audioID, _volume);

// 设置播放点

AudioEngine::setCurrentTime(_audioID,_duration * ratio);

// 获得当前播放点

_duration = AudioEngine::getDuration(_audioID);

上述代码版权声明:本文为CSDN博主「你的财神爷」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liu943367080/article/details/45457777

分辨率适配

  • Director::getInstance()->getOpenGLView()->setDesignResolutionSize (float width, float height, ResolutionPolicy resolutionPolicy)
    • EXACT_FIT:以设置的分辨率为标准,按照该分辨率对x和y进行拉伸
    • NO_BORDER:不留黑边,拉伸,等比缩放,有一个方向(上下或左右)会超出屏幕
    • SHOW_ALL:设置的分辨率区域全部可见,但是上下左右都可能出现黑边
    • FIXED_HEIGHT:锁定分辨率的高度,宽度不管,可能出现黑边也可能超出屏幕
    • FIXED_WIDTH:锁定宽度
  • 获取坐标码
    • getWinSize:获取OpenGL窗口的大小
    • getWinSizeInPixels:获取OpenGL窗口的实际像素大小
    • getVisibleSize:获取可视窗口的大小
    • getVisibleOrigin:获取可视窗口左下角的位置
    • getFrameSize:获取设备或窗口的尺寸
    • getDesignResloutionSize:获取设备的设计分辨率

精灵

  • Sprite
    • 创建:调用Node基类的init函数
    • 设置纹理 setTexture
    • 渲染:draw
  • SpriteFrame,SpriteFrameCache
    • SpriteFrame用于描述Sprite显示内容的类,可以让Sprite方便的显示内容,常用于表示一个大图集里的一张小图或一组帧动画中的一帧
    • SPriteFrameCache用于缓存SpriteFrame,是一个单例
    • SpriteFrame
      • createWithTextrure
    • SPriteFrameCache
      • getInstance
      • addSpriteFramesWithFile(通过plist文件)
      • removeSpriteFramesFromFIle 将指定的plist的所有SpriteFrame卸载
      • getSpriteFrameByName 使用指定的名字来获取SpriteFrame

动作系统

  • ActionManager类
    • 使用哈希容器来存放Action类,可以将这个哈希容器看成以Node位key,Action数组为Value的容器
    • 可以通过target暂停,恢复,删除action动作
  • 瞬间动作
    • Show
    • Hide
    • FilpX
    • FlipY
    • Place
    • ToggleVisibility
  • 持续动作
    • Rotate 旋转
    • Move 移动
    • Skew 倾斜
    • Jump 跳跃
    • Bezier 贝塞尔曲线运动
    • Scale 大小
    • Blink 闪烁
    • Fade 隐藏
    • Tint 颜色变换
  • 组合动作(参数最后需要添加一个NULL)
    • Sequence 组合动作顺序
    • Repeat 重复
    • RepeatForever 无限重复
    • Spawn 同步执行
  • 变速动作
  • 特效动作
    • OrbitCamera 摄像机环绕特效
    • Waves3D 3D旗帜翻滚的效果
    • FilpX3D 沿X轴3D翻滚效果
    • FlipY3D 沿Y轴3D翻滚效果
    • Lens3D 3D透镜效果
    • Ripple3D 3D涟漪效果
    • Shaky3D 3D摇晃效果
    • Liquid 流体效果
    • Waves2D 波浪效果
    • Twirl 旋转扭曲效果
    • PageRurn3D 翻页效果
    • ……

Sprite * sp= Sprite::create("Icon.png");
sp->setPosition(Vec2(150, 150));
addChild(sp,0,922);

//    Action动作

// MoveBy  创建一个移动的动作   参数1:移动到目标坐标所需的时间 参数2:目标坐标    
// 支持reverse 可以获取其反向动作
//     MoveTo  一样的
ActionInterval * moveBy = MoveBy::create(5,Vec2(300, 100));
ActionInterval * actionmoveback= moveBy->reverse();
sp->runAction(actionmoveback);

//     ScaleTo   作用:创建一个缩放的动作
//    参数1:达到缩放大小所需的时间
//    参数2 :缩放的比例
ActionInterval * scaleto = ScaleTo ::create(2, 2);
sp->runAction(scaleto);

//     ScaleBy  作用:创建一个缩放的动作
//    参数1:达到缩放大小的所需时间  参数2:缩放比例
ActionInterval * scaleby = ScaleBy::create(2, 2);
ActionInterval * actionbyback = scaleby->reverse();
sp->runAction(actionbyback);

//     RotateTo
//    作用创建一个旋转的动作
//    参数1:旋转的时间  参数2:旋转饿角度  0 - 360
ActionInterval * rotateto = RotateTo::create(2, 90);
sp->runAction(rotateto);

//   SkewTo
//   作用创建一个倾斜的动作
//    参数1:倾斜到特定角度所需的时间
//    参数2:x轴的倾斜角度
//    参数3:y轴的倾斜角度
ActionInterval * skewto = SkewTo::create(2, 10, 10);
sp->runAction(skewto);

//     JumpTo
//    作用:创建一个跳的动作
//    参数1:跳到目标动作位子的所需时间
//    参数2:目标位置
//    参数3:跳的高度
//    参数4跳到目标位置的次数
ActionInterval* jumpto = JumpTo ::create(2, Vec2(300, 200), 50, 4 );
sp->runAction(jumpto);

//     JumpBy
//    作用:创建一个跳的动作
//    参数1:跳到目标动作位子的所需时间
//    参数2:目标位置
//    参数3:跳的高度
//    参数4跳到目标位置的次数
//    这个支持方向动作reverse
ActionInterval * jumpby = JumpBy ::create(3, Vec2(300, 200), 50, 4);
ActionInterval * ac= jumpby->reverse();
sp->runAction(ac);



//         Bezier
//     BezierConfig结构体
 BezierConfig bezierCon;
bezierCon.controlPoint_1=Vec2(200, 150);//控制点1
bezierCon.controlPoint_2=Vec2(200, 160);//控制点2
bezierCon.endPosition =Vec2(340, 100);// 结束位置
//BezierTo
//        创建一个贝塞尔曲线运动的动作
//        参数1:贝塞尔曲线运动的时间
//        参数2 : BezierConfig结构体
ActionInterval * action = BezierTo::create(2, bezierCon);
ActionInterval * action1 = BezierBy::create(3, bezierCon);//支持反向
ActionInterval * action2 = action->reverse();
sp->runAction(action1);


//FadeIn
//作用:创建一个渐变出现的动作
//参数是时间
ActionInterval * fadein = FadeIn::create(2);
sp->runAction(fadein);


//     FadeOut
//    作用:创建一个渐变消失的动作
//    参数是时间
ActionInterval * fadeout = FadeOut::create(2);
sp->runAction(fadeout);


// TintTo
//    作用:创建一个色彩变化的消失动作
//    参数1:色彩变化的动作
//    参数2 :红色分量
//    参数3:蓝色分量
ActionInterval * tinto = TintTo ::create(3, 255, 255, 0);
sp->runAction(tinto);


//     TintBy
//    作用:创建一个色彩变化的出现动作
//    参数1:色彩变化的动作
//    参数2 :红色分量
//    参数3:蓝色分量   但是家了reverse就是 反向的
ActionInterval * tintby = TintBy::create(3, 0, 255, 255);
ActionInterval * tintby1 = tintby->reverse();
sp->runAction(tintby1);

//     Blink
//    作用 :创建一额闪烁的动作
//    参数1:闪烁完成的时间
//    参数2:闪烁的次数

ActionInterval * blink = Blink ::create(3, 10);
sp->runAction(blink);



//     DelayTime
//    创建一个延迟的动作
//    参数  延迟的时间
ActionInterval * delaytime = DelayTime::create(3);
sp->runAction(delaytime);

//     OrbitCamera
//    作用:创建一个球面坐标轨迹进行旋转的动作
//    参数1 : 旋转轨迹的时间
//    参数2 :起始半径
//    参数3:半径差
//    参数4:起始z角
//    参数5:旋转z角的差
//    参数6:起始x角
//    参数7:旋转x角的差
ActionInterval * orbitcameraa = OrbitCamera::create(3, 10, 0, 45, 180, 90, 0);
sp->runAction(orbitcameraa);


//     CardinalSpline
//    作用:创建数组  点的数组
PointArray * array = PointArray::create(20);
array->addControlPoint(Vec2(0,0));
array->addControlPoint(Vec2(210,0));
array->addControlPoint(Vec2(210,240));
array->addControlPoint(Vec2(0,160));
array->addControlPoint(Vec2(0,0));
//    CardinalSplineTo
//    作用:创建一个样条曲线轨迹的动作
//    参数1:完成轨迹所需的时间
//    参数2:控制点的坐标数组
//    拟合度  其值= 0 路径最柔和
ActionInterval  * CardinalSplineTo=CardinalSplineTo::create(3, array, 0);
sp->runAction(CardinalSplineTo);


//    CardinalSplineBy
//    作用:创建一个样条曲线轨迹的动作
//    参数1:完成轨迹所需的时间
//    参数2:控制点的坐标数组
//    拟合度  其值= 0 路径最柔和
ActionInterval * CardinalSplineBy = CardinalSplineBy::create(3, array, 0);
sp->runAction(CardinalSplineBy);

//    CatmullRomTo   CatmullRomBY
//    作用:创建一个样条插值轨迹
//    参数1:完成轨迹的时间
//    参数2:控制点的数组坐标
ActionInterval * catmullRomTo = CatmullRomTo::create(3, array);
sp->runAction(catmullRomTo);

//    Follow
//    作用:创建一个跟随动作
//    参数1:跟随的目标对象
//    跟随范围,离开范围就不再跟随
//创建一个参照物spT
Sprite * spt = Sprite::create("Icon.png");
spt->setPosition(Vec2(420,40));
addChild(spt);
sp->runAction(MoveTo::create(3, Vec2(940,sp->getPositionY())));

Follow * follow = Follow::create(sp,Rect(0, 0, 960, 320));
this-> runAction(follow);

//     EaseBounceIn
//    目标动作
ActionInterval* move = MoveTo::create(3, Vec2(300, sp->getPositionY()));
    让目标动作缓慢开始
    参数:目标动作
ActionInterval * EaseBounceIn = EaseBounceIn::create(move);
sp->runAction(EaseBounceIn);

//    EaseBounceOut
//    作用:让目标动作赋予反弹力,且以目标动作结束位子开始反弹
//    参数目标动作
ActionInterval * easeBounceOut = EaseBounceOut ::create(move);
sp->runAction(easeBounceOut);

//    EaseBounceInOut
//    作用:让目标动作赋予反弹力,且以目标动作起始与结束位子开始反弹
ActionInterval * easeBounceInOut= EaseBounceInOut::create(move);
sp->runAction(easeBounceInOut);

//   EaseBackIn
//    作用:让目标动作赋予回力 , 且以目标动作起点位置作为回力点
//    参数:目标动作
ActionInterval * easeBackIn = EaseBackIn::create(move);
sp->runAction(easeBackIn);

//    EaseBackOut
//    作用:让目标动作赋予回力 , 且以目标动作终点位置作为回力点
//    参数:目标动作
ActionInterval *easeBackOut = EaseBackOut::create(move);
sp->runAction(easeBackOut);

//     EaseBackInOut
//    作用:让目标动作赋予回力 , 且以目标动作起点和终点位置作为回力点
//    参数:目标动作
 ActionInterval * easeBackInOut =  EaseBackInOut::create(move);
sp->runAction(easeBackInOut);

//     EaseElasticIn
//    作用:让目标动作赋予弹性 ,且以目标动作起点位子赋予弹性
//     参数:目标动作
 ActionInterval * easeElasticIn=  EaseElasticIn::create(move);
sp->runAction(easeElasticIn);

//      EaseElasticOut
//    作用:让目标动作赋予弹性 ,且以目标动作终点位子赋予弹性
//     参数:目标动作
 ActionInterval *easeElasticOut =  EaseElasticOut::create(move);
sp->runAction(easeElasticOut);

//     EaseElasticInOut
//    作用:让目标动作赋予弹性 ,且以目标动作起点和终点位子赋予弹性
//     参数:目标动作
 ActionInterval *easeElasticInOut =  EaseElasticOut::create(move);
sp->runAction(easeElasticInOut);


//     EaseExponentialIn
//    让目标动作缓慢开始
//    参数:目标动作
 ActionInterval * easeExponentialIn=  EaseExponentialIn::create(move);
sp->runAction(easeExponentialIn);

//     EaseExponentialOut
//    让目标动作缓慢中止
//    参数:目标动作
ActionInterval * easeExponentialInt=  EaseExponentialOut::create(move);
sp->runAction(easeExponentialInt);

//     EaseExponentialInOut
//    让目标动作缓慢开始和中止
//    参数:目标动作
 ActionInterval * easeExponentialInOut=  EaseExponentialInOut::create(move);
sp->runAction(easeExponentialInOut);

//     EaseRateAction
//    作用 : 让目标动作设置速率
//    参数1:目标动作
//    参数2:速率
 ActionInterval * moveto =  MoveTo::create(5,  p(300,sp->getPositionY()));
 ActionInterval * easeRateAction =  EaseRateAction::create(move, 3);
sp->runAction(easeRateAction);

//     EaseSineIn
//    作用:动作由慢到快
//      参数:目标动作
 ActionInterval * easeSineIn =  EaseSineIn::create(move);
sp->runAction(easeSineIn);

//     EaseSineOut
//    作用:动作由快到慢
//      参数:目标动作
 ActionInterval * easeSineOut =  EaseSineOut::create(move);
sp->runAction(easeSineOut);

//     EaseSineInOut
//    作用:动作由慢到快再快到慢
//      参数:目标动作
 ActionInterval * easeSineInOut =  EaseSineInOut::create(move);
sp->runAction(easeSineInOut);

//     Speed
//    作用:让目标动作运行速度加倍
//    参数1:目标动作
//    参数2:倍速
 ActionInterval * move =  MoveTo::create(10,  p(300,sp->getPositionY()));
 Speed * speed = Speed::create(move, 100);
sp->runAction(speed);

//     Spawn
//  作用:让多个动作同时执行
//    参数:目标动作的可变参数
 ActionInterval * move1 =  MoveTo::create(10,  p(300,sp->getPositionY()));
 ActionInterval * scale =  ScaleTo::create(2, 3);
 ActionInterval * rotate =  RotateTo::create(4, 190);
 FiniteTimeAction * spawn = Spawn::create(move1,scale,rotate,NULL);
sp->runAction(spawn);

//     Sequence
//    作用:让多个动作按照前后顺序逐一执行
//    参数:目标动作的可变参数
 ActionInterval * move2 =  MoveTo::create(2,  p(300, sp->getPositionY()));
 ActionInterval * scalet =  ScaleTo::create(2, 3);
 FiniteTimeAction * seq=  Sequence::create(move2,scalet,NULL);
sp->runAction(seq);


    //    扩展如果要对目标动作全部进行方向运动,可以使用如下形式操作
 FiniteTimeAction *seqe= Sequence::create(moveby,scaleby,...NULL);
 FiniteTimeAction * reverseseq =  Sequence::create(seqe,seq->reverse(),NULL)

//注意 Sequence中的所有动作都必须支持reverse函数,否则会出现异常
 ActionInterval * move =  MoveBy::create(2,  p(300, sp->getPositionY()));
 ActionInterval * scale =  ScaleBy::create(2, 3);
 FiniteTimeAction * seq=  Sequence::create(move,scale,NULL);
 FiniteTimeAction * reveseseq =  Sequence::create(seq,seq->reverse(),NULL);
sp->runAction(reveseseq);

//     Repeat
//    作用:对目标动作进行重复运动(目标动作可以是 Sequence , Spawn)
//    参数1:目标动作
//    参数2:重复次数
 ActionInterval * move =  MoveTo::create(2,  p(300, sp->getPositionY()));
 ActionInterval * move2 =  MoveTo::create(2,  p(100,100));
 FiniteTimeAction*seq = Sequence::create(move,move2,NULL);
 FiniteTimeAction *repeat =  Repeat::create(seq, 3);
sp->runAction(repeat);


//     RepeatForever
//    作用:对目标动作进行永久性的重复运动(目标动作可以是 Sequence , Spawn)
//    参数:目标动作
 ActionInterval * move =  MoveTo::create(1,  p(300, sp->getPositionY()));
 ActionInterval * move1 =  MoveTo::create(1,  p(100,100));
 FiniteTimeAction* seq =  Sequence::create(move,move1,NULL);
 ActionInterval * repeatForever = RepeatForever::create(( ActionInterval* )seq);
sp->runAction(repeatForever);

//     CallFunc
//    作用:创建一个回调动作(调用不带参数的回调方法);
//    参数1:目标动作
//    参数2:目标回调函数
 ActionInterval * move =  MoveTo::create(1,  p(300, sp->getPositionY()));
 CallFunc * funcall=  CallFunc::create(this, callfunc_selector(HelloWorld::callbackC));
 FiniteTimeAction * seq =  Sequence::create(move,funcall,NULL);
sp->runAction(seq);

//     CallFuncN
//    作用:创建一个回调动作(调用 带一个参数的回调方法);
//    参数1:目标动作
//    参数2:目标回调函数
 ActionInterval * move =  MoveTo::create(1,  p(300, sp->getPositionY()));
 CallFuncN * funcall=  CallFuncN::create(this, callfuncN_selector(HelloWorld::callbackN));
 FiniteTimeAction * seq =  Sequence::create(move,funcall,NULL);
sp->runAction(seq);

//     CallFuncND
//    作用:创建一个回调动作(调用 带两个参数的回调方法);
//    参数1:目标动作
//    参数2:目标回调函数
 ActionInterval * move =  MoveTo::create(1,  p(300, sp->getPositionY()));
 CallFuncND * funcall=  CallFuncND::create(this, callfuncND_selector(HelloWorld::callbackND)  ,(void*)0xbebabeba);
 FiniteTimeAction * seq =  Sequence::create(move,funcall,NULL);
sp->runAction(seq);

动画

  • 帧动画
    • Animation和Animate
  • 进度动画
    • Progress和Progresstimer

显示文字

  • Label

UI控件

  • 按钮
    • Button
      • create:需要指定正常显示图片,触摸时图片和禁用状态的图片
      • loadTexture****:加载图片
      • 设置九宫
      • setTitle****:设置文字
    • CheckBox
      • create:需要指定背景图片,选中框图片,禁用状态背景和x图片
      • loadTexture****:加载图片
      • isSelected:是否是选中状态
      • setSelected(bool):设置选中状态
      • addEventListener:注册状态切换时的回调函数
    • LoadingBar:进度条控件
      • create:图片名和进度百分比
      • 纹理,九宫
      • setDirection:设置刷新方向
      • setPercent:设置当前进度
      • getPercent:获取当前进度
    • Slider:进度条滑块
      • create:正常的滑块图片,按下时的滑块图片,禁用时的滑块图片
      • 九宫
      • setPercent:设置当前进度
      • getPercent:获得当前进度
      • addEventListener:事件回调(函数原型:void fun(Ref* , EventType),Ref* 时Slider对象)
  • 文本
    • Text:文本输入
      • create:字符串,字体,字体大小
      • setTouchScaleChangeEnabled:开启文字点击缩放
    • RichText:富文本编辑
    • TextFiled:文本输入控件
      • create:提示文本,字体名,字号
      • setTouchSize:设置自定义触摸区域
      • setTouchAreaEnable:是否开启自定义触摸区域
      • hitTest:判断触摸点是否在触摸区域
      • setPasswordEnable:输入内容是否为密码
      • setPasswordStyleText:密码符号(默认是*)
      • setFonsize:设置字体大小
      • setFontName:设置字体
      • setMaxLengthEnabled:是否限制最大长度限制
      • setMaxLength:设置最大输入长度
      • setPlaceHolder:设置提示文本
      • setPlaceHolderColor:设置输入提示文本的颜色
      • setTextColor:设置提示文本的颜色
      • getString:获取输入文本的内容
      • setString:设置输入文本
      • setInsertText:设置是否允许输入
      • setDeleteBackward:设置是否允许删除
      • addEventListener:注册回调事件
      • setTextHorizontalAlignment:设置文本水平对齐
      • setTextVertialAlignment:设置文本垂直对齐
    • EditBox:TextField的升级版
      • create:尺寸,九宫图片名
      • setText:设置文本框的文本内容
      • getText:获取文本内容
      • setFont:设置字体和字号
      • setFontName:设置字体
      • setFontSize:设置字号
      • setFontColor:设置文本颜色
      • setPlaceHolder:设置提示文本
      • setPlaceHolderFont:设置输入提示文本的字号字体
      • setPlaceHolderColor:设置提示文本颜色
      • setDelegate:设置输入委托对象
      • setInputMode:设置输入模式
        • ANY:任何文本
        • ENMAIL_ADDRESS:email地址
        • NUMERIC:整型数字
        • PHONE_NUMBER:电话号码
        • URL:url连接
        • NUMERIC:允许小数
        • SINGLE_LINE:之允许输入单行
      • setInputFlag:设置输入标签,输入标签决定用户输入的内容如何显示
        • PASSWORD:显示为密码
        • SENSITIVE:无意义,输入内容很敏感
        • INITIAL_CAPS_WORD:所有单词首字母大写
        • INITIAL_CAPS_SENTENCE:所有句子的首字母大写
        • INTIAL_CPAS_ALL_CHARACTERS:不做处理,直接显示
      • setMaxLength:设置文本长度限制
      • setReturnTpe:设置确认返回类型,在回调委托时传入给委托对象
  • 容器控件

CocosStudio工具链

Box2D

  • World:物理世界
  • body:刚体,物理对象
  • shape:形状,用于检测的2D几何形状
  • fixture:夹具,将形状固定到刚体
  • constraint:约束,限制刚体的自由度即旋转或移动
  • contact constraint:接触约束,防止刚体穿透,以及用于模拟摩擦和恢复的特殊约束
  • Joint:关节,将多个刚体固定到一起的约束,例如:脚通过膝关节将大腿和小腿进行固定和约束
  • Joint limit:关节限制,限制了关节的活动范围
  • Joint motor:关节马达,按照关节的自由度来驱动所连接的刚体
  • 流程
    • 初始化Box2d的世界
    • 创捷对象,操作对象
    • 在循环中更新物理世界(Box2d会自动执行碰撞处理,并触发碰撞监听,创建对象等操作不能在碰撞监听回调中执行)
    • 需要在update函数中调用world.Setp(dt, velocityIterations, positionIterations)
      • velocityIterations,positionIterations 速度迭代数和位置迭代数,默认是8,3
      • 可以根据要求进行调整,数值越高越精确同时效率越低

b2Vec2 gravity(0.0f, -9.8f);
b2World world(gravity);

b2BodyDef groundBodyDef;
groundBodyDef.position.Set(0.0f, -10.0f);
b2Body* groundBody = world.CreateBody(&groundBodyDef); // 创建对象

b2PolygonShape groundBox;
groundBox.SetAsBox(50.0f, 10.0f) ; // 设置形状为宽50,高10
groundBody->CreateFixture(&groundBox, 0.0f); // 质量为0,默认是静态物体

// 定义动态body
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodeDef.position.Set(0.0f, 4.0f);
b2Body* body = world.CreateBody(&bodyDef);

// 定义另一个四边形
b2PolygonShape denamicBox;
denamicBox.SetAsBox(1.0f, 1.0f);

// 定义动态Body的配置
b2FixtureDef fixtureDef;
fixtureDef.shape = &denamicBox;

// 动态对象的密度不为0
fixtureDef.density = 1.0f;

// 设置摩擦力
fixtureDef.friction = 0.3f;

// 将形状配置到body
body->createFixture(&fixtureDef);

  • world的操作

//传入描述创建Body
b2Body* CreateBody(const b2BodyDef* def);
// 释放指定body
void DestroyBody(b2Body* body);
// 创建一个关节把两个Body联系起来
b2Joint* CreateJoint(const b2JointDef* def);
// 销毁关节
void DestroyJoint(b2Joint* joint);
// 在一个时间步内,进行物理模拟,碰撞检测,约束解决等
void Setp(float32 dt, int32 velocityIterations, int32 positionIterations);
// 设置全局的重力加速度
void SetGravity(const b2Vec2& gravity);
// 获取全局的重力加速度
b2Vec2 GetGravity() const;

  • 刚体

    • 静态:永远不会移动,不论其他刚体使用多大的力,也不会与其他静态刚体碰撞
    • 动态:可以运动的对象,可以与任何刚体发生碰撞;碰到动力学刚体和撞到静态刚体都会被弹开;碰到动态刚体会相互作用,可能互相弹开,也可能一个被撞飞
    • 动力学:可以移动,不受任何力的影响,和静态刚体不会发生碰撞,动力学刚体之间也不会发生碰撞;动力学刚体的运动会对动态刚体产生力的作用
  • 由于动力学刚体不受力或冲量的作用,所以只能通过Body->SetLinearVelocity 设置先行速度或关节的马达驱动

静态刚体动力学刚体动态刚体
静态刚体不碰撞不碰撞碰撞
动力学刚体不碰撞不碰撞碰撞
动态刚体碰撞碰撞碰撞

游戏者可以从下往上跳穿过平台,但是从上往下会被平台挡住
只需要Box2d的监听,判断方向决定是否禁用此次碰撞


// 物体属性定义
b2BodyDef(){
  userData = NULL;                // 默认没有额外数据
  position.Set(0.0f, 0.0f);       // 默认的位置和旋转角度
  angle = 0.0f;                   
  linearVelocity.Set(0.0f, 0.0f); // 线性加速度和角速度等
  angularVelocity = 0.0f;
  linearDamping = 0.0f;
  angularDamping = 0.0f;
  allowSleep = true;
  awake = ture;                   // 一开始是清醒状态
  fixedRotation = false;
  bullet = false;                 // 当物体需要在高速运动中进行碰撞,开启这个
  type = b2_staticBody;           // 默认是一个静态物体
  active = true;
  gravityScale = 1.0f;
}

  • 使用Fixture来描述形状,密度,摩擦,弹性等
  • 使用Body的CreateFixture设置新的形状,也可以设置多个形状
  • 使用Body的SetGravityScale设置刚体的重力缩放,某些物体可以不受重力影响
  • 物体的摩擦系数是0~1的数,0表示光滑,1表述粗糙
  • 物体的弹性系数(恢复系数)也是0~1之间的书,0表示没有弹性,1表示没有能量损失的反弹
// 创建形状
b2CircleShape circle;       // 圆形
circle.m_radius = 1.0f;     // 半径为1

b2EdgeSHape edge;
// 创建一条平行于x轴的边
edge.Set(b2Vec2(-100.0f, 0.0f), b2Vec2(100.0f, 0.0f)); 

b2PolygonShape polygon;     // 创建一个封闭的多边形
polygon.SeAsBox(5.0f, 5.0f);// 创建一个长和宽都是10的正方形

b2ChainShape shape;         // 链形
b2Vec2* arr = new b2Vec2[5];
arr[0] = b2Vec2(0.0f, 0.0f);
arr[1] = b2Vec2(10.0f, 10.0f);
arr[2] = b2Vec2(20.0f, 0.0f);
arr[3] = b2Vec2(30.0f, 0.0f);
arr[4] = b2Vec2(40.0f, 0.0f);
shape.CreateChain(arr, 5);  // 数组描述了一个'W'形状
deletep[] arr;

在封闭多边形中,可以想Chain一样,使用Set()函数传入一个顶点数组来创建形状
上述的edge通常用于创建

  • 关节

enum b2JointType{
  e_unknowJoint,        
  e_revoluteJoint,      // 旋转关节
  e_prismaticJoint,     // 平移关节
  e_distanceJoint,      // 距离关节
  e_pulleyJoint,        // 轮滑关节
  e_mouseJoint,         // 鼠标关节
  e_gearJoint,          // 齿轮关节
  e_whellJoint,         // 滚齿关节
  e_weldJoint,          // 焊接关节
  e_frictionJoint,      // 摩擦关节
  e_ropeJoint           // 绳索关节
}

// 使用关节

struct b2JointDef{
  b2JointDef(){
    type = e_unknowJoint;
    userData = NULL;
    bodyA = NULL;
    bodyB = NULL;
    collideConnected = false;
  }
  // 关节的类型
  b2JointType type;
  // 特殊数据
  void* userDta;
  // 第一个刚体
  b2Body* bodyA;
  // 第二个刚体
  b2Body* bodyB;
  // 两个刚体是否会发生碰撞
  bool collideConnected;
};

拖尾

  • 在相应距离内动态生成一段段的条带,然后一段段逐渐的消隐

拖尾

PS:因为是一段段条带相连形成拖尾,所以如果条带太粗(stroke太大),在视觉上可能会出现“脱节”的效果,就像上面的图一样。所以在实际使用中,stroke的大小设置应该合理。

/**

* 创建MotionStreak 的两种方式

**/

// fade : 拖尾渐隐时间(秒)

// minSeg : 最小的片段长度(渐隐片段的大小)。拖尾条带相连顶点间的最小距离。

// stroke : 渐隐条带的宽度。

// color : 片段颜色值。

// path : 纹理图片的文件名。

// texture : 纹理图片的对象指针。

static MotionStreak* create(float fade, float minSeg, float stroke, const Color3B& color, const std::string& path);

static MotionStreak* create(float fade, float minSeg, float stroke, const Color3B& color, Texture2D* texture);

// 使用举例

auto motionstreak = MotionStreak::create(1.0f, 1.0f, 10.0f, Color3B(255, 0, 0), "streak.png");

/* tintWithColor : 设置顶点颜色值。

* reset : 删除所有条带段,重置。

* setFastMode : 设置快速模式。

* setStartingPositionInitialized : 不需要了解,也不需要去使用。
  • 支持Action动作

    • MotionStreak继承自Node类。而既然它一旦移动(位置Position发生改变)就会拉出一条拖尾,那么执行MoveTo/MoveBy 或者 JumpTo/JumpBy 等等Action动作,自然也是可以形成拖尾效果的啦。
  • 使用步骤

    1. 创建MotionStreak。MotionStreak::create()。
    2. 将MotionStreak加入到场景中。this->addChild()。
    3. 设置位置MotionStreak->setPosition();或执行移动Action动作。
    4. 一旦改变了位置之后,就会形成一段拖尾效果了。

Draw

auto s = Director::getInstance()->getWinSize();

auto draw = DrawNode::create();
addChild(draw, 10);
  • 绘制poly
Vec2 vertices[] = { Vec2(0,0), Vec2(50,50), Vec2(100,50), Vec2(100,100), Vec2(50,100) };
draw->drawPoly( vertices, 5, false, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1));

// closed random color poly
Vec2 vertices2[] = { Vec2(30,130), Vec2(30,230), Vec2(50,200) };
draw->drawPoly( vertices2, 3, true, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1));

在这里插入图片描述

在drawPoly中,vertices为指定顶点坐标数组,第二个为使用数组中点的个数,第三个为是否连接首尾点,最后为颜色

  • 绘制实心圆
for( int i=0; i < 10; i++)
{
    draw->drawDot(Vec2(s.width/2, s.height/2), 10*(10-i), Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1));
}

在这里插入图片描述

在drawDot中,第一个参数为圆心坐标,第二个参数为半径,第三个参数为填充色

  • 绘制点
draw->drawPoint(Vec2(s.width / 2 - 120, s.height / 2 - 120), 10, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1));

draw->drawPoint(Vec2(s.width / 2 + 120, s.height / 2 + 120), 10, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1));

//draw 4 small points
Vec2 position[] = { Vec2(60,60), Vec2(70,70), Vec2(60,70), Vec2(70,60) };
draw->drawPoints(position, 4, 5, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1));

在这里插入图片描述

drawPoint绘制一个点,第一个参数点的坐标,第二个参数点的大小,第三个参数点的颜色
drawPoints绘制一组点,第一个参数包含点坐标的数组,第二个参数使用数组中点的个数,第三个参数点的大小,第四个参数点的颜色

  • 绘制直线和矩形边框
// draw a line
draw->drawLine(Vec2(0,0), Vec2(s.width, s.height), Color4F(1.0, 0.0, 0.0, 0.5));

// draw a rectangle
draw->drawRect(Vec2(203,203), Vec2(70,70), Color4F(1,1,0,1));

draw->drawRect(Vec2(150,300), Vec2(300,150), Vec2(150,0), Vec2(0,150), Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1));

在这里插入图片描述

使用drawLine绘制直线,第一个参数为直线起点坐标,第二个参数为直线终点坐标,第三个参数为颜色
使用drawRect绘制矩形“

  1. 指定两个对角顶点,确定矩形。第一个和第二个参数就是对角顶点坐标,第三个参数就是颜色
  2. 指定四个顶点的坐标,绘制矩形(四边形)。前四个参数就是顶点坐标,第五个参数就是颜色
  • 实心多边形描边
// Draw polygons
Vec2 points[] = { Vec2(s.height/4,0), Vec2(s.width,s.height/5), Vec2(s.width/3*2,s.height) };
draw->drawPolygon(points, sizeof(points)/sizeof(points[0]), Color4F(1,0,0,0.5), 4, Color4F(0,0,1,0.5));

在这里插入图片描述

第一个参数为顶点数组,第二个参数为数组中使用点的个数,第三个参数为填充色,第四个参数为描边宽度,第五个参数为描边颜色

  • 绘制四角星星
const float o=180;
const float w=20;
const float h=50;
Vec2 star[] = {
    Vec2(o,o), Vec2(o+w,o-h), Vec2(o+w*2, o),        // lower spike
    Vec2(o + w*2 + h, o+w ), Vec2(o + w*2, o+w*2),    // right spike
    Vec2(o +w, o+w*2+h), Vec2(o,o+w*2),               // top spike
    Vec2(o -h, o+w),                                     // left spike
};

draw->drawPolygon(star, sizeof(star)/sizeof(star[0]), Color4F(1,0,0,0.5), 1, Color4F(0,0,1,1));
  • 绘制实心多变形
//draw a solid polygon
Vec2 vertices3[] = {Vec2(60,160), Vec2(70,190), Vec2(100,190), Vec2(90,160)};
draw->drawSolidPoly( vertices3, 4, Color4F(1,1,0,1) );

//draw a solid rectangle
draw->drawSolidRect(Vec2(10,10), Vec2(20,20), Color4F(1,1,0,1));

在这里插入图片描述

  • 绘制胶囊
// Draw segment
draw->drawSegment(Vec2(20,s.height-50), Vec2(20,s.height/2), 10, Color4F(0, 1, 0, 1));

draw->drawSegment(Vec2(10,s.height/2), Vec2(s.width/2, s.height/2), 40, Color4F(1, 0, 1, 0.5));

在这里插入图片描述

drawSegment绘制胶囊,第一个参数起点,第二个参数终点,第三个参数胶囊两头半圆的半径,第四个参数填充色
注意:这里是在指定的起点和终点外绘制半圆,即你指定的起点终点分别为两个半圆的圆心

  • 绘制贝塞尔曲线
draw->drawQuadBezier(Vec2(s.width - 150, s.height - 150), Vec2(s.width - 70, s.height - 10), Vec2(s.width - 10, s.height - 10), 10, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 0.5));

draw->drawQuadBezier(Vec2(0, s.height), Vec2(s.width / 2, s.height / 2), Vec2(s.width, s.height), 50, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 0.5));

//draw->drawCubicBezier(VisibleRect::center(), Vec2(VisibleRect::center().x + 30, VisibleRect::center().y + 50), Vec2(VisibleRect::center().x + 60, VisibleRect::center().y - 50), VisibleRect::right(), 100, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 0.5));

draw->drawCubicBezier(Vec2(s.width - 250, 40), Vec2(s.width - 70, 100), Vec2(s.width - 30, 250), Vec2(s.width - 10, s.height - 50), 10, Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 0.5));

在这里插入图片描述

  • 圆点
drawNode->drawDot(Vec2(50, 50), 10, Color4F::RED);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值