cocos2dx之抽奖界面与获奖概率的设计(一)(2)
来源:未知 责任编辑:责任编辑 发表时间:2015-09-16 20:03 点击:次
再来看看咱们转盘中的粒子效果,有两种,第一种圆环的星星闪烁效果比较简单,设置下离中心的距离就好了,这里主要讲解以椭圆轨迹旋转的小彗星粒子效果。
既然以椭圆为轨迹,其实也就是实时更新下粒子的位置,但是椭圆的坐标怎么计算呢?想必部分人都忘记了吧(我也忘记了。。。),直接去问度娘吧:
咱们椭圆的中心即是转盘的中心,所以是一个标准的椭圆方程:
,对应的参数方程就是:
那么答案就出来啦,只要我们实时改变参数φ的值,那么椭圆上的坐标就会实时更新。知道原理了,我们再来看看怎么设计这样一个椭圆类。既然沿椭圆轨迹运动,那么为什么不把这一种动作设计成跟cocos2dx引擎中的动作Action一样呢?在使用的时候,我们只需要调用runAction就可以了。我们可以参考cocos2dx引擎动作类的设计。
来看头文件:
#ifndef _ELLIPSEBY_H_ #define _ELLIPSEBY_H_ #include cocos2d.h USING_NS_CC; #define PI 3.14159 //椭圆的参数信息 struct EllipseConfig { //椭圆a的长度 float ellipseA; //椭圆b的长度 float ellipseB; //椭圆的中心坐标 Vec2 cenPos; //是否逆时针旋转 bool isAntiClockwise; //目标开始旋转的位置,默认位置是在椭圆长轴右方,即值为0 float startAngle; //目标自身的角度 float selfAngle; }; class EllipseBy : public ActionInterval { public: EllipseBy(); ~EllipseBy(); //初始化函数,参数t为持续时间,config为椭圆参数 static EllipseBy * create(float t,const EllipseConfig & config); bool initWithDuration(float t,const EllipseConfig & config); //每帧更新当前椭圆坐标 virtual void update(float time) override; //在动作开始前调用 virtual void startWithTarget(Node *target) override; //动作的拷贝 virtual EllipseBy * clone() const override; //动作的逆序 virtual EllipseBy * reverse() const override; protected: //获得椭圆上当前点坐标 inline Vec2 & getPosWithEllipse(float t) { float angle = 2 * PI * ((m_config.isAntiClockwise ? t : (1 - t)) + m_config.startAngle / 360); return Vec2(m_config.ellipseA * cos(angle),m_config.ellipseB * sin(angle)); } private: EllipseConfig m_config; }; #endif
我们定义了一个椭圆参数的结构体EllipseConfig,前面4个比较好理解,后面2个:startAngle是开始旋转粒子出现的位置,值为角度值。比如下面例图所示:
selfAngle是指把整个椭圆当成一个整体,这个整体的角度,类似于精灵的rotation属性。比如下面例图所示:
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>
您可能感兴趣的文章
- symbian UI开发小结(一)
- UIViewController的retainCount(Object C)
- 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之
- quick-cocos2d-x教程12:实现文本和密码输入界面
- Cocos2d-x3.0游戏实例之《别救我》第八篇——TiledMap实现关卡编
- cocos2d-x在mac下配置安卓开发环境
- 五 手游开发神器 cocos2d-x editor 之贴图(TexturePacker)
- cocos2dx V3.2 mac os Xcode6.1 环境配置
- cocos2d-x-3.0 alpha1与C++11练习三:飞镖忍者,如何移动精灵及
- Cocos2d-x3.0 文件处理