借助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 else 37 { 38 spr_1_->setScale(0.6f); 39 } 40 if (pos==2) 41 { 42 spr_2_->setScale(0.8f); 43 44 } 45 else 46 { 47 spr_2_->setScale(0.6f); 48 49 } 50 if (pos==3) 51 { 52 spr_3_->setScale(0.8f); 53 54 } 55 else 56 { 57 spr_3_->setScale(0.6f); 58 59 } 60 if (pos == 4) 61 { 62 spr_4_->setScale(0.8f); 63 64 } 65 else 66 { 67 spr_4_->setScale(0.6f); 68 69 } 70 if (pos == 5) 71 { 72 spr_5_->setScale(0.8f); 73 74 } 75 else 76 { 77 spr_5_->setScale(0.6f); 78 79 } 80 }
这里转盘的格数为5