忙活了好几天,终于把鱼弄到基本满足了要求,觉得吧,初学者,应该具备分层思想,把要显示的层setVisible 设置为true 反正亦反,最近,主要用到了贝塞尔曲线,旋转等,参考了不少网上的教程,自己也吧唧吧唧下吧。
1、贝塞尔曲线是由三个点控制(一共四个,包括精灵的起点位置) ,两个控制点和一个结束点
ccBezierConfig tr0;
//随机数,控制贝塞尔曲线是随机的
tr0.controlPoint_1=Vec2((rand()%1000)*pow(-1,rand()%2+1),(rand()%1000)*pow(-1,rand()%2+1));
tr0.controlPoint_2=Vec2((rand()%1000)*pow(-1,rand()%2+1), (rand()%1000)*pow(-1,rand()%2+1));
tr0.endPosition=Vec2(-30,rand()%720);
CCBezierTo::create() //相对于起点的绝对位置
CCBezierBy::create()//相对于起点的相对位置
2、旋转
a)Cocos 顺时针方向为正方向 !!!
b)得到两个点 Vec2 oldPos Vec2 newPos Vec2 pVectr = newPos-oldPos;
c)float angleRadians=atan2f(pVectr.y,pVectr.x);//得到幅度角
d)float angleDegrees = CC_RADIANS_TO_DEGREES(angleRadians);//得到真正的旋转角度 //得到角度 弧度除以pi乘以180
e)ishSprites.at(i)->setRotation(-angleDegrees);//为什么为负数呢?呵呵
3、镜像
a)fish->setFlippedY(true); //相对Y轴的镜像
4、使用.plist 文件
cocos2d::SpriteFrameCache*frameCache = SpriteFrameCache::getInstance();
frameCache->addSpriteFramesWithFile("fish_1.plist","fish_1.png");
5、创建帧动画
a)AnimationCache *animCache = AnimationCache::getInstance(); //得到一个存储动画缓冲区
auto animation = Animation::create(); //创建一个动画,注意名词
for( int i=0;i<getPcitureCount();i++) //要创建动画(.n)图片的数量
{
//自动获取 .plist 中的图片 ,并加入动画中
char szName[100] = {0};
sprintf(szName, "%s%d.png",getPictureName().c_str(),i);
animation->addSpriteFrame(frameCache->getSpriteFrameByName(szName));
}
//设置这个动画(.n)的一些属性
animation->setDelayPerUnit(1);
animation->setRestoreOriginalFrame(true);
animation->setLoops(40);
//给动画(.n)取个名字然后加入动画缓冲区中
char tname[30]={0};
sprintf(tname,"%s_%d",getCreateFishName().c_str(),i);
//增加动画(.n)
CCAnimationCache::getInstance()->addAnimation(animation,tname);
//使用创建的动画(.n)
AnimationCache *animCache = AnimationCache::getInstance(); //获得对象
Animation *animation = animCache->getAnimation(tName);//根据刚刚的名字,获得动画(.n)
Animate *animate = Animate::create(animation);//根据动画(.n)创建动画(.v)
animate->setDuration(getDurationTime());//鱼的摆动速度
Sequence *seq = Sequence::create(DelayTime::create(i/2.0),CCBezierTo::create(getBeizerTime(), tr0),NULL);//先后执行 先延时(因为我有好多条鱼,延时起到先后出场的效果) ,后走贝塞尔曲线 注意最后为NULLfish->runAction(CCEaseSineOut::create(Spawn::create(animate,seq,NULL)));//fish是我创建的精灵,这个时候把这些动作赋予这个精灵,这个精灵就可以走贝塞尔曲线辣
6、使用schedule 多种方式,自己只使用了两种
a) 在init()函数中直接调用scheduleUpdate(),然后直接重写update()方法,这样在每帧都会调用update函数了
b) 在init()函数中直接调用schedule(schedule_selector(HelloWorld::myupdate),0.05f); myupdate 是自定义函数,后面是刷新时间,哈有其他参数,自行看源码
7、获取时间轴动画
a) auto mainScene = CSLoader::createTimeline ("MainScene.csb"); //注意要加入命名空间using namespace cocostudio::timeline;
8、获取根节点 auto rootNode = CSLoader::createNode("MainScene.csb");
9、获取子节点 Layer* FirstLayer1 =(Layer *)rootNode->getChildByName("FirstLayer");
10、设置Z轴,可以改变遮挡效果 FirstLayer2->setLocalZOrder(3); //数字越大越在最上层
11、接下来写棋牌游戏,有经验的谁,可以交流下吗?