① 如何基于cocos2dx3.x实现A星寻路算法
在学习本篇教程之前,如果你有cocos2d-x的开发经验,将会有所帮助。如果没有也没关系,因为你可以将这里讲解的例子迁移到其他的语言或者框架中。找到到达你键盘的最短路径,开始吧!Maze猫首先介绍下我们将要在本篇教程中开发的简单游戏。前往下载本篇教程的工程代码。编译运行工程,你将看到以下画面。在这款游戏中,你扮演着一只小偷猫,在一个由危险的狗守护着的地牢里小心穿行。如果你试图穿过一只狗,他会把你吃掉–除非你可以用骨头去贿赂它!所以在这款游戏中,你的任务是尝试以正确的顺序捡起骨头,然后寻找路线穿过狗逃离。注意到猫只能水平或者垂直的移动(例如不能斜线移动),并且会从一个方块的中心点移动到另一个中心点。每个方块既可以是可通行的也可以是不可通行的。尝试下这款游戏,看看你能否找到出路!建议你阅读代码以熟悉它的原理。这是一款相当普通的方块-地图式游戏,我们会在接下来的教程中修改它并使用上A星寻路算法。Maze猫和A星概览正如你所看到的,当你点击地图某处时,猫会沿着你点击的方向跳到相邻的方块上。我们想对程序做修改,让猫持续的往你点击的方块方向前进,就像许多RPGs或者point-and-click冒险类游戏。让我们看下控制触摸事件代码的工作原理。如果你打开HelloWorldScene.cpp文件,你将看到像下面这样去实现触摸操作:autolistener=EventListenerTouchOneByOne::create();listener->setSwallowTouches(true);listener->onTouchBegan=[this](Touch*touch,Event*event){if(_gameOver){returnfalse;}PointtouchLocation=_tileMap->convertTouchToNodeSpace(touch);_cat->moveToward(touchLocation);returntrue;};_eventDispatcher->(listener,this);你可以看到这里只是对猫精灵调用了一个方法,让猫在方块地图上往你点击的地方移动。我们现在要做的是修改在CatSprite.m文件中的以下方法,寻找到达该点的最短路径,并且开始前进:voidCatSprite::moveToward(constPoint&target){}创建ShortestPathStep类我们开始创建一个内部类,代表路径上的一步操作。在这种情况下,它是一个方块和由A星算法计算出来的的F,G和Hscores。classShortestPathStep:publiccocos2d::Object{public:ShortestPathStep();~ShortestPathStep();staticShortestPathStep*createWithPosition(constcocos2d::Point&pos);boolinitWithPosition(constcocos2d::Point&pos);intgetFScore()const;boolisEqual(constShortestPathStep*other)const;std::stringgetDescription()const;CC_SYNTHESIZE(cocos2d::Point,_position,Position);CC_SYNTHESIZE(int,_gScore,GScore);CC_SYNTHESIZE(int,_hScore,HScore);CC_SYNTHESIZE(ShortestPathStep*,_parent,Parent);};现在添加以下代码到CatSprite.cpp文件的顶部。CatSprite::ShortestPathStep::ShortestPathStep():_position(Point::ZERO),_gScore(0),_hScore(0),_parent(nullptr){}CatSprite::ShortestPathStep::~ShortestPathStep(){}CatSprite::ShortestPathStep*CatSprite::ShortestPathStep::createWithPosition(constPoint&pos){ShortestPathStep*pRet=newShortestPathStep();if(pRet&&pRet->initWithPosition(pos)){pRet->autorelease();returnpRet;}else{CC_SAFE_DELETE(pRet);returnnullptr;}}boolCatSprite::ShortestPathStep::initWithPosition(constPoint&pos){boolbRet=false;do{this->setPosition(pos);bRet=true;}while(0);returnbRet;}intCatSprite::ShortestPathStep::getFScore()const{returnthis->getGScore()+this->getHScore();}boolCatSprite::ShortestPathStep::isEqual(constCatSprite::ShortestPathStep*other)const{returnthis->getPosition()==other->getPosition();}std::stringCatSprite::ShortestPathStep::getDescription()const{returnStringUtils::format("pos=[%.0f;%.0f]g=%dh=%df=%d",this->getPosition().x,this->getPosition().y,this->getGScore(),this->getHScore(),this->getFScore());}正如所见,这是一个很简单的类,记录了以下内容:-方块的坐标-G值(记住,这是开始点到当前点的方块数量)-H值(记住,这是当前点到目标点的方块估算数量)-Parent是它的上一步操作-F值,这是方块的和值(它是G+H的值)这里定义了getDescription方法,以方便调试。创建了isEquals方法,当且仅当两个ShortestPathSteps的方块坐标相同时,它们相等(例如它们代表着相同的方块)。创建Open和Closed列表打开CatSprite.h文件,添加如下代码:cocos2d::Vector_spOpenSteps;cocos2d::Vector_spClosedSteps;检查开始和结束点重新实现moveToward方法,获取当前方块坐标和目标方块坐标,然后检查是否需要计算一条路径,最后测试目标方块坐标是否可行走的(在这里只有墙壁是不可行走的)。打开CatSprite.cpp文件,修改moveToward方法,为如下:voidCatSprite::moveToward(constPoint&target){PointfromTileCoord=_layer->tileCoordForPosition(this->getPosition());PointtoTileCoord=_layer->tileCoordForPosition(target);if(fromTileCoord==toTileCoord){CCLOG("You'realreadythere!:P");return;}if(!_layer->isValidTileCoord(toTileCoord)||_layer->isWallAtTileCoord(toTileCoord)){SimpleAudioEngine::getInstance()->playEffect("hitWall.wav");return;}CCLOG("From:%f,%f",fromTileCoord.x,fromTileCoord.y);CCLOG("To:%f,%f",toTileCoord.x,toTileCoord.y);}编译运行,在地图上进行点击,如果不是点击到墙壁的话,可以在控制台看到如下信息:From:24.000000,0.000000To:20.000000,0.000000其中**From**就是猫的方块坐标,**To**就是所点击的方块坐标。实现A星算法根据算法,第一步是添加当前坐标到open列表。还需要三个辅助方法:-一个方法用来插入一个ShortestPathStep对象到适当的位置(有序的F值)-一个方法用来计算从一个方块到相邻方块的移动数值-一个方法是根据"曼哈顿距离"算法,计算方块的H值打开CatSprite.cpp文件,添加如下方法:voidCatSprite::insertInOpenSteps(CatSprite::ShortestPathStep*step){intstepFScore=step->getFScore();ssize_tcount=_spOpenSteps.size();ssize_ti=0;for(;igetFScore()){break;}}_spOpenSteps.insert(i,step);}intCatSprite::computeHScoreFromCoordToCoord(constPoint&fromCoord,constPoint&toCoord){//忽略了可能在路上的各种障碍returnabs(toCoord.x-fromCoord.x)+abs(toCoord.y-fromCoord.y);}intCatSprite::(constShortestPathStep*fromStep,constShortestPathStep*toStep){//因为不能斜着走,而且由于地形就是可行走和不可行走的成本都是一样的//如果能够对角移动,或者有沼泽、山丘等等,那么它必须是不同的return1;}接下来,需要一个方法去获取给定方块的所有相邻可行走方块。因为在这个游戏中,HelloWorld管理着地图,所以在那里添加方法。打开HelloWorldScene.cpp文件,添加如下方法:PointArray*HelloWorld::(constPoint&tileCoord)const{PointArray*tmp=PointArray::create(4);//上Pointp(tileCoord.x,tileCoord.y-1);if(this->isValidTileCoord(p)&&!this->isWallAtTileCoord(p)){tmp->addControlPoint(p);}//左p.setPoint(tileCoord.x-1,tileCoord.y);if(this->isValidTileCoord(p)&&!this->isWallAtTileCoord(p)){tmp->addControlPoint(p);}//下p.setPoint(tileCoord.x,tileCoord.y+1);if(this->isValidTileCoord(p)&&!this->isWallAtTileCoord(p)){tmp->addControlPoint(p);}//右p.setPoint(tileCoord.x+1,tileCoord.y);if(this->isValidTileCoord(p)&&!this->isWallAtTileCoord(p)){tmp->addControlPoint(p);}returntmp;}可以继续CatSprite.cpp中的moveToward方法了,在moveToward方法的后面,添加如下代码:boolpathFound=false;_spOpenSteps.clear();_spClosedSteps.clear();//首先,添加猫的方块坐标到open列表this->insertInOpenSteps(ShortestPathStep::createWithPosition(fromTileCoord));do{//得到最小的F值步骤//因为是有序列表,第一个步骤总是最小的F值ShortestPathStep*currentStep=_spOpenSteps.at(0);//添加当前步骤到closed列表_spClosedSteps.pushBack(currentStep);//将它从open列表里面移除//需要注意的是,如果想要先从open列表里面移除,应小心对象的内存_spOpenSteps.erase(0);//如果当前步骤是目标方块坐标,那么就完成了if(currentStep->getPosition()==toTileCoord){pathFound=true;ShortestPathStep*tmpStep=currentStep;CCLOG("PATHFOUND:");do{CCLOG("%s",tmpStep->getDescription().c_str());tmpStep=tmpStep->getParent();//倒退}while(tmpStep);//直到没有上一步_spOpenSteps.clear();_spClosedSteps.clear();break;}//得到当前步骤的相邻方块坐标PointArray*adjSteps=_layer->(currentStep->getPosition());for(ssize_ti=0;icount();++i){ShortestPathStep*step=ShortestPathStep::createWithPosition(adjSteps->getControlPointAtIndex(i));//检查步骤是不是已经在closed列表if(this->getStepIndex(_spClosedSteps,step)!=-1){continue;}//计算从当前步骤到此步骤的成本intmoveCost=this->(currentStep,step);//检查此步骤是否已经在open列表ssize_tindex=this->getStepIndex(_spOpenSteps,step);//不在open列表,添加它if(index==-1){//设置当前步骤作为上一步操作step->setParent(currentStep);//G值等同于上一步的G值+从上一步到这里的成本step->setGScore(currentStep->getGScore()+moveCost);//H值即是从此步骤到目标方块坐标的移动量估算值step->setHScore(this->computeHScoreFromCoordToCoord(step->getPosition(),toTileCoord));//按序添加到open列表this->insertInOpenSteps(step);}else{//获取旧的步骤,其值已经计算过step=_spOpenSteps.at(index);//检查G值是否低于当前步骤到此步骤的值if((currentStep->getGScore()+moveCost)getGScore()){//G值等同于上一步的G值+从上一步到这里的成本step->setGScore(currentStep->getGScore()+moveCost);//因为G值改变了,F值也会跟着改变//所以为了保持open列表有序,需要将此步骤移除,再重新按序插入//在移除之前,需要先保持引用step->retain();//现在可以放心移除,不用担心被释放_spOpenSteps.erase(index);//重新按序插入this->insertInOpenSteps(step);//现在可以释放它了,因为open列表应该持有它step->release();}}}}while(_spOpenSteps.size()>0);if(!pathFound){SimpleAudioEngine::getInstance()->playEffect("hitWall.wav");}添加以下方法:ssize_tCatSprite::getStepIndex(constcocos2d::Vector&steps,constCatSprite::ShortestPathStep*step){for(ssize_ti=0;iisEqual(step)){returni;}}return-1;}编译运行,在地图上进行点击,如下图所示:From:24.000000,0.000000To:23.000000,3.000000PATHFOUND:pos=[23;3]g=10h=0f=10pos=[22;3]g=9h=1f=10pos=[21;3]g=8h=2f=10pos=[20;3]g=7h=3f=10pos=[20;2]g=6h=4f=10pos=[20;1]g=5h=5f=10pos=[21;1]g=4h=4f=8pos=[22;1]g=3h=3f=6pos=[23;1]g=2h=2f=4pos=[24;1]g=1h=3f=4pos=[24;0]g=0h=0f=0注意该路径是从后面建立的,所以必须从下往上看猫选择了哪条路径。跟随路径前进现在已经找到了路径,只需让猫跟随前进即可。需要创建一个数组去存储路径,打开CatSprite.h文件,添加如下代码:cocos2d::Vector_shortestPath;打开CatSprite.cpp文件,更改moveToward方法,注释掉语句**boolpathFound=false**;,如下://boolpathFound=false;替换语句**pathFound=true;**为如下://pathFound=true;this->(currentStep);并且注释掉下方的调试语句://ShortestPathStep*tmpStep=currentStep;//CCLOG("PATHFOUND:");//do//{//CCLOG("%s",tmpStep->getDescription().c_str());//tmpStep=tmpStep->getParent();//倒退/
② 老师说cocos2dx过两年就会被淘汰,unity3D才是正道,各位怎么看
引擎这些工具,我们是永远跟不上别人的脚步的。
你现在需要学习的是什么?
1、精通一门语言(从语法,到多线程,到数据操作,到网络等等方面)。
2、掌握数据结构与算法。
3、熟悉设计模式。
4、多看他人的游戏源码,学习下来。
学习一些以一变应万变的,会让你在以后面对所以问题不会感到无力。
以后你也不会问选择哪个引擎的问题。
COCO,unity等等是标,不是本,是加分项而不是基础分。
我见过不少没有语言基础的直接上手学习UNITY的,恩,是学过一段时间,但是,当我看见问他们“事件”,“委托”,“四元素”,"线程池"“计数器”等等名词时的表情,我知道没有基础给他们带来的苦果。这样的程序员,也只是从一个地方换到另一个地方的码农。
当你自信满满的以为学好了UNITY就能找到工作时候,人家笔试提上一堆的数据结构与算法,指针,设计模式,网络,数据库,少年,你怎么办?
切记,把UNITY,COCO当做工具,把任何语言当做工具。
unity,COCO只是加分项,如果你基础分没修满,这个时候是考虑多修基础分的时候,而不是考虑多修加分项的时候。-FOR A GAME PROGRAMMER
③ 如何在使用Cocos2D中实现A星(A*)寻路算法
实现A星算法
根据算法,第一步是添加当前坐标到open列表。还需要三个辅助方法:
- 一个方法用来插入一个ShortestPathStep对象到适当的位置(有序的F值)
- 一个方法用来计算从一个方块到相邻方块的移动数值
- 一个方法是根据"曼哈顿距离"算法,计算方块的H值。
ssize_t CatSprite::getStepIndex(const cocos2d::Vector<CatSprite::ShortestPathStep *> &steps, const CatSprite::ShortestPathStep *step)
{
for (ssize_t i = 0; i < steps.size(); ++i)
{
if (steps.at(i)->isEqual(step))
{
return i;
}
}
return -1;
}
④ 如何基于Cocos2d-x v3.x实现A星寻路算法
实现A星算法
根据算法,第一步是添加当前坐标到open列表。还需要三个辅助方法:
- 一个方法用来插入一个ShortestPathStep对象到适当的位置(有序的F值)
- 一个方法用来计算从一个方块到相邻方块的移动数值
- 一个方法是根据"曼哈顿距离"算法,计算方块的H值
打开CatSprite.cpp文件,添加如下方法:
void CatSprite::insertInOpenSteps(CatSprite::ShortestPathStep *step)
{
int stepFScore = step->getFScore();
ssize_t count = _spOpenSteps.size();
ssize_t i = 0;
for (; i < count; ++i)
{
if (stepFScore <= _spOpenSteps.at(i)->getFScore())
{
break;
}
}
_spOpenSteps.insert(i, step);
}
int CatSprite::computeHScoreFromCoordToCoord(const Point &fromCoord, const Point &toCoord)
{
// 这里使用曼哈顿方法,计算从当前步骤到达目标步骤,在水平和垂直方向总的步数
// 忽略了可能在路上的各种障碍
return abs(toCoord.x - fromCoord.x) + abs(toCoord.y - fromCoord.y);
}
int CatSprite::(const ShortestPathStep *fromStep, const ShortestPathStep *toStep)
{
// 因为不能斜着走,而且由于地形就是可行走和不可行走的成本都是一样的
// 如果能够对角移动,或者有沼泽、山丘等等,那么它必须是不同的
return 1;
}
接下来,需要一个方法去获取给定方块的所有相邻可行走方块。因为在这个游戏中,HelloWorld管理着地图,所以在那里添加方法。打开HelloWorldScene.cpp文件,添加如下方法:
PointArray *HelloWorld::(const Point &tileCoord) const
{
PointArray *tmp = PointArray::create(4);
// 上
Point p(tileCoord.x, tileCoord.y - 1);
if (this->isValidTileCoord(p) && !this->isWallAtTileCoord(p))
{
tmp->addControlPoint(p);
}
// 左
p.setPoint(tileCoord.x - 1, tileCoord.y);
if (this->isValidTileCoord(p) && !this->isWallAtTileCoord(p))
{
tmp->addControlPoint(p);
}
// 下
p.setPoint(tileCoord.x, tileCoord.y + 1);
if (this->isValidTileCoord(p) && !this->isWallAtTileCoord(p))
{
tmp->addControlPoint(p);
}
// 右
p.setPoint(tileCoord.x + 1, tileCoord.y);
if (this->isValidTileCoord(p) && !this->isWallAtTileCoord(p))
{
tmp->addControlPoint(p);
}
return tmp;
}
可以继续CatSprite.cpp中的moveToward方法了,在moveToward方法的后面,添加如下代码:
bool pathFound = false;
_spOpenSteps.clear();
_spClosedSteps.clear();
// 首先,添加猫的方块坐标到open列表
this->insertInOpenSteps(ShortestPathStep::createWithPosition(fromTileCoord));
do
{
// 得到最小的F值步骤
// 因为是有序列表,第一个步骤总是最小的F值
ShortestPathStep *currentStep = _spOpenSteps.at(0);
// 添加当前步骤到closed列表
_spClosedSteps.pushBack(currentStep);
// 将它从open列表里面移除
// 需要注意的是,如果想要先从open列表里面移除,应小心对象的内存
_spOpenSteps.erase(0);
// 如果当前步骤是目标方块坐标,那么就完成了
if (currentStep->getPosition() == toTileCoord)
{
pathFound = true;
ShortestPathStep *tmpStep = currentStep;
CCLOG("PATH FOUND :");
do
{
CCLOG("%s", tmpStep->getDescription().c_str());
tmpStep = tmpStep->getParent(); // 倒退
} while (tmpStep); // 直到没有上一步
_spOpenSteps.clear();
_spClosedSteps.clear();
break;
}
// 得到当前步骤的相邻方块坐标
PointArray *adjSteps = _layer->(currentStep->getPosition());
for (ssize_t i = 0; i < adjSteps->count(); ++i)
{
ShortestPathStep *step = ShortestPathStep::createWithPosition(adjSteps->getControlPointAtIndex(i));
// 检查步骤是不是已经在closed列表
if (this->getStepIndex(_spClosedSteps, step) != -1)
{
continue;
}
// 计算从当前步骤到此步骤的成本
int moveCost = this->(currentStep, step);
// 检查此步骤是否已经在open列表
ssize_t index = this->getStepIndex(_spOpenSteps, step);
// 不在open列表,添加它
if (index == -1)
{
// 设置当前步骤作为上一步操作
step->setParent(currentStep);
// G值等同于上一步的G值 + 从上一步到这里的成本
step->setGScore(currentStep->getGScore() + moveCost);
// H值即是从此步骤到目标方块坐标的移动量估算值
step->setHScore(this->computeHScoreFromCoordToCoord(step->getPosition(), toTileCoord));
// 按序添加到open列表
this->insertInOpenSteps(step);
}
else
{
// 获取旧的步骤,其值已经计算过
step = _spOpenSteps.at(index);
// 检查G值是否低于当前步骤到此步骤的值
if ((currentStep->getGScore() + moveCost) < step->getGScore())
{
// G值等同于上一步的G值 + 从上一步到这里的成本
step->setGScore(currentStep->getGScore() + moveCost);
// 因为G值改变了,F值也会跟着改变
// 所以为了保持open列表有序,需要将此步骤移除,再重新按序插入
// 在移除之前,需要先保持引用
step->retain();
// 现在可以放心移除,不用担心被释放
_spOpenSteps.erase(index);
// 重新按序插入
this->insertInOpenSteps(step);
// 现在可以释放它了,因为open列表应该持有它
step->release();
}
}
}
} while (_spOpenSteps.size() > 0);
if (!pathFound)
{
SimpleAudioEngine::getInstance()->playEffect("hitWall.wav");
}
添加以下方法:
ssize_t CatSprite::getStepIndex(const cocos2d::Vector<CatSprite::ShortestPathStep *> &steps, const CatSprite::ShortestPathStep *step)
{
for (ssize_t i = 0; i < steps.size(); ++i)
{
if (steps.at(i)->isEqual(step))
{
return i;
}
}
return -1;
}
⑤ cocos2dx 什么是a星算法
您好,我来为您解答:
A*搜寻算法俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中的NPC的移动计算,或线上游戏的BOT的移动计算上。
如果我的回答没能帮助您,请继续追问。
⑥ cocos2dx函数
场景切换是通过导演类Director实现的,其中的相关函数如下:
runWithScene(Scene* scene)。该函数可以运行场景。只能在启动第一个场景时候调用该函数。如果已经有一个场景运行情况下则不能调用该函数。
replaceScene(Scene* scene)。切换到下一个场景。用一个新的场景替换当前场景,当前场景被终端释放。
pushScene(Scene* scene)。切换到下一个场景。将当前场景挂起放入到场景堆栈中,然后再切换到下一个场景中。
void popScene()。与pushScene配合使用,可以回到上一个场景。
void popToRootScene()。与pushScene配合使用,可以回到根场景。
我们需要注意replaceScene和pushScene使用的区别。replaceScene会释放和销毁场景,如果需要保持原来场景的状态,replaceScene函数不适合。pushScene并不会释放和销毁场景,原来场景的状态可以保持,但是场景不能放太多的场景对象。
使用replaceScene代码如下:
auto sc = Setting::createScene();
Director::getInstance()->replaceScene(sc);
其中的Setting是下一个要切换的场景。使用pushScene代码如下:
auto sc = Setting::createScene();
Director::getInstance()->pushScene(sc);
从Setting场景回到上一个场景使用代码如下:
Director::getInstance()->popScene();
下面我们通过一个实例场景切换相关函数,如下图所示有两个场景:HelloWorld和Setting(设置)。在HelloWorld场景点击“游戏设置”菜单可以切换到Setting场景,在Setting场景中点击“OK”菜单可以返回到HelloWorld场景。
⑦ 做游戏开发需要学什么
如果是打算学习2D手游开发,那么首先需要学习C++,然后,还要了解Cocos2dx的使用。3D游戏用的比较多的开发工具是unity3d引擎。unity3d开发用的是C#(javascript也用,但用的比较少),所以先要学会C#。
游戏开发主要分为2D游戏和3D游戏,2D游戏通常是为手机开发的,一般使用的开发工具是Cocos2dx,使用的开发语言是C++。
3D游戏一般使用的游戏开发工具是Unity3d,使用的开发语言是c#或者javascript。所以,想要开发哪种游戏,就必须知道需要用到哪些开发知识。
游戏制作一般主要分为两大块,即程序开发、美术设计。程序开发主要包括服务器端开发、客户端开发。而美术设计包括场景、角色、次时代、特效、动画等部分,要完成一个优秀的游戏作品,每一部分都需有专业人才负责。
对于大型的游戏,一般需要几十个人的团队制作几年,而小游戏则可能只需一个人制作几天。
一般的大型游戏制作都会由游戏开发公司来完成,小型的游戏则有可能由业余团队或者个人完成,如RPG制作大师此类软件就可以让不懂技术的人做出电脑游戏。
⑧ cocos2dx 怎么使用openssl的rsa算法
为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。
1.对称加密算法
OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。事实上,DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥3DES算法。
2.非对称加密算法
OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。
⑨ cocos2dx 怎么加密xml
把整个文件按字节读取加密,也可以直接读取字符加密。使用的过程与加密过程相反就ok了。
当然你也可以对xml中的数据加密,不加密中间的标签。
加密的算法也有很多,比如AES,MD5,DES,3DES.............
⑩ cocos2dx中sclaeto和sclaeby的区别
cocos2dx是VB中的余弦函数,属于VB内置的函数,sclaeto与sclaeby的区别在于:sclaeto表示余弦函数图像中的波峰,sclaeby表示余弦函数图像中的波谷。
余弦(余弦函数),三角函数的一种。在Rt△ABC(直角三角形)中,∠C=90°(如图所示),∠A的余弦是它的邻边比三角形的斜边,即cosA=b/c,也可写为cosa=AC/AB。余弦函数:f(x)=cosx(x∈R)。当∠A为90°时,其临边的长度为零,所以cosπ/2=0.
角A的邻边比斜边 叫做∠A的余弦,记作cosA(由余弦英文cosine简写得来),即cosA=角A的邻边/斜边(直角三角形)。记作cos=x/r。
余弦函数的定义域是整个实数集,值域是[-1,1]。它是周期函数,其最小正周期为2π,图像呈波浪形,在自变量为2kπ(k为整数)时,该函数有极大值1;在自变量为(2k+1)π时,该函数有极小值-1。余弦函数是偶函数,其图像关于y轴对称。
三角形任何一边的平方等于其他两边平方的和减去这两边与它们夹角的余弦的积的两倍。
对于任意三角形,任何一边的平方等于其他两边平方的和减去这两边与它们夹角的余弦的两倍积。
在交流电场中,正弦波表示发电机转子线圈从与磁感线平行处启动,余弦波表示发电机转子线圈从与磁感线垂直处启动。