cocos动作使用示例(2)
来源:互联网 发布:java 培训 被辞退 编辑:程序博客网 时间:2024/06/03 16:42
动作应用2
创建一个随机飘动的精灵,并且精灵随着飘动方向旋转。(CallFuncN+Bezier+递归+定时器)
Vec2 _prevPos; //为了便于旋转计算
Sprite* _sprite;
DrawNode* _drawNode;
bool init()
{ Layer::init();
auto winSize = Director::getInstance()->getWinSize();
/* 1.创建精灵 */
Sprite* sprite = Sprite::create("Images/blocks.png");
_sprite = sprite; addChild(sprite);
sprite->setPosition(winSize.width / 2,winSize.height / 2);
_prevPos = sprite->getPosition();
_drawNode = DrawNode::create(); addChild(_drawNode);
// 2. 随机运动精灵
runRandom(sprite);
// 6. 增加旋转控制
scheduleUpdate();
return true;
}
void runRandom(Node*sprite)
{
auto winSize = Director::getInstance()->getWinSize();
// 3. 随机bezier曲线实现随机运动
ccBezierConfig cfg;
cfg.controlPoint_1 = Vec2(CCRANDOM_0_1()*winSize.width,CCRANDOM_0_1()*winSize.height);
cfg.controlPoint_2 = Vec2(CCRANDOM_0_1()*winSize.width,CCRANDOM_0_1()*winSize.height);
cfg.endPosition = Vec2(CCRANDOM_0_1()*winSize.width,CCRANDOM_0_1()*winSize.height);
// 4. 不能RepeatForever,使用sequence,当随机运动完毕之后,再调用自己实现新的随机曲线运动,形成递归
BezierTo* b = BezierTo::create(cfg.endPosition.getDistance(sprite->getPosition())/ 60, cfg);
CallFuncN* call = CallFuncN::create(CC_CALLBACK_1(T020403ActionP2::runRandom,this));
sprite->runAction(Sequence::createWithTwoActions(b,call));//用CallFuncN递归调用这个函数实现无线贝塞尔飘动,参数还是这个节点精灵
// 5. 绘制debug
// 到此,我们能看到精灵随机运动,但是精灵没有旋转
if (_drawNode)_drawNode->removeFromParent();
_drawNode = DrawNode::create();
addChild(_drawNode);
_drawNode->drawCubicBezier(sprite->getPosition(),
cfg.controlPoint_1,
cfg.controlPoint_2,
cfg.endPosition, 100, Color4F::RED);
}
//7. 计算当前位置和原来位置的角度,调用setRotation去旋转精灵
// 旋转完毕之后,当前位置赋值给原来位置,准备下一帧的计算
void update(float)
{
Vec2 pos =_sprite->getPosition();
/* 计算角度,并且旋转 */
float angle = (pos -_prevPos).getAngle();//位置偏角的结果是弧度,但90减去这个结果才是旋转弧度
_sprite->setRotation(90-CC_RADIANS_TO_DEGREES(angle)); //将弧度转换成角度的函数,
_prevPos = pos;
}
总结:
1. 和旋转有关的东西都会用到求位置差,然后用这个结果求getAngel()函数
2. CC_RADIANS_TO_DEGREES函数完成弧度角度转换
3. CallFuncN的用法,其参数Node*很灵活
4. DrawNode::drawCubicBezier()绘制高阶贝塞尔的方法
5. 递归的应用
- cocos动作使用示例(2)
- cocos动作使用示例(1)
- cocos动作使用示例(3)
- Cocos动作(2)
- cocos-2d动作
- Cocos动作(1)
- Cocos动作(3)
- cocos 2d-x 动作
- cocos的TargetedAction动作类的使用
- cocos 学习笔记(三)动作
- Cocos-2dx-Lua中使用Luaj的完整示例
- Cocos Creator 中使用动作系统(摘自官方文档)
- Cocos Creator中使用动作系统(官方文档摘录)
- Cocos Creator中使用动作列表(官方文档摘录)
- cocos-js 动作
- Cocos Creator 动作列表
- cocos 常用动作函数
- Cocos Creator 动作列表
- [iOS]天气查询
- inline和宏的优点和缺点
- GenyMotion离线下载
- 正则表达式 课堂笔记
- Java开发者必备十大学习网站
- cocos动作使用示例(2)
- linux lcd设备驱动剖析四
- 在table上面得加一个提示层,可加任何HTML
- hdu 1978 How many ways (记忆化搜索)
- git am PATCH 失败的处理方法
- cocos动作使用示例(3)
- 实现前端md5加密与记住用户名密码功能
- 代理模式
- leetcode 每日一题 236. Lowest Common Ancestor of a Binary Tree