首页 > 代码库 > 借助CCAction实现转盘抽奖
借助CCAction实现转盘抽奖
借助cocos2dx自带的CCMoveBY和CCEaseInOut实现目前流行的转盘抽奖效果。
创建一个辅助结点node_projection_,将转盘中被选中的精灵的序号pos与node_projection_的X坐标建立映射关系。当node_projection_执行CCMoveBY时,通过在每帧执行的回调函数roll_update(float dt)去刷新转盘中精灵的状态。而node_projuction_在X轴上的移动的距离决定了转盘最终高亮的位置。
1 void LayerRoll::roll(CCObject* pSender, CCControlEvent event) 2 { 3 4 node_projection_->setPosition(ccp(0, 0)); 5 spr_num_ = 5; 6 roll_index_ =1+ rand() % 5; 7 8 int rount_t = 4; //round_time 周期数 9 roll_unit_l_ = 32; //node_projection移动单元的长度10 int length = roll_unit_l_*spr_num_*rount_t + roll_unit_l_*roll_index_;11 12 CCCallFunc* mend = CCCallFunc::create(this, callfunc_selector(LayerRoll::roll_end));13 CCMoveBy* mov = CCMoveBy::create(4.0f, ccp(length, 0));14 15 CCSequence* seq = CCSequence::create(CCEaseInOut::create(mov,1.5f), mend, NULL); //CCEaseInOut 慢快慢效果16 node_projection_->runAction(seq);17 schedule(schedule_selector(LayerRoll::roll_update));18 19 }20 21 void LayerRoll::roll_end()22 {23 24 unschedule(schedule_selector(LayerRoll::roll_update));25 }26 27 void LayerRoll::roll_update(float dt)28 {29 int pos = node_projection_->getPositionX();30 pos = pos % (roll_unit_l_*spr_num_); 31 pos = pos / roll_unit_l_+1;32 if (pos == 1)33 {34 spr_1_->setScale(0.8f);35 }36 else37 {38 spr_1_->setScale(0.6f);39 }40 if (pos==2)41 {42 spr_2_->setScale(0.8f);43 44 }45 else46 {47 spr_2_->setScale(0.6f);48 49 }50 if (pos==3)51 {52 spr_3_->setScale(0.8f);53 54 }55 else56 {57 spr_3_->setScale(0.6f);58 59 }60 if (pos == 4)61 {62 spr_4_->setScale(0.8f);63 64 }65 else66 {67 spr_4_->setScale(0.6f);68 69 }70 if (pos == 5)71 {72 spr_5_->setScale(0.8f);73 74 }75 else76 {77 spr_5_->setScale(0.6f);78 79 }80 }
这里转盘的格数为5
借助CCAction实现转盘抽奖
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。