cocos2d实现SlotMachine(老*虎*机)

实现一个四个转子,每个转子有五个花色的老*虎机。转子的转动实现原理很简单,和背景图无限滚动的原理是一样的:排成列的精灵在屏幕上向上滚动,再通过裁剪结点的裁剪就造成了转子滚动的效果。

 1 void LayerSlotMachine::on_btn_roll(CCObject* pSender, CCControlEvent event)
 2 {
 3     if (!flag_act_)
 4     {
 5         schedule(schedule_selector(XLayerSlotMachine::roll_update));
 6         stop_flag_ = 0;
 7         int target_index;
 8         float mov_dis;
 9
10         target_index = rand() % 5;
11         CCLOG("slot1:%d", target_index);
12         mov_dis = get_mov_dis(target_index, cur_index1_);
13         cur_index1_ = target_index;
14         roll_act_start(array_1_, mov_dis);
15
16         target_index = rand() % 5;
17         CCLOG("slot2:%d", target_index);
18         mov_dis = get_mov_dis(target_index, cur_index2_);
19         cur_index2_ = target_index;
20         roll_act_start(array_2_, mov_dis);
21
22         target_index = rand() % 5;
23         CCLOG("slot3:%d", target_index);
24         mov_dis = get_mov_dis(target_index, cur_index3_);
25         cur_index3_ = target_index;
26         roll_act_start(array_3_, mov_dis);
27
28         target_index = rand() % 5;
29         CCLOG("slot4:%d", target_index);
30         mov_dis = get_mov_dis(target_index, cur_index4_);
31         cur_index4_ = target_index;
32         roll_act_start(array_4_, mov_dis);
33
34         flag_act_ = true;
35     }
36 }
37
38 void LayerSlotMachine::roll_act_start(CCArray* aray,float mov_dis)
39 {
40     CCObject* obj;
41     CCARRAY_FOREACH(aray, obj)
42     {
43         CCCallFunc* act_end = CCCallFunc::create(this, callfunc_selector(XLayerSlotMachine::roll_act_end));
44         CCSequence* seq1 = CCSequence::create(CCMoveBy::create(mov_dis/rotate_v_, ccp(0, mov_dis))
45             , act_end
46             , NULL);
47         CCSprite* spr = (CCSprite*)obj;
48         spr->runAction(seq1);
49     }
50 }
51
52 void LayerSlotMachine::roll_update(float dt)
53 {
54     roll_bound_test(array_1_,node_slot_1_, 1);
55     roll_bound_test(array_2_,node_slot_2_, 2);
56     roll_bound_test(array_3_,node_slot_3_, 3);
57     roll_bound_test(array_4_,node_slot_4_, 4);
58 }
59
60 void LayerSlotMachine::roll_act_end()
61 {
62     ++stop_flag_;
63     if (stop_flag_==slot_length_*4)
64     {
65         flag_act_ = false;
66         unschedule(schedule_selector(XLayerSlotMachine::roll_update));
67     }
68 }

需要注意的问题有两个:

(1)移动距离的计算

    

 1 float LayerSlotMachine::get_mov_dis(int target_index, int cur_index)
 2 {
 3     float mov_dis;
 4     float slot_height = spr_model_->getContentSize().height;
 5     int T = 7;
 6     if (target_index > cur_index)
 7     {
 8         mov_dis = slot_height*(slot_length_*T + (target_index - cur_index));
 9     }
10     else
11     {
12         mov_dis = slot_height*(slot_length_*T + (slot_length_ - (cur_index - target_index)));
13     }
14     return mov_dis;
15 }

T:周期数

slot_height:转子的高度

slot_length:单个转子上花色的数量,本例是5

target_index:目标位置

cur_index:当前位置

这里对移动距离分两种情况计算:当target_index>cur_index时,在当前周期就能移动到指定的位置,需要移动的格数为(target_index - cur_index);

当target_index<cur_index时,由于转子只能向上滚动,所以要在下个周期才能达到指定的位置,需要移动的格数为

((slot_length_ - (cur_index - target_index)))。

(2)转子滚动的处理

 1 void LayerSlotMachine::roll_bound_test(CCArray* arry,CCNode* node_slot, int slot_num)
 2 {
 3     CCObject* obj;
 4     float bound_y = spr_model_->getContentSize().height*(slot_length_ - 2);
 5
 6     CCARRAY_FOREACH(arry, obj)
 7     {
 8         CCSprite* spr = (CCSprite*)obj;
 9
10         if (spr->getPositionY() > bound_y)
11         {
12             if (spr->getTag() - 1000*slot_num == 0)
13             {
14                 CCSprite* spr0 = (CCSprite*)node_slot->getChildByTag(1000*slot_num + slot_length_ - 1);
15                 spr->setPositionY(spr0->getPositionY() - spr_model_->getContentSize().height);
16             }
17             else
18             {
19                 CCSprite* spr0 = (CCSprite*)node_slot->getChildByTag(spr->getTag() - 1);
20                 spr->setPositionY(spr0->getPositionY() - spr_model_->getContentSize().height);
21             }
22         }
23     }
24 }

当精灵位置高于边界高度boundY时,将精灵移到上一个精灵的下方,实现循环滚动。这里需要特别注意应该以上一个精灵的位置作为基准,否则会产生偏移。

时间: 2025-01-08 10:54:05

cocos2d实现SlotMachine(老*虎*机)的相关文章

iOS 数字滚动 类似于老 - 虎- 机的效果

效果图 具体实现代码如下 ZCWScrollNumView.h文件 #import <UIKit/UIKit.h> typedef enum { ZCWScrollNumAnimationTypeNone, ZCWScrollNumAnimationTypeNormal, ZCWScrollNumAnimationTypeFromLast, ZCWScrollNumAnimationTypeRand, ZCWScrollNumAnimationTypeFast } ZCWScrollNumAn

如何让老Mac机支持USB安装Windows

一些老Mac机的用户想装Windows,却发现自己的系统上的Boot Camp Assistant(以下简称BCA)没有USB安装Windows的选项. 下面以我的MacBook Pro (13-inch, Late 2011), OS X EI Capitan为例,让BCA支持USB安装Windows. 0.打开“/Applications/Utilities/System Information.app”,记下“Model Identifier”和“Boot ROM Version”的值(我

老Mac机安装新版High Sierra遇到的问题

This volume is not formatted as Mac OS Extended (Journaled)High Sierra建议用APFS格式,可是把机器格式化后,安装OS的时候不断出现这个提示,查询后发现要格式化成Mac OS Extended (Journaled)才行,估计是老Mac机不是SSD盘所以不支持这种新格式. This copy of the Install macOS High Sierra.app application is damaged and can'

安装win10创建本地账户跳过登录Microsoft账户的妙招

如果win7或者win8用户想要升级win10系统的话,在安装过程的最后一个步骤就是要求登录Microsoft账户(微软在线账号),同时页面并没有提供明显的切换到本地账户的链接.那么怎么跳过登录Microsoft账户,转而创建一个本地账户登录的方法. 1.在登录你的Microsoft账户这一界面,点击"创建一个新账户". Microsoft账户 2.在注册Outlook邮箱这一界面,点击下方的"不使用Microsoft账户登录". 创建 3.然后就会跳到本地账户创建

Win10“此电脑”无法显示磁盘容量的解决方法

正常情况,用户打开Windows10系统"此电脑"后,都会直接看到磁盘容量.不过,最近有的朋友反馈"此电脑"只有图标没有显示可用空间,容量等信息,这该怎么办呢?下面,就随系统城小编看看Win10"此电脑"无法显示磁盘容量的解决方法. 具体如下: 原因是用户选择错误的查看方式,其实只要更改查看方式为"平铺"就可以了,如下图: 容量显示又回来了. 以上就是老 虎机系统城小编为大家介绍的Win10"此电脑"无法显

Win10 Mobile一周年更新正式版上手:信息支持滑动删除和同步

9月28日消息,微软今天正式开启了Win10 Mobile一周年更新正式版系统更新推送,本文为外媒带来的一周年更新正式版上手演示,主要介绍了信息应用的相关改动. 预览版用户在之前已经体验到了相关功能,本文主要针对没有加入预览计划的的WP用户. 首先信息应用的深色背景由灰色改为了黑色,使用老 虎机屏幕的WP手机用户感觉会更舒服一些. 其次现在信息应用支持左滑删除,而且删除后在短时间内会弹出一个撤销按钮,此外,用户仍然可以长按信息然后在弹出的选项中选择删除. 用户在登录微软账号后可以选择同步自己的信

跑马灯抽奖,本地图片简单实现

公司要做个抽奖功能,写了两个demo,这个是使用本地图片的跑马灯抽奖.加载的本地图片,这种的比较简单.想“跑”起来原理也很简单.      一个是控制好线程sleep时间,sleep时做图片的变换,变换指的就是用滚动的图片依次替换下一个图片.      再一个就是图片的定位,这个根据当前图片位置就可以精确计算了,比用WheelView做的老\虎\机容易定位.      我还添加了SoundPool 让每次变动都有一个声音,这样更像游戏. 注意额:跑马灯还可以做成网络图片版本,稍微复杂一点,处理好

微软宣布Win10 UWP核心代码可在OS X/Linux上运行

9月30日消息,微软近日宣布,运行Edge浏览器和UWP应用的Chakra JavaScript引擎的核心ChakraCore已经能够在部分OS X和Linux系统版本中运行. 此前微软推出ChakraCore开源计划,该计划能够帮助开发者更加容易地开发跨平台应用,这也是老 虎 机为丰富自己UWP平台应用所做的努力.微软在官方博客中表示,“JavaScript Runtime(JSRT) API原本是为Windows设计,作为跨平台支持计划的一部分,我们重新设计了API,开发者可以借此开发跨平台

告别适配器:微软推Win10 Xbox Wireless平台

9月28日消息,喜欢玩游戏的网友都知道,要想在Windows PC平台上用Xbox手柄玩游戏的话,都需要使用一个无线适配器,现在微软计划推出一个Xbox Wireless平台,从此以后就不再需要适配器了. 微软的做法是将Xbox Wireless无线平台内置到游戏PC中,而老 虎机IdeaCentre Y710 Cube则成为了首款支持该平台的电脑,具体来说就是该电脑无需额外的适配器或设备,便可直接兼容所有的Xbox One无线配件.微软表示,在不久之后,将会有更多品牌的电脑及配件支持Xbox